Welche Entwurfsmuster finden sich in prominenten Modulen?

10

Gibt es neben der Präsentations-Abstraktions-Kontrolle und anderen Mustern , die im Drupal-Kern verwendet werden , noch andere Entwurfsmuster, die in den populäreren Modulen wie Ansichten, CCK und Funktionen prominent verwendet werden ?

Matt V.
quelle
2
In der FAQ heißt es: "Sie sollten nur praktische, beantwortbare Fragen stellen, die auf tatsächlichen Problemen basieren, mit denen Sie konfrontiert sind. Geschwätzige, offene Fragen beeinträchtigen den Nutzen unserer Website und verdrängen andere Fragen von der Titelseite."
Kiamlaluno
1
Dies könnte jedoch ein gutes Community-Wiki-Thema sein
Chaulky
Das Community-Wiki wird nicht mehr für Fragen verwendet, die nicht akzeptabel oder grenzwertig sind. Siehe Die Zukunft des Community-Wikis .
Kiamlaluno
2
Auf der anderen Seite halte ich das für ein interessantes Thema. Vorschlag für eine bessere Frage: "Gibt es ein Entwurfsmuster, das Problem X lösen kann?". Da Designmuster dazu dienen, ein Problem zu lösen, sollten sie nicht nur verwendet werden, damit sie verwendet werden.
Berdir
1
@kiamlaluno, ich würde argumentieren, dass die Frage nicht unbeantwortbar, gesprächig oder unpraktisch ist, obwohl sie möglicherweise offen ist. Mein Zweck beim Stellen der Frage ist es, ein besseres Gefühl dafür zu bekommen, wie Entwurfsmuster in Code verwendet werden, mit dem ich etwas vertraut bin.
Matt V.

Antworten:

10

Ein Ausgangspunkt ist der Kern selbst und die Muster, die dazu beitragen. - Eine großartige Zusammenfassung von Larry Garfield (Crell) finden Sie in einem Artikel von Drupal Watchdog .

Beobachter, Besucher und guckende Toms

Drupal basiert auf den Zwillingsmustern von Observer und Visitor, nennt sie jedoch nicht beim Namen. Stattdessen nennt es sie Hooks. hook_node_load(), hook_user_login()Und sind so weiter, im Wesentlichen Beobachter auf Knoten und Benutzern. hook_form_alter(), hook_node_view()Und sind so weiter, im Wesentlichen Besucher. Da Drupal nicht zwischen den beiden unterscheidet, könnten einige Haken wohl als beide Muster betrachtet werden, aber das Prinzip ist dasselbe.

Fabriken und Befehle

Es gibt verschiedene Variationen des Factory-Musters, aber alle laufen auf dieselbe Idee hinaus: Ein Objekt, ein Client, fragt ein anderes Objekt, eine Factory, nach einer geeigneten Implementierung einer Logik, aber es ist ihm egal, um welche es sich handelt . Die Entscheidung liegt bei der Fabrik. Betrachten Sie die db_insert()Funktion, deren wichtige Teile unten aufgeführt sind:

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

Die Database::getConnection()Methode ist eine Factory, die ein für diese Site geeignetes Verbindungsobjekt zurückgibt.

Abhängigkeitsinjektion von Doktor Drupal

In Drupal 6 wurde das Menüsystem entkernt und in einen mehrstufigen Prozess umgeschrieben. Wir würden jetzt den gleichen Seitenrückruf wie folgt implementieren:

   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.
     }

In diesem neuen Setup wird der Menü-Router komplexer. Im Gegenzug erhält der Seitenrückruf jedoch den Knoten, von dem er abhängt, an ihn übergeben, dh in ihn injiziert. Das gibt uns eine Reihe von Vorteilen.

Gehen Sie für Broke (r)

Ein gängiger Ansatz ist eine Variation der Idee eines Brokers oder Mediators. In diesem Entwurf fordert ein Objekt keine Informationen direkt von einem anderen Objekt an. Stattdessen bittet es ein Zwischenobjekt, das möglicherweise in das Objekt injiziert wurde, eine solche Anfrage in seinem Namen zu stellen. Während dies immer noch bedeutet, dass das erste Objekt aktiv Informationen anfordern muss, ist es nur eng mit dem Mediatorobjekt verbunden und nicht mit der Vielzahl anderer Objekte, von denen es möglicherweise Informationen anfordern muss. Das heißt, wenn sich diese anderen Systeme ändern, müssen wir nur den Mediator aktualisieren, nicht jedes System, das ihn berührt.

kiamlaluno
quelle