Advertisement
  1. Code
  2. General

Patterndesign: Ein Leitfaden für Anfänger

by
Read Time:12 minsLanguages:

German (Deutsch) translation by Tatsiana Bochkareva (you can also view the original English article)

Haben Sie sich jemals gefragt, was Designmuster sind? In diesem Artikel werde ich Ihnen erklären, warum Designpatterns wichtig sind, und in PHP gibt es einige Beispiele, wann und warum sie verwendet werden sollten.


Was sind Designpatterns?

Entwurfsmuster sind optimierte, wiederverwendbare Lösungen für die Programmierprobleme, die wir jeden Tag benutzen. Ein Entwurfsmuster ist keine Klasse oder Bibliothek, die wir einfach in unser System einbinden können, es ist viel mehr. Es ist eine Vorlage, die in der richtigen Situation implementiert werden muss. Es ist auch nicht sprachspezifisch. Ein gutes Entwurfsmuster muss abhängig von den Fähigkeiten der Sprache in den meisten - wenn nicht in allen - Sprachen implementiert werden können. Jedes Designmuster kann ein zweischneidiges Schwert sein - wenn es an der falschen Stelle implementiert wird, kann es katastrophal sein und viele Probleme für Sie verursachen. Am richtigen Ort zur richtigen Zeit implementiert, kann es jedoch Ihr Retter sein.

Es gibt drei grundlegende Arten von Entwurfsmustern:

  • Struktur-
  • Schaffungs-
  • Verhaltens-

Strukturpattern hat Kontakt zwischen Entitäten, wodurch diese Entitäten leichter zusammenarbeiten können.

Schaffungspatterns bieten Instanziierungsmechanismen, die helfen können, Objekte auf eine der Situation entsprechende Weise zu erstellen.

Verhaltenspatterns werden in der Kommunikation zwischen Entitäten verwendet und erleichtern und flexibler die Kommunikation dieser Entitäten.

Warum sollen wir sie verwenden?

Designpatterns sind im Prinzip gut durchdachte Lösungen für Programmierprobleme. Viele Programmierer sind bereits auf diese Probleme gestoßen und haben diese "Lösungen" verwendet, um sie zu beheben. Wenn Sie auf diese Probleme stoßen, warum sollten Sie eine Lösung neu erstellen, wenn Sie eine bereits bewährte Antwort verwenden können?

Beispiel

Stellen Sie sich vor, Sie haben die Verantwortung erhalten, einen Weg zu finden, um zwei Klassen zusammenzuführen, die je nach Situation zwei verschiedene Dinge tun. Diese beiden Klassen werden vom vorhandenen System an verschiedenen Stellen häufig verwendet, was es schwierig macht, diese beiden Klassen zu entfernen und den vorhandenen Code zu ändern. Um dies hinzuzufügen, müssen Sie zum Ändern des vorhandenen Codes auch jeden geänderten Code testen, da diese Art von Änderungen in einem System, das auf verschiedenen Komponenten basiert, fast immer neue Fehler verursachen. Anstatt dies zu tun, können Sie eine Variation des Strategie- und Adaptermusters implementieren, die diese Arten von Szenarien problemlos handhaben kann.

Ziemlich einfach, oder? Schauen wir uns nun das Strategiemuster genauer an.


Strategiemuster

Das Strategiemuster ist ein Verhaltensentwurfsmuster, mit dem Sie anhand eines bestimmten Kontexts zur Laufzeit entscheiden können, welche Vorgehensweise ein Programm ergreifen soll. Sie kapseln zwei verschiedene Algorithmen in zwei Klassen und entscheiden zur Laufzeit, mit welcher Strategie Sie arbeiten möchten.

In unserem obigen Beispiel basiert die Strategie auf der $context variablen zum Zeitpunkt der Instanziierung der Klasse. Wenn Sie ihm den Kontext für class_one geben, wird class_one verwendet und umgekehrt.

Süß, aber wo kann ich das verwenden?

Stellen Sie sich vor, Sie entwickeln gerade eine Klasse, die entweder einen neuen Benutzerdatensatz aktualisieren oder erstellen kann. Es benötigt immer noch die gleichen Eingaben (Name, Adresse, Handynummer usw.), muss jedoch je nach Situation beim Aktualisieren und Erstellen unterschiedliche Funktionen verwenden. Jetzt könnten Sie nur ein Wenn-Sonst verwenden, um dies zu erreichen. Was ist jedoch, wenn Sie diese Klasse an einem anderen Ort verwenden müssen? In diesem Fall müssen Sie dieselbe if-else-Anweisung erneut schreiben. Wäre es nicht einfacher, nur Ihren Kontext anzugeben?

Nun beinhaltet das "übliche" Strategiemuster das Einkapseln Ihrer Algorithmen in eine andere Klasse, aber in diesem Fall wäre eine andere Klasse verschwenderisch. Denken Sie daran, dass Sie der Vorlage nicht genau folgen müssen. Variationen funktionieren, solange das Konzept gleich bleibt, und es löst das Problem.


Adaptermuster

Das Adaptermuster ist ein strukturelles Entwurfsmuster, mit dem Sie eine Klasse mit einer anderen Schnittstelle neu verwenden können, sodass sie von einem System verwendet werden kann, das verschiedene Aufrufmethoden verwendet.

Auf diese Weise können Sie auch einige der von der Client-Klasse empfangenen Eingaben so ändern, dass sie mit den Funktionen des Adaptees kompatibel sind.

Wie kann ich das nutzen?

Ein anderer Begriff, der auf eine Adapterklasse verweist, ist ein Wrapper, mit dem Sie Aktionen in eine Klasse "einschließen" und diese Aktionen in den richtigen Situationen wiederverwenden können. Ein klassisches Beispiel könnte sein, wenn Sie eine Domänenklasse für Tabellenklassen erstellen. Anstatt die verschiedenen Tabellenklassen aufzurufen und ihre Funktionen einzeln aufzurufen, können Sie alle diese Methoden mithilfe einer Adapterklasse in einer Methode kapseln. Auf diese Weise können Sie nicht nur die gewünschte Aktion wiederverwenden, sondern müssen den Code auch nicht neu schreiben, wenn Sie dieselbe Aktion an einem anderen Ort verwenden müssen.

Vergleichen Sie diese beiden Implementierungen.

Nicht-Adapter-Ansatz

Wenn wir dies an einem anderen Ort erneut tun oder diesen Code sogar in einem anderen Projekt wiederverwenden müssten, müssten wir alles erneut eingeben.

Besser

Das ist gegen so etwas:

In dieser Situation haben wir eine Wrapper-Klasse, die unsere Account-Domänenklasse wäre:

Auf diese Weise können Sie Ihre Kontodomäne jederzeit wieder verwenden, und Sie können auch andere Klassen unter Ihre Domänenklasse einbinden.


Factory Method Pattern

Das Factory-Methodenmuster ist ein kreatives Entwurfsmuster, das genau das tut, was es sich anhört: Es ist eine Klasse, die als Factory von Objektinstanzen fungiert.

Das Hauptziel dieses Musters besteht darin, die Erstellungsprozedur, die verschiedene Klassen umfassen kann, in einer einzigen Funktion zusammenzufassen. Durch Angabe des richtigen Kontexts für die Factory-Methode kann das richtige Objekt zurückgegeben werden.

Wann kann ich das benutzen?

Die beste Zeit, um das Factory-Methodenmuster zu verwenden, ist, wenn Sie mehrere verschiedene Variationen einer einzelnen Entität haben. Angenommen, Sie haben eine Schaltflächenklasse. Diese Klasse hat verschiedene Variationen, wie z. B. ImageButton, InputButton und FlashButton. Je nach Ort müssen Sie möglicherweise verschiedene Schaltflächen erstellen. Hier können Sie die Schaltflächen in einer Factory erstellen!

Beginnen wir mit der Erstellung unserer drei Klassen:

Jetzt können wir unsere Fabrikklasse erstellen:

Wir können diesen Code folgendermaßen verwenden:

Die Ausgabe sollte der HTML-Code aller Schaltflächentypen sein. Auf diese Weise können Sie angeben, welche Schaltfläche je nach Situation erstellt werden soll, und die Bedingung ebenfalls wiederverwenden.


Dekorateurmuster

Das Dekorateurmuster ist ein strukturelles Entwurfsmuster, mit dem wir einem Objekt je nach Situation zur Laufzeit neues oder zusätzliches Verhalten hinzufügen können.

Ziel ist es, die erweiterten Funktionen auf eine bestimmte Instanz anzuwenden und gleichzeitig eine ursprüngliche Instanz zu erstellen, die nicht über die neuen Funktionen verfügt. Außerdem können mehrere Dekoratoren für eine Instanz kombiniert werden, sodass Se nicht für jede Instanz an einen Dekorator gebunden sind. Dieses Muster ist eine Alternative zur Unterklasse, bei der eine Klasse erstellt wird, die Funktionen von einer übergeordneten Klasse erbt. Im Gegensatz zu Unterklassen, die das Verhalten zur Kompilierungszeit hinzufügen, können Sie mit "Dekorieren" zur Laufzeit neues Verhalten hinzufügen, wenn die Situation dies erfordert.

Um das Dekorationsmuster zu implementieren, können Sie die folgenden Schritte ausführen:

  1. Unterteilen Sie die ursprüngliche "Component"-Klasse in eine "Decorator"-Klasse
  2. Fügen Sie in der Decorator-Klasse einen Komponentenzeiger als Feld hinzu
  3. Übergeben Sie eine Komponente an den Decorator-Konstruktor, um den Komponentenzeiger zu initialisieren
  4. Leiten Sie in der Decorator-Klasse alle "Component"-Methoden auf den "Component"-Zeiger um, und
  5. Überschreiben Sie in der Decorator-Klasse alle Component-Methoden, deren Verhalten geändert werden muss

Schritte mit freundlicher Genehmigung von http://en.wikipedia.org/wiki/Decorator_pattern

Wann kann ich das benutzen?

Der beste Ort, um das Dekorationsmuster zu verwenden, ist, wenn Sie eine Enttät haben, die nur dann ein neues Verhalten haben muss, wenn die Situation dies erfordert. Angenommen, Sie haben ein HTML-Linkelement, einen Abmeldelink, mit dem Sie basierend auf der aktuellen Seite etwas andere Aktionen ausführen möchten. Dafür können wir das Dekorationsmuster verwenden.

Lassen Sie uns zunächst die verschiedenen "Dekorationen" festlegen, die wir benötigen.

  • Wenn wir uns auf der Startseite befinden und angemeldet sind, muss dieser Link in h2-Tags eingeschlossen werden
  • Wenn wir uns auf einer anderen Seite befinden und angemeldet sind, muss dieser Link in Unterstreichungs-Tags eingeschlossen werden
  • Wenn wir angemeldet sind, lassen Sie diesen Link in starke Tags einschließen

Sobald wir unsere Dekorationen erstellt haben, können wir sie programmieren.

Wir sollten es dann so verwenden können:

Wir können hier sehen, wie wir mehrere Dekorateure kombinieren können, wenn wir sie brauchen. Da alle Dekorateure die magische Funktion __call verwenden, können wir weiterhin die Methoden der ursprünglichen Funktion aufrufen. Wenn wir davon ausgehen, dass wir uns derzeit auf der Startseite befinden und angemeldet sind, sollte die HTML-Ausgabe wie folgt lauten:


Singleton-Muster

Das Singleton-Entwurfsmuster ist ein kreatives Entwurfsmuster, das sicherstellt, dass Sie während der Laufzeit eine einzelne Instanz einer bestimmten Klasse haben, und einen globalen Zugriffspunkt auf die einzelne Instanz bietet.

Dies erleichtert das Einrichten eines "Koordinationspunkts" für andere Objekte, die die Singleton-Instanz ebenfalls verwenden, da die Variablen des Singletons für alle Objekte, die sie aufrufen, immer gleich sind.

Wann kann ich das benutzen?

Wenn Sie eine bestimmte Instanz von einer Klasse an eine andere übergeben müssen, können Sie das Singleton-Muster verwenden, um zu vermeiden, dass die Instanz über einen Konstruktor oder ein Argument übergeben werden muss. Stellen Sie sich vor, Sie haben eine Session-Klasse erstellt, die das globale Array $_SESSION simuliert. Da diese Klasse nur einmal instanziiert werden muss, können wir ein Singleton-Muster wie folgt implementieren:

Auf diese Weise können wir von verschiedenen Teilen unseres Codes aus auf unsere Sitzungsinstanz zugreifen, auch in verschiedenen Klassen. Diese Daten bleiben während aller getInstance-Aufrufe erhalten.


Abschluss

Es gibt viel mehr Entwurfsmuster zu studieren; In diesem Artikel habe ich nur einige der bekanntesten hervorgehoben, die ich beim Programmieren verwende. Wenn Sie mehr über die anderen Entwurfsmuster erfahren möchten, finden Sie auf der Wikipedia-Seite Designpatterns viel Information. Wenn sie nicht ausreicht, können Sie jederzeit Design Patterns: Elements of Reusable Object-Oriented Software lesen, das als eines der besten verfügbaren Design Pattern-Bücher gilt.

Eine letzte Sache: Wenn Sie diese Entwurfsmuster verwenden, stellen Sie immer sicher, dass Sie versuchen, das richtige Problem zu lösen. Wie ich bereits erwähnt habe, handelt es sich bei diesen Entwurfsmustern um ein zweischneidiges Schwert: Wenn sie im falschen Kontext verwendet werden, können sie möglicherweise die Situation verschlimmern. Bei richtiger Anwendung sind sie jedoch unverzichtbar.

Wenn Sie dieses Tutorial nützlich fanden, sehen Sie sich die verschiedenen PHP-Skripte auf Envato Market an. Es gibt Tausende nützlicher Skripte, die Ihre Entwicklung beschleunigen und Ihnen helfen können, bessere Endergebnisse zu erzielen. Hier finden Sie Buchungssysteme, AJAX-Kontaktformulare, Newsletter-Systeme und vieles mehr.

PHP scripts on Envato MarketPHP scripts on Envato MarketPHP scripts on Envato Market
PHP-Skripte auf Envato Market
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.