テーマでのOOPの使用


36

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

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

WTF?これを行う意味は何ですか?明らかに、同じテーマの複数のインスタンスを同時に使用することはありません。

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

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


5
@Ambitious Amoeba-名前空間の衝突を最小限にするためにプラグインのクラスを使用するのがおかしいと思う理由を説明できますか?テーマに関しては、テーマの良いコードと思われるものと不要であると考えているものの例を挙げることができれば役立つかもしれません。要約でこれを議論しても、あなたや他の人、特にあなたが言及していることに精通していない人にとっては、洞察を得ることができないでしょう。
MikeSchinkel

1
個人的にはクラスを使用しますが、メンテナンス、更新、再利用がずっと簡単です。個人的な好みはさておき、クラスを使用する理由は何ですか?
t31os

1
奇数、元のコメントを失いました(SEバグかもしれません)。しかし、繰り返しますが、クラスを使用しない理由は何ですか?
t31os

2
@MikeSchinkel:関数名にプレフィックスを追加することでそれを行うことができます。素敵な関数名を持っているだけでは、余分なクラスのオーバーヘッドの価値はないと思います。とにかく、私は、プラグインについてはそれほどではないテーマがこれを行う理由について好奇心が強い
onetrickpony

4
@Ambitious Amoeba-あなたにはあなたの意見に対する権利があると断言しますが、私の意見は異なります。グローバルな名前空間に浮かぶ関数を最小化することでクラスがコードにもたらす明快さは、特にPhpStormのようなプロフェッショナルレベルのIDEを使用している場合、効果的に計り知れないほどの追加オーバーヘッドであると信じています。また、クラスは自己完結型ユニットを作成するため、開発者はモジュールに必要なコードを知ることができます。そして最後に、WordPressプラグインのスタイルを進化させてクラスを使用した後、他のメソッドはだらしないコーディングのように感じます。
MikeSchinkel

回答:


26

あなたが提供した例に基づいてあなたの混乱を理解できます。それはクラスを使用する本当に悪い方法です...そしてクラスが使用されているという理由だけで、システムのOOPを作成しません。

Hybridの場合、クラスを使用して関数の名前空間を指定しているだけです。ハイブリッドがテーマフレームワークであると考えると、開発者が名前の衝突を心配することなく、子テーマが関数名を再利用できるようになります。多くの場合、テーマフレームワーク(親テーマ)は非常に複雑であるため、多くの子テーマ開発者は内部で何が起こっているかを正確に理解することはありません。

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

質問に答える

WTF?これを行う意味は何ですか?明らかに、同じテーマの複数のインスタンスを同時に使用することはありません。

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

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

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

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

一方では、テーマ開発者はクラスベースのアプローチを選択して機能の名前空間を決定する場合があります(同じコードのチャンクを何度も再利用する環境で作業するのはばかげていません)。一方、テーマ開発者は、子テーマで簡単に拡張できるようにクラスベースのアプローチを選択できます。

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

サイトでハイブリッドのみを使用している場合、エンドユーザーとしての利点を知ることはほとんどありません。Hybridの子テーマを構築している場合、名前空間と拡張性の利点があります。ThemeHybridで働いている場合、他のプロジェクト(Prototype、Leviathanなど)でのコードの迅速かつ効率的な再利用に利点があります。

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


「拡張性」の部分には同意しません。アクションと通常の機能を使用した場合と同じように、親テーマを同じレベルで制御できます。どうして?あなたはそれを自分で言った、これは本当のOOPではありません。私は名前空間にも同意しません-これが私が最初にこの質問を始めた理由です-プラグインでHybridから関数を再定義してみてください。関数が衝突することがわかります。なぜ彼らはまだプレフィックスを追加したと思いますか?あなただけのクラスで全体のテーマをラップすることはできません:)、それだけ...どんな意味がありません
onetrickpony

反対に、一部の人々が理解しているかもしれないように、テーマでOOPを使用しないと言っているのではありません(2.8ウィジェット(歩行者など)を参照)。
onetrickpony

1
テーマでOOPを使用したり、テーマで定義された関数の名前空間にクラスを使用したりするのではなく、Hybridの特定の実装に問題があるようです。私はあなたのより広範な質問に答えようとしていますre:なぜこれを行うのですか?re:これを行うことの利点は何ですか?私は、中途半端な実装と思われるものを擁護したり、特定のテーマフレームワークの構造に対するあなたの明らかな敵意に反して議論したりすることはありません。要するに、Hybridの構築方法が気に入らない場合は、別のものを使用してください。
EAMann

1
まったく違いますが、私はハイブリッドが好きです(もちろん、クラスのものは好きではありません)。ハイブリッドは私に独自のテーマフレームワークを作成するように促しました。別の例、Suffusion、同じタイプの練習を取ります。繰り返しますが、この場合の名前空間はテーマでは機能しません。ラッパークラス内のすべての関数は、プラグインがテーマ「内」でWPによってロードされるため、常にプラグインと競合します。
onetrickpony

1
けっこうだ。WPのほとんどの作業はOOPではない(WPはそうではないため)ことを念頭に置いてください。ただし、プラグインでの処理方法を模倣するためにクラスにテーマメソッドを配置することは、少なくとも右側のステップです。方向...たとえそれが中途半端で実装が不十分なクラスであっても。クラス内のすべてをラップして手続き的に呼び出すことは少し奇妙です(そして、システムを使用しようとするサードパーティの開発者のPOVからは役に立ちません)。しかし、正しく行われた場合(およびハイブリッドでは明らかにそうではない)、コードをクラス分けするfunctions.phpことは非常に強力です。
EAMann

29

速度

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

狭いスコープ

グローバル変数が必要になることはめったにありません。コードが知る必要のあるすべてがクラスメンバに隠されているからです。だから、貧弱に書かれたプラグインと衝突するリスクなしに、2つの非常に異なるフィルターまたはアクション間で変数を共有することができます。

メンテナンス

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

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

do_action( 'load_comment_class' );
comment_form();

どのコメントクラスを読み込むかによって、コントローラーが決まります。コメントクラス内で正確に何が起こるかが個々のクラスを決定します。

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

読みやすさ

タスクによってすべてを分離した場合、数か月後に独自のコードを読み直して理解するのが非常に簡単になります。

便利なクラス階層の例

  • Meta_Box->拡張するShortdesc_Meta_BoxおよびSimple_Checkbox_Meta_Box->拡張するSidebar_Switch
  • User_Profile_Addon->拡張User_Profile_Checkbox質問3255を参照)
  • Comment_Form ->拡張 {$theme_name}_Comment_Form

1
「テーマ」クラスを取得する機会はありますか?私は自分で書きたいのですが、あなたがそれをどうやってやるのか知りたいです。
Horttcore

1
私はまだこれを決めていません。来年、@ bueltgeと一緒にこれらのクラスのいくつかを使用する新しいベーステーマを実現するかもしれません。おそらく行進前ではないだろう、私は恐れている。
fuxia

5
特にあなたのケース、無料のテーマ、フレームワークの場合、OOPが最適です。他の人はこれらのコードを使用する必要があります。著者は、このプロセスをできるだけ簡単かつ柔軟にする必要があります。よく書かれたクラスにはAPIが明確に定義されているため、クラスの置換は20個の関数の置換よりも簡単です。
fuxia

2
ハイブリッドについては何も言えません。私はそれを使ったことがない。しかし、はい、カーテンの後ろにすべてのものを整理し、コントローラ、申し出良いフィルタと挿入いくつかの一般的なテーマの混乱へのMVCパターンは、 - A良いことです。私を信用しないでください。それを試してみてください。:)
fuxia

3
WordPressには開発者向けのOOPテーマが必要です。私たちが私たちの目標のために働く時間を無駄にすることを願っています。ここでのこの小さな抜粋と利点は、顧客のテーマに対するoopの大きな可能性を示しています。メンテナンスにも最適な新しいテーマをすばやく実現する方法。
-bueltge

3

考慮すべき別のポイント:速度。

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

ちょっと見て/プリントアウトした後、私は〜1.700の内部機能と〜1.400のユーザー機能= 〜3.100 / 3.200機能VSを見つけました。〜250クラス。これは、ルックアップに必要な量について最も多くを示していると思います。!function_exists('')テーマで約50〜100個の関数を呼び出す場合は、タイマーを1つ設定してから数学を開始します。OOPでなくても、コードを作成するのに良い方法です

1)再利用可能
2)保守可能
3)交換可能
4)少し速く

メタボックスやウィジェットなどを高速に実行するのに役立つ、Webに散らばるさまざまなクラスを見るときは、@ toschoのようなコントローラーを使用することをお勧めします。クラスを処理するコントローラーのいくつかの行。


2

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

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

著者は、静的関数のコンテナとしてではなく、構造体としてクラス/オブジェクトを使用することについて語っていますが、OOPキャンプの真っすぐ外にいる人からの質問に対するまったく異なる見解を読むことは興味深いです。

Haskellで次のWordPressプラグインを作成できます。


1
残念ながら、「招待された」ユーザーのみに公開されているブログ。無料サービスに情報を投稿しないで、代わりに独自のブログをホストする必要がある理由を思い出してください。この点でFacebookはほぼ同じです。更新されたリソースリンクがあれば便利です。FWIW OOPのダークサイドを見てきましたが、コンテキスト内で絶対に必要な場合を除き、高次関数は通常機能を拡張し、定型句とclassキーワードの誤用を減らすのに役立つため、二度と使用しません。
ジョシュハブダス

2

ああ、かなり議論!私は、カプセル化にクラスを使用する頻度がはるかに高いことも認めなければなりません。私のプラグインでは、関数をクラスにラップすることができ、そのクラス内では、他のプラグインの中でも一般的である非常にシンプルで意味のあるメソッド名を使用します。その場合、クラスは名前空間の代わりになります。これは、5.2.x環境では避ける必要があります。

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

しかし、ほとんどの場合、クラスラッピングは名前空間の代わりにすぎません。


-4

あなたが書いていないコードについて不満を言うのは何ですか?

コードが気に入らない場合は、独自に記述してください!

シンプル。問題が解決しました。

プログラマーは自分のやり方でやりたいと思っています。ですから、コードの書き方、飲むウイスキーの種類、喫煙するタバコのブランド、または従うべき宗教を伝えることができると思い込まないでください。彼らはそのようなdiatribeをデバッグし、彼らが望むことを正しく行い続けます。;-)

コードは詩ではありません。コードは、シナトラの曲「My Way」のバリエーションです...


10
この質問はコードについて不平を言っているのではなくコードが特定の方法で記述される理由を明確に説明するよう求めています。WPコアの多くは手続き型であり、OOPアプローチを使用するいくつかの新しい機能があります。最新のプラグインの多くは、OOPを使用して機能をカプセル化します。しかし、ほとんどのテーマはそうではありません。OPは、疑似OOPアプローチを使用する理由を尋ね、ハイブリッドを例として挙げました。あなたは質問に答えているのではなく、暴言を言っています。
EAMann
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.