web-dev-qa-db-ja.com

を使う OOP テーマで

本当に必要ないときは、オブジェクト指向コーディングを利用するプラグインがたくさんあります。

しかしさらに悪いのは、テーマ開発者が同じことをし始めているということです。 Suffusionのような商用のテーマや無料の人気テーマ、さらには私のお気に入りのテーマ - Hybridは、すべての機能をクラス内にまとめ、functions.phpにインスタンス化して手続き的な方法で実行します。

WTF?これをすることのポイントは何ですか?明らかに、同じテーマの2つ以上のインスタンスを同時に使用することはありません。

プラグインが(ばかげている)名前空間のためにこれをすると仮定しましょう、しかしテーマの言い訳は何ですか?私は何かが足りないのですか?

このようなテーマをコーディングする利点は何ですか?

35
onetrickpony

あなたが提供した例に基づいてあなたの混乱を理解することができます。これはクラスを使うための本当に悪い方法です…そしてクラスが使われるからといってシステムOOPにはなりません。

Hybridの場合、彼らは単にクラスを使って自分の関数に名前を付けています。 Hybridがtheme framework であることを考えると、これは、開発者が名前の衝突について心配することなく子テーマが関数名を再利用できるようにするために行われます。多くの場合、テーマフレームワーク(親テーマ)は非常に複雑で、多くの子テーマ開発者はフードの下で何が起こっているのか正確に理解することは決してありません。

Hybridがクラス構造を使用しなかった場合、子テーマ開発者は、名前の再利用を避けるために、既存のすべての関数呼び出しが何であるかを知る必要があります。もちろん、すべての関数の前に独自のスラグを付けることもできますが、同じ機能を利用したいシステムをさらに開発した場合、コードが読みにくくなり、保守が難しくなり、本質的に再利用できなくなります。

あなたの質問に答えるために

WTF?これをすることのポイントは何ですか?明らかに、同じテーマの2つ以上のインスタンスを同時に使用することはありません。

いいえ、同じテーマのインスタンスを複数使用することはありません。しかし、私が言ったように、この場合のクラス構造は、伝統的なオブジェクトインスタンスを作成するのではなく、 名前空間 関数と考えてください。クラス内のすべてをひとまとめにして、メソッドを呼び出す(myClass->method();)か直接メソッドを呼び出す(myClass::method();)かのいずれかをインスタンス化することは、読みやすく再利用可能な方法で名前を付けるための非常にきれいな方法です。

もちろんmyClass_method();のようなものを代わりに使うこともできますが、他のテーマやプラグイン、あるいは他のフレームワークでこのコードを再利用したい場合は、戻ってすべての接頭辞を変更する必要があります。クラス内のすべてのものを保持することは、よりクリーンであり、再開発および再展開をより迅速に行うことができます。

プラグインが(ばかげている)名前空間のためにこれをすると仮定しましょう、しかしテーマの言い訳は何ですか?私は何かが足りないのですか?

ほとんどの場合、私はあなたに同意します。しかし、その大多数は急速に衰退しています。同じテーマのバリエーションを使用するMultiSiteインストールで複数のサイトをホストします。少し異なる点を除いて同じテーマを何度も何度も作成し直すのではなく、親テーマ用に1つの「クラス」を作成し、すべての子テーマでそのクラスを拡張します。これにより、ネットワーク全体で統一感を維持しながら、各サイトのカスタム機能を定義できます。

一方では、テーマ開発者はそれらの機能を名前空間付けするためにクラスベースのアプローチを選ぶかもしれません(あなたが何度も何度も同じコードの塊を再利用する環境で働いているならばばかげないではありません)。一方、テーマ開発者は、子テーマによる拡張性を容易にするためにクラスベースのアプローチを選択する場合があります。

このようなテーマをコーディングする利点は何ですか?

あなたがあなたのサイトでハイブリッドだけを使っているのであれば、エンドユーザーとしてあなたにとって利点を知ることはほとんどありません。 Hybridの子テーマを作成している場合は、名前空間と拡張性から利点があります。 ThemeHybrid で作業している場合、利点は他のプロジェクト(Prototype、Leviathanなど)ですばやく効率的にコードを再利用できることです。

そしてもしあなたがハイブリッドの特定の機能を好むがテーマ全体ではないテーマ開発者であれば、その利点はあなたの非ハイブリッドプロジェクトでの迅速で効率的なコード再利用にある(それがGPLであると仮定して)。

26
EAMann

速度

私の現在のベーステーマは13のクラスがあります。新しいテーマを作成するときは、これらのクラスをそのまま使用するか、またはそれらを拡張します。そのシステムは新しいテーマを構築するプロセスを非常に速くします。

タイトスコープ

私のコードが知るべきことはすべてクラスメンバーの中に隠されているので、私はグローバル変数を必要としません。ですから、よく書かれていないプラグインと衝突する危険性なしに、2つのまったく異なるフィルターやアクションの間で変数を共有することができます。

メンテナンス

各クラスは1つのファイルです。クライアントのテーマを更新する必要がある場合は、ファイルをいくつか更新するだけです。同じAPIを提供している限り、クラス内で起こることは何でも私の責任です。

例:comment_form();呼び出しの上で、私は簡単なアクションを使います:

do_action( 'load_comment_class' );
comment_form();

whichがロードされるコメントクラスが私のコントローラを決定します。正確にが発生するcommentクラスの中の個々のクラスを決定します。

純粋な手続き的アプローチでこれを試してみてください。 :)

読みやすさ

タスクによってすべてを分けていれば、再読込みや理解した数ヶ月後の自分のコードの理解がはるかに簡単になります)。

便利なクラス階層の例

  • Meta_Box - > Shortdesc_Meta_BoxおよびSimple_Checkbox_Meta_Boxによって拡張 - > Sidebar_Switchによって拡張
  • User_Profile_Addon - > User_Profile_Checkboxによって拡張されました( 質問3255 を参照)
  • Comment_Form - > {$theme_name}_Comment_Formによって拡張
29
fuxia

考慮すべきもう1つのポイント:スピード。

if ( !class_exists('cccYourClassName') )  
// VERSUS  
if ( !function_exists('ccc_your_function_name') )

手短に見て/印刷した後、私は〜1.700の内部機能と〜1.400のユーザー機能=〜3.100/3.200の機能VSを見つけました。 〜250クラス私はこれがルックアップがどれくらい必要であるかについて最も多くを言うと思います。テーマの50〜100個の関数について!function_exists('')を要求した場合は、1つのタイマーを設定してから数学を始めます。 OOPでなくても、コードを作成するのに良い方法です。

1)再利用可能
2)メンテナンス可能
3)交換可能
4)もう少し早く

メタボックスやウィジェットなどをすばやく作成するのに役立つ、Web上に浮かぶさまざまなクラスを見るときは、@ toschoのようなコントローラを使用するのが良いでしょう。クラスを処理するコントローラ内のいくつかの行.

3
kaiser

カプセル化はOOPが提供する唯一の(または少なくとも主要な)利点であり、継承と状態は退屈と悪の中間にあると主張する人もいます。

http://obiecte.blogspot.com/2008/09/oop-sucks.html

作者はクラスやオブジェクトを静的関数のコンテナとしてではなく構造体として使うことについてもっと話していますが、OOPキャンプのすぐ外にいる人とはまったく別の質問を読んで興味深いです。

私の次のWordPressプラグインをHaskellで書くかもしれません。

2
Tex

ああかなり議論!私はカプセル化のためにクラスを使うことがはるかに多くないことも同様に認めなければなりません。私のプラグインの中で私は自分の関数をクラスの中にラップでき、そのクラスの中で私が書いた他のプラグインの中でも一般的な非常に単純で意味のあるメソッド名を使うことができます。その場合、名前空間の代わりにクラスが使用されます。これは5.2.x環境では避けなければならないものです。

OOPがモジュール化に役立つことはほとんどありませんが、関数をラップするという単純な行為も、クロスプラグインの拡張性という追加のボーナスを生み出します。たとえば、最近、クラスベースの請求書発行ソリューションを拡張しました。そのため、拡張プラグインを内部化せずに、メインクラスを拡張したり、さまざまな機能にコードを追加したりできます。

ただし、ほとんどの場合、クラスの折り返しは名前空間の代わりになります。

2
Jester831