Software-Entwurfsmuster - Software design pattern

In der Softwareentwicklung ist ein Software-Design-Pattern eine allgemeine, wiederverwendbare Lösung für ein häufig auftretendes Problem in einem bestimmten Kontext im Software-Design . Es ist kein fertiges Design, das direkt in Quell- oder Maschinencode umgewandelt werden kann . Es ist vielmehr eine Beschreibung oder Vorlage für die Lösung eines Problems, die in vielen verschiedenen Situationen verwendet werden kann. Entwurfsmuster sind formalisierte Best Practices , die der Programmierer verwenden kann, um allgemeine Probleme beim Entwurf einer Anwendung oder eines Systems zu lösen.

Objektorientierte Entwurfsmuster zeigen typischerweise Beziehungen und Interaktionen zwischen Klassen oder Objekten , ohne die endgültigen Anwendungsklassen oder -objekte anzugeben, die beteiligt sind. Muster, die einen veränderlichen Zustand implizieren, sind möglicherweise für funktionale Programmiersprachen ungeeignet . Einige Muster können in Sprachen überflüssig gemacht werden, die über eine integrierte Unterstützung für die Lösung des Problems verfügen, das sie zu lösen versuchen, und objektorientierte Muster sind nicht unbedingt für nicht objektorientierte Sprachen geeignet.

Entwurfsmuster können als strukturierter Ansatz für die Computerprogrammierung zwischen den Ebenen eines Programmierparadigmas und eines konkreten Algorithmus angesehen werden .

In einer Review-Studie aus dem Jahr 2020 untersuchen Wedyan und Abufakher Designmuster und Softwarequalität und kommen zu dem Schluss: „Unsere Studie hat gezeigt, dass die Primärstudien einen empirischen Beweis für den positiven Effekt der Dokumentation von Designmusterinstanzen auf das Programmverständnis und damit die Wartbarkeit liefern. Dieses Ergebnis überrascht zwar nicht, hat aber zwei Anhaltspunkte: Zum einen sollten Entwickler mehr Aufwand betreiben, um eine solche Dokumentation hinzuzufügen, auch wenn es sich um einfache Kommentare im Quellcode handelt Wirkung der Dokumentation ist zu berücksichtigen."

Geschichte

Patterns entstand als architektonisches Konzept bereits 1977 von Christopher Alexander (vgl. "The Pattern of Streets", JOURNAL OF THE AIP, September 1977, Bd. 32, Nr. 3, S. 273–278). 1987 begannen Kent Beck und Ward Cunningham mit der Idee der Anwendung von Mustern auf die Programmierung – insbesondere von Mustersprachen – zu experimentieren und präsentierten ihre Ergebnisse im selben Jahr auf der OOPSLA- Konferenz. In den folgenden Jahren setzten Beck, Cunningham und andere diese Arbeiten fort.

Design Patterns gewannen in der Informatik an Popularität, nachdem 1994 das Buch Design Patterns: Elements of Reusable Object-Oriented Software von der sogenannten "Gang of Four" (Gamma et al.), die häufig als "GoF" abgekürzt wird, veröffentlicht wurde. Im selben Jahr fand die erste Pattern Languages ​​of Programming Conference statt, und im folgenden Jahr wurde das Portland Pattern Repository zur Dokumentation von Entwurfsmustern eingerichtet. Der Umfang der Laufzeit bleibt umstritten. Bemerkenswerte Bücher im Genre Design Pattern sind:

  • Gamma, Erich ; Helm, Richard ; Johnson, Ralph ; Vlissides, John (1995). Entwurfsmuster: Elemente wiederverwendbarer objektorientierter Software . Addison-Wesley . ISBN 978-0-201-63361-0.
  • Brinch Hansen, Per (1995). Studium der Computational Science: Paradigmen der parallelen Programmierung . Lehrlingssaal. ISBN 978-0-13-439324-7.
  • Buschmann, Frank ; Meunier, Regine; Rohnert, Hans; Sommerlad, Peter (1996). Musterorientierte Softwarearchitektur, Band 1: Ein System von Mustern . John Wiley & Söhne. ISBN 978-0-471-95869-7.
  • Beck, Kent (1997). Smalltalk-Best-Practice-Muster . Lehrlingssaal. ISBN 978-0134769042.
  • Schmidt, Douglas C. ; Stal, Michael; Rohnert, Hans; Buschmann, Frank (2000). Musterorientierte Softwarearchitektur, Band 2: Muster für nebenläufige und vernetzte Objekte . John Wiley & Söhne. ISBN 978-0-471-60695-6.
  • Fowler, Martin (2002). Muster der Unternehmensanwendungsarchitektur . Addison-Wesley . ISBN 978-0-321-12742-6.
  • Höpe, Gregor; Woolf, Bobby (2003). Enterprise-Integrationsmuster: Entwerfen, Erstellen und Bereitstellen von Messaging-Lösungen . Addison-Wesley . ISBN 978-0-321-20068-6.
  • Freeman, Eric T.; Robson, Elisabeth; Bates, Bert; Sierra, Kathy (2004). Von Kopf bis Fuß Designmuster . O'Reilly-Medien . ISBN 978-0-596-00712-6.

Obwohl Design Patterns seit langem praktisch angewendet werden, schmachtete die Formalisierung des Konzepts von Design Patterns mehrere Jahre lang.

Üben

Design Patterns können den Entwicklungsprozess beschleunigen, indem sie getestete, bewährte Entwicklungsparadigmen bereitstellen. Effektives Softwaredesign erfordert die Berücksichtigung von Problemen, die möglicherweise erst später in der Implementierung sichtbar werden. Frisch geschriebener Code kann oft versteckte subtile Probleme haben, die erst nach einiger Zeit erkannt werden können, Probleme, die manchmal später zu größeren Problemen führen können. Die Wiederverwendung von Entwurfsmustern hilft, solche subtilen Probleme zu vermeiden, und verbessert auch die Lesbarkeit des Codes für Programmierer und Architekten, die mit den Mustern vertraut sind.

Um Flexibilität zu erreichen, führen Entwurfsmuster normalerweise zusätzliche Indirektionsebenen ein , die in einigen Fällen die resultierenden Entwürfe komplizieren und die Anwendungsleistung beeinträchtigen können.

Per Definition muss ein Muster in jede Anwendung, die es verwendet, neu programmiert werden. Da einige Autoren dies als einen Rückschritt gegenüber der Wiederverwendung von Software, wie sie von Komponenten bereitgestellt wird , ansehen , haben Forscher daran gearbeitet, Muster in Komponenten umzuwandeln. Meyer und Arnout waren in der Lage, zwei Drittel der Muster, die sie versuchten, vollständig oder teilweise zu komponentisieren.

Software-Entwurfstechniken sind schwierig auf ein breiteres Spektrum von Problemen anzuwenden. Entwurfsmuster bieten allgemeine Lösungen, die in einem Format dokumentiert sind , das keine an ein bestimmtes Problem gebundenen Besonderheiten erfordert.

Struktur

Entwurfsmuster bestehen aus mehreren Abschnitten (siehe § Dokumentation unten). Von besonderem Interesse sind die Abschnitte Struktur, Teilnehmer und Zusammenarbeit. Diese Abschnitte beschreiben ein Designmotiv : eine prototypische Mikroarchitektur , die Entwickler kopieren und an ihre speziellen Designs anpassen, um das wiederkehrende Problem zu lösen, das durch das Designmuster beschrieben wird. Eine Mikroarchitektur ist eine Menge von Programmbestandteilen (zB Klassen, Methoden...) und deren Beziehungen. Entwickler verwenden das Entwurfsmuster, indem sie diese prototypische Mikroarchitektur in ihre Entwürfe einführen, was bedeutet, dass Mikroarchitekturen in ihren Entwürfen eine Struktur und Organisation aufweisen, die dem gewählten Entwurfsmotiv ähnlich sind.

Domänenspezifische Muster

Es wurden auch Anstrengungen unternommen, Entwurfsmuster in bestimmten Domänen zu kodifizieren, einschließlich der Verwendung bestehender Entwurfsmuster sowie domänenspezifischer Entwurfsmuster. Beispiele hierfür sind Entwurfsmuster für Benutzeroberflächen , Informationsvisualisierung , sicheres Design, "sichere Benutzerfreundlichkeit", Webdesign und Geschäftsmodelldesign.

Die jährlichen Protokolle der Pattern Languages ​​of Programming Conference enthalten viele Beispiele für domänenspezifische Muster.

Klassifizierung und Liste

Entwurfsmuster wurden ursprünglich in 3 Unterklassifizierungen kategorisiert, basierend auf der Art von Problem, das sie lösen. Erstellungsmuster bieten die Möglichkeit, Objekte basierend auf einem erforderlichen Kriterium und auf kontrollierte Weise zu erstellen. Bei Strukturmustern geht es darum, verschiedene Klassen und Objekte zu organisieren, um größere Strukturen zu bilden und neue Funktionen bereitzustellen. Schließlich geht es bei Verhaltensmustern darum, gemeinsame Kommunikationsmuster zwischen Objekten zu identifizieren und diese Muster zu realisieren.

Schöpfungsmuster

Name Beschreibung In Designmustern Im Code abgeschlossen Sonstiges
Abstrakte Fabrik Stellen Sie eine Schnittstelle zum Erstellen von Familien verwandter oder abhängiger Objekte bereit, ohne deren konkrete Klassen anzugeben. Jawohl Jawohl N / A
Baumeister Trennen Sie die Konstruktion eines komplexen Objekts von seiner Repräsentation, sodass mit demselben Konstruktionsprozess verschiedene Repräsentationen erstellt werden können. Jawohl Nein N / A
Abhängigkeitsspritze Eine Klasse akzeptiert die von ihr benötigten Objekte von einem Injektor, anstatt die Objekte direkt zu erstellen. Nein Nein N / A
Fabrikmethode Definieren Sie eine Schnittstelle zum Erstellen eines einzelnen Objekts, aber lassen Sie Unterklassen entscheiden, welche Klasse instanziiert werden soll. Mit der Factory-Methode kann eine Klasse die Instanziierung auf Unterklassen verschieben. Jawohl Jawohl N / A
Faule Initialisierung Taktik, die Erstellung eines Objekts, die Berechnung eines Wertes oder einen anderen teuren Prozess bis zum ersten Mal zu verzögern. Dieses Muster erscheint im GoF-Katalog als "virtueller Proxy", eine Implementierungsstrategie für das Proxy- Muster. Nein Nein PoEAA
Multiton Stellen Sie sicher, dass eine Klasse nur über benannte Instanzen verfügt, und stellen Sie einen globalen Zugriffspunkt darauf bereit. Nein Nein N / A
Objektpool Vermeiden Sie teure Anschaffung und Freisetzung von Ressourcen, indem Sie nicht mehr gebrauchte Gegenstände recyceln. Kann als Verallgemeinerung von Verbindungspool- und Threadpoolmustern betrachtet werden. Nein Nein N / A
Prototyp Geben Sie die zu erstellenden Objekttypen mithilfe einer prototypischen Instanz an und erstellen Sie neue Objekte aus dem „Skelett“ eines vorhandenen Objekts, um so die Leistung zu steigern und den Speicherbedarf auf ein Minimum zu reduzieren. Jawohl Nein N / A
Ressourcenbeschaffung ist Initialisierung (RAII) Stellen Sie sicher, dass Ressourcen ordnungsgemäß freigegeben werden, indem Sie sie an die Lebensdauer geeigneter Objekte binden. Nein Nein N / A
Singleton Stellen Sie sicher, dass eine Klasse nur über eine Instanz verfügt, und stellen Sie einen globalen Zugriffspunkt darauf bereit. Jawohl Jawohl N / A

Strukturmuster

Name Beschreibung In Designmustern Im Code abgeschlossen Sonstiges
Adapter , Wrapper oder Übersetzer Konvertieren Sie die Schnittstelle einer Klasse in eine andere Schnittstelle, die Clients erwarten. Ein Adapter lässt Klassen zusammenarbeiten, die aufgrund inkompatibler Schnittstellen sonst nicht möglich wären. Das Pendant zum Enterprise-Integration-Pattern ist der Übersetzer. Jawohl Jawohl N / A
Brücke Entkoppeln Sie eine Abstraktion von ihrer Implementierung, sodass die beiden unabhängig voneinander variieren können. Jawohl Jawohl N / A
Verbundstoff Stellen Sie Objekte in Baumstrukturen zusammen, um Teil-Ganzes-Hierarchien darzustellen. Mit Composite können Kunden einzelne Objekte und Zusammenstellungen von Objekten einheitlich behandeln. Jawohl Jawohl N / A
Dekorateur Fügen Sie einem Objekt zusätzliche Verantwortlichkeiten hinzu, die dynamisch dieselbe Schnittstelle beibehalten. Dekoratoren bieten eine flexible Alternative zur Unterklassenbildung, um die Funktionalität zu erweitern. Jawohl Jawohl N / A
Erweiterungsobjekt Hinzufügen von Funktionen zu einer Hierarchie, ohne die Hierarchie zu ändern. Nein Nein Agile Softwareentwicklung, Prinzipien, Muster und Praktiken
Fassade Stellen Sie eine einheitliche Schnittstelle für eine Reihe von Schnittstellen in einem Subsystem bereit. Facade definiert eine übergeordnete Schnittstelle, die die Bedienung des Subsystems erleichtert. Jawohl Jawohl N / A
Fliegengewicht Verwenden Sie die Freigabe, um eine große Anzahl ähnlicher Objekte effizient zu unterstützen. Jawohl Nein N / A
Front-Controller Das Muster bezieht sich auf das Design von Webanwendungen. Es bietet einen zentralen Einstiegspunkt für die Bearbeitung von Anfragen. Nein Nein

J2EE-Muster PoEAA

Marker Leere Schnittstelle zum Verknüpfen von Metadaten mit einer Klasse. Nein Nein Effektives Java
Modul Gruppieren Sie mehrere verwandte Elemente wie Klassen, Singletons, Methoden, die global verwendet werden, in einer einzigen konzeptionellen Einheit. Nein Nein N / A
Stellvertreter Stellen Sie einen Ersatz oder Platzhalter für ein anderes Objekt bereit, um den Zugriff darauf zu steuern. Jawohl Nein N / A
Zwilling Twin ermöglicht die Modellierung von Mehrfachvererbung in Programmiersprachen, die diese Funktion nicht unterstützen. Nein Nein N / A

Verhaltensmuster

Name Beschreibung In Designmustern Im Code abgeschlossen Sonstiges
Tafel Muster der künstlichen Intelligenz zum Kombinieren unterschiedlicher Datenquellen (siehe Tafelsystem ) Nein Nein N / A
Verantwortungskette Vermeiden Sie es, den Sender einer Anfrage an ihren Empfänger zu koppeln, indem Sie mehr als einem Objekt die Möglichkeit geben, die Anfrage zu bearbeiten. Verketten Sie die empfangenden Objekte und übergeben Sie die Anforderung entlang der Kette, bis ein Objekt sie verarbeitet. Jawohl Nein N / A
Befehl Kapseln Sie eine Anfrage als Objekt, wodurch die Parametrisierung von Clients mit unterschiedlichen Anfragen und das Einreihen oder Protokollieren von Anfragen ermöglicht wird. Es ermöglicht auch die Unterstützung von rückgängig zu machenden Operationen. Jawohl Nein N / A
Dolmetscher Definieren Sie für eine gegebene Sprache eine Darstellung für ihre Grammatik zusammen mit einem Interpreter, der die Darstellung verwendet, um Sätze in der Sprache zu interpretieren. Jawohl Nein N / A
Iterator Bieten Sie eine Möglichkeit, sequenziell auf die Elemente eines Aggregatobjekts zuzugreifen, ohne die zugrunde liegende Darstellung offenzulegen. Jawohl Jawohl N / A
Vermittler Definieren Sie ein Objekt, das die Interaktion einer Reihe von Objekten kapselt. Mediator fördert die lose Kopplung, indem er verhindert, dass Objekte explizit aufeinander Bezug nehmen, und ermöglicht deren Interaktion unabhängig voneinander zu variieren. Jawohl Nein N / A
Erinnerung Ohne die Kapselung zu verletzen, erfassen und externalisieren Sie den internen Zustand eines Objekts, sodass das Objekt später in diesen Zustand zurückversetzt werden kann. Jawohl Nein N / A
Nullobjekt Vermeiden Sie Nullverweise, indem Sie ein Standardobjekt bereitstellen. Nein Nein N / A
Beobachter oder Veröffentlichen/Abonnieren Definieren Sie eine Eins-zu-Viele-Abhängigkeit zwischen Objekten, wobei eine Zustandsänderung in einem Objekt dazu führt, dass alle seine Abhängigkeiten automatisch benachrichtigt und aktualisiert werden. Jawohl Jawohl N / A
Knecht Definieren Sie allgemeine Funktionen für eine Gruppe von Klassen. Das Servant-Muster wird auch häufig als Implementierung einer Hilfsklasse oder einer Dienstprogrammklasse für eine bestimmte Menge von Klassen bezeichnet. Die Hilfsklassen haben im Allgemeinen keine Objekte, daher haben sie alle statischen Methoden, die auf verschiedene Arten von Klassenobjekten wirken. Nein Nein N / A
Spezifikation Rekombinierbare Geschäftslogik auf boolesche Weise. Nein Nein N / A
Bundesland Erlauben Sie einem Objekt, sein Verhalten zu ändern, wenn sich sein interner Zustand ändert. Das Objekt scheint seine Klasse zu ändern. Jawohl Nein N / A
Strategie Definieren Sie eine Familie von Algorithmen, kapseln Sie jeden einzelnen und machen Sie sie austauschbar. Strategy lässt den Algorithmus unabhängig von den Clients variieren, die ihn verwenden. Jawohl Jawohl N / A
Vorlagenmethode Definieren Sie das Skelett eines Algorithmus in einer Operation, indem Sie einige Schritte auf Unterklassen übertragen. Mit der Template-Methode können Unterklassen bestimmte Schritte eines Algorithmus neu definieren, ohne die Struktur des Algorithmus zu ändern. Jawohl Jawohl N / A
Besucher Stellt eine Operation dar, die an den Elementen einer Objektstruktur ausgeführt werden soll. Visitor lässt eine neue Operation definieren, ohne die Klassen der Elemente zu ändern, auf denen sie arbeitet. Jawohl Nein N / A

Parallelitätsmuster

Name Beschreibung In POSA2 Sonstiges
Aktives Objekt Entkoppelt die Methodenausführung von Methodenaufrufen, die sich in ihrem eigenen Steuerungsthread befinden. Das Ziel besteht darin, Parallelität einzuführen, indem asynchrone Methodenaufrufe und ein Scheduler für die Verarbeitung von Anforderungen verwendet werden. Jawohl N / A
Sperren Führen Sie eine Aktion für ein Objekt nur aus, wenn sich das Objekt in einem bestimmten Zustand befindet. Nein N / A
Bindungseigenschaften Kombinieren mehrerer Beobachter, um die Synchronisierung oder Koordination von Eigenschaften in verschiedenen Objekten zu erzwingen. Nein N / A
Rechenkernel Dieselbe Berechnung viele Male parallel, die sich durch ganzzahlige Parameter unterscheidet, die mit nicht verzweigender Zeigermathematik in gemeinsam genutzten Arrays verwendet werden, wie z. B. GPU- optimierte Matrixmultiplikation oder Convolutional Neural Network . Nein N / A
Doppelt geprüfte Verriegelung Reduzieren Sie den Aufwand für den Erwerb einer Sperre, indem Sie zunächst das Sperrkriterium (den „Sperrhinweis“) auf unsichere Weise testen; nur wenn dies gelingt, wird die eigentliche Sperrlogik fortgesetzt.

Kann unsicher sein, wenn es in einigen Sprachen/Hardware-Kombinationen implementiert wird. Es kann daher manchmal als Anti-Muster angesehen werden .

Jawohl N / A
Ereignisbasiert asynchron Behebt Probleme mit dem asynchronen Muster, die in Multithread-Programmen auftreten. Nein N / A
Bewachte Federung Verwaltet Operationen, für die sowohl eine Sperre als auch eine Vorbedingung erfüllt sein müssen, bevor die Operation ausgeführt werden kann. Nein N / A
Verbinden Join-Pattern bietet eine Möglichkeit, gleichzeitige, parallele und verteilte Programme durch Nachrichtenweitergabe zu schreiben. Im Vergleich zur Verwendung von Threads und Sperren ist dies ein Programmiermodell auf hoher Ebene. Nein N / A
Sperren Ein Thread legt eine "Sperre" auf eine Ressource, wodurch andere Threads daran gehindert werden, darauf zuzugreifen oder sie zu ändern. Nein PoEAA
Messaging Design Pattern (MDP) Ermöglicht den Austausch von Informationen (dh Nachrichten) zwischen Komponenten und Anwendungen. Nein N / A
Objekt überwachen Ein Objekt, dessen Methoden einem gegenseitigen Ausschluss unterliegen , wodurch verhindert wird, dass mehrere Objekte fälschlicherweise versuchen, es gleichzeitig zu verwenden. Jawohl N / A
Reaktor Ein Reaktorobjekt stellt eine asynchrone Schnittstelle zu Ressourcen bereit, die synchron gehandhabt werden müssen. Jawohl N / A
Schreib-Lese-Sperre Ermöglicht gleichzeitigen Lesezugriff auf ein Objekt, erfordert jedoch exklusiven Zugriff für Schreibvorgänge. Ein zugrundeliegendes Semaphor kann zum Schreiben verwendet werden, und ein Copy-on-Write- Mechanismus kann verwendet werden oder nicht. Nein N / A
Planer Steuern Sie explizit, wann Threads Singlethread-Code ausführen dürfen. Nein N / A
Thread-Pool Eine Reihe von Threads wird erstellt, um eine Reihe von Aufgaben auszuführen, die normalerweise in einer Warteschlange organisiert sind. Normalerweise gibt es viel mehr Aufgaben als Threads. Kann als Sonderfall des Objektpoolmusters angesehen werden . Nein N / A
Threadspezifische Speicherung Statischer oder "globaler" Speicher lokal für einen Thread. Jawohl N / A
Sichere Parallelität mit exklusivem Eigentum Vermeidung der Notwendigkeit von gleichzeitigen Laufzeitmechanismen, da exklusive Eigentumsrechte nachgewiesen werden können. Dies ist eine bemerkenswerte Fähigkeit der Rust-Sprache, aber die Überprüfung zur Kompilierzeit ist nicht das einzige Mittel, ein Programmierer wird solche Muster oft manuell in Code entwerfen – und den Einsatz von Sperrmechanismen weglassen, da der Programmierer feststellt, dass eine bestimmte Variable nie funktioniert gleichzeitig zugegriffen werden. Nein N / A
Atomare CPU-Operation x86 und andere CPU-Architekturen unterstützen eine Reihe von atomaren Befehlen, die die Speichersicherheit für das Modifizieren und Zugreifen auf primitive Werte (Ganzzahlen) garantieren. Beispielsweise können zwei Threads einen Zähler sicher inkrementieren. Diese Fähigkeiten können auch verwendet werden, um die Mechanismen für andere Parallelitätsmuster wie oben zu implementieren. Die C# -Sprache verwendet die Interlocked- Klasse für diese Funktionen. Nein N / A

Dokumentation

Die Dokumentation für ein Entwurfsmuster beschreibt den Kontext, in dem das Muster verwendet wird, die Kräfte innerhalb des Kontexts, die das Muster aufzulösen versucht, und die vorgeschlagene Lösung. Es gibt kein einheitliches Standardformat für die Dokumentation von Entwurfsmustern. Vielmehr wurde eine Vielzahl unterschiedlicher Formate von verschiedenen Musterautoren verwendet. Allerdings, so Martin Fowler , sind bestimmte Musterformen bekannter als andere und werden daher zu gemeinsamen Ausgangspunkten für neue Musterschreiben. Ein Beispiel für ein häufig verwendetes Dokumentationsformat ist das von Erich Gamma , Richard Helm , Ralph Johnson und John Vlissides in ihrem Buch Design Patterns . Es enthält die folgenden Abschnitte:

  • Mustername und -klassifizierung: Ein beschreibender und eindeutiger Name, der bei der Identifizierung und Bezugnahme auf das Muster hilft.
  • Absicht: Eine Beschreibung des Ziels hinter dem Muster und der Grund für seine Verwendung.
  • Auch bekannt als: Andere Namen für das Muster.
  • Motivation (Kräfte): Ein Szenario bestehend aus einem Problem und einem Kontext, in dem dieses Muster verwendet werden kann.
  • Anwendbarkeit: Situationen, in denen dieses Muster verwendbar ist; den Kontext für das Muster.
  • Struktur: Eine grafische Darstellung des Musters. Zu diesem Zweck können Klassendiagramme und Interaktionsdiagramme verwendet werden.
  • Teilnehmer: Eine Auflistung der im Muster verwendeten Klassen und Objekte und ihrer Rollen im Design.
  • Zusammenarbeit: Eine Beschreibung, wie im Muster verwendete Klassen und Objekte miteinander interagieren.
  • Konsequenzen: Eine Beschreibung der Ergebnisse, Nebenwirkungen und Kompromisse, die durch die Verwendung des Musters verursacht werden.
  • Implementierung: Eine Beschreibung einer Implementierung des Musters; der Lösungsteil des Musters.
  • Beispielcode: Eine Illustration, wie das Muster in einer Programmiersprache verwendet werden kann.
  • Bekannte Verwendungen: Beispiele für reale Verwendungen des Musters.
  • Zugehörige Muster: Andere Muster, die eine Beziehung zum Muster haben; Diskussion der Unterschiede zwischen dem Muster und ähnlichen Mustern.

Kritik

Es wurde beobachtet, dass Entwurfsmuster nur ein Zeichen dafür sein können, dass einige Funktionen in einer bestimmten Programmiersprache ( zum Beispiel Java oder C++ ) fehlen . Peter Norvig demonstriert, dass 16 der 23 Muster im Buch Design Patterns (das sich hauptsächlich auf C++ konzentriert) in Lisp oder Dylan vereinfacht oder eliminiert werden (über direkte Sprachunterstützung) . Ähnliche Beobachtungen wurden von Hannemann und Kiczales gemacht, die mehrere der 23 Entwurfsmuster mit einer aspektorientierten Programmiersprache (AspectJ) implementierten und zeigten, dass Abhängigkeiten auf Codeebene aus den Implementierungen von 17 der 23 Entwurfsmuster entfernt wurden und dass aspektorientierte Programmierung könnte die Implementierung von Entwurfsmustern vereinfachen. Siehe auch Paul Grahams Essay "Revenge of the Nerds".

Die unangemessene Verwendung von Mustern kann die Komplexität unnötig erhöhen.

Siehe auch

Verweise

Weiterlesen