著名な寄稿モジュールに見られる設計パターンは何ですか?


10

ほかにプレゼンテーション・抽象化・制御および他のパターンされているDrupalのコアに使用される、目立つよりで使用される任意の他のデザインパターンがある人気の貢献モジュールなどのビュー、CCK、および機能などは?


2
で報告されているようによくある質問、「あなただけが直面する現実の問題に基づいて実用的な、釈明質問をする必要があります。おしゃべりは、オープンエンドの質問は、当サイトの有用性を低下させ、フロントページオフ他の質問を押してください。」
kiamlaluno

1
これは良いコミュニティwikiトピックかもしれません
Chaulky

コミュニティWikiは、受け入れられない質問や境界線の質問には使用されなくなりました。The Community of Community Wikiを参照してください。
kiamlaluno

2
反対に、これは興味深いトピックだと思います。より良い質問への提案:「問題Xを解決できる設計パターンはありますか?」それが設計パターンの目的であり、問​​題を解決するため、それらを使用するためだけに使用するべきではありません。
Berdir 2011

1
@kiamlaluno、私はこの質問は答えられない、おしゃべりな、または非実用的ではないと主張しますが、それは間違いなく自由回答であるかもしれません。質問をする私の目的は、私が多少精通しているコードで、デザインパターンがどのように使用されるかをよりよく理解することです。
MattV。

回答:


10

開始する1つの場所は、コア自体とcontribに公開されたパターンです。-Larry Garfield(Crell)による素晴らしい記事は、Drupal Watchdogの記事にあります。

オブザーバー、ビジター、覗きトム

Drupalは、実際にはオブザーバーとビジターのツインパターンに基づいて構築されていますが、名前では呼ばれていません。代わりに、それらをフックと呼びます。hook_node_load()hook_user_login()、などのノードとユーザーのオブザーバーは、本質的に、です。hook_form_alter()hook_node_view()、など、本質的には、訪問者です。Drupalはこの2つを区別しないため、一部のフックは間違いなく両方のパターンと見なすことができますが、原理は同じです。

工場とコマンド

Factoryパターンにはいくつかのバリエーションがありますが、それらはすべて同じアイデアに要約されます。あるオブジェクト(クライアント)は別のオブジェクト(ファクトリー)にロジックの適切な実装を要求しますが、それがどちらであるかは気にしません。それは決定する工場次第です。db_insert()関数を考えてみましょう。その重要なビットを以下に示します。

   function db_insert($table, array $options = array()) {
       // ...
       return Database::getConnection($options['target'])->insert($table, $options);
     }

Database::getConnection()この方法は、このサイトの接続オブジェクトを返します適切な工場です。

ドループ・ドクターのディペンデンシー・インジェクション

Drupal 6では、メニューシステムが骨抜きになり、マルチステッププロセスに書き直されました。次のように、同じページコールバックを実装します。

   function example_menu() {
       $items['node/%node/example'] = array(
         'page callback' => 'example_page',
         'page arguments' => array(1),
         // ...
       );
       return $items;
     }

     function example_page($node) {
       // Do useful stuff here.
     }

この新しいセットアップでは、メニュールーターはより複雑になります。ただし、その代わりに、ページコールバックは、それが渡される依存先のノードを取得します。つまり、ノードに注入されます。これには多くの利点があります。

Broke(r)に行く

一般的なアプローチの1つは、ブローカーまたはメディエーターのアイデアのバリエーションです。この設計では、オブジェクトは別のオブジェクトからの情報を直接要求しません。代わりに、挿入された可能性のある中間オブジェクトに、代わりにそのような要求を行うように要求します。それでも、最初のオブジェクトが積極的に情報を要求する必要があることを意味しますが、メディエーターオブジェクトに密に結合されており、情報を要求する必要のある無数の他のオブジェクトには結合されていません。つまり、これらの他のシステムが変更された場合、メディエーターを更新するだけでよく、それに関係するすべてのシステムを更新する必要はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.