Designmuster
![]() | |
Autor | Die "Bande von vier":
|
---|---|
Land | Vereinigte Staaten |
Thema | Designmuster, Softwareentwicklung, Objekt orientierte Programmierung |
Verleger | Addison-Wesley |
Veröffentlichungsdatum | 1994 |
Seiten | 395 |
ISBN | 0-201-63361-2 |
OCLC | 31171684 |
005.1/2 20 | |
LC -Klasse | QA76.64 .D47 1995 |
Entwurfsmuster: Elemente wiederverwendbarer objektorientierter Software (1994) ist a Softwareentwicklung Buchbeschreibung Software -Designmuster. Das Buch wurde von geschrieben von Erich Gamma, Richard Helm, Ralph Johnson, und John Vlissidesmit einem Vorwort von Grady Booch. Das Buch ist in zwei Teile unterteilt, wobei die ersten beiden Kapitel die Fähigkeiten und Fallstricke der objektorientierten Programmierung und in den verbleibenden Kapiteln 23 Classic beschrieben haben Software -Designmuster. Das Buch enthält Beispiele in C ++ und Smalltalk.
Es hat sich für den Bereich der Software-Engineering einflussreich und gilt als wichtige Quelle für objektorientierte Designtheorie und -praxis. Mehr als 500.000 Exemplare wurden in Englisch und 13 anderen Sprachen verkauft. Die Autoren werden oft als die bezeichnet Gruppe von vier (Gof).[1]
Geschichte
Das Buch begann bei a Federvögel (BOF) Sitzung bei Oopsla '90, "in Richtung eines Architekturhandbuchs", geführt von Bruce Anderson, wo Erich Gamma und Richard Helm ihr gemeinsames Interesse trafen und entdeckten. Sie wurden später von Ralph Johnson und John Vlissides begleitet.[2] Das ursprüngliche Veröffentlichungsdatum des Buches war der 21. Oktober 1994 mit einem Urheberrecht von 1995, daher wird es häufig mit einem Jahr 1995 zitiert, obwohl es 1994 veröffentlicht wurde. Das Buch wurde zum ersten Mal der Öffentlichkeit auf dem OOPSLA-Treffen in Portland zur Verfügung gestellt , Oregon, im Oktober 1994. 2005 die ACM Sigplan Vergabe des diesjährigen Programmiersprachen -Achievement -Preises an die Autoren, um die Auswirkungen ihrer Arbeiten "auf Programmier- und Programmiersprachendesign" zu erkennen.[3] Ab März 2012 befand sich das Buch im 40. Druck.
Einführung
Kapitel 1 ist eine Diskussion über objektorientierter Designtechniken, die auf der Erfahrung der Autoren basieren, von denen sie glauben, dass sie zu einem guten objektorientierten Softwaredesign führen würden, einschließlich:
- "Programm zu einer Schnittstelle, keine Implementierung." (Bande von vier 1995: 18)
- Zusammensetzung über die Vererbung: "Favorisieren 'Objektzusammensetzung' Über 'Klassenvererbung'. "(Bande von 1995: 20)
Die Autoren behaupten Folgendes als Vorteile von Schnittstellen Übersetzung:
- Clients sind sich der spezifischen Arten von Objekten nicht bewusst, die sie verwenden, solange das Objekt an der Schnittstelle hält
- Kunden sind sich der Klassen, die diese Objekte implementieren, nicht bewusst. Clients kennen nur die abstrakte Klasse (ES), die die Schnittstelle definiert
Die Verwendung einer Schnittstelle führt auch zu Dynamische Bindung und Polymorphismus, die zentrale Merkmale der objektorientierten Programmierung sind.
Die Autoren beziehen sich auf Nachlass wie weiße Kiste Wiederverwendung, mit White-Box, der sich auf die Sichtbarkeit bezieht, da die Interna von übergeordneten Klassen häufig sichtbar sind Unterklassen. Im Gegensatz dazu beziehen sich die Autoren auf Objektzusammensetzung (in denen Objekte mit gut definierten Schnittstellen zur Laufzeit von Objekten, die Referenzen auf andere Objekte erhalten, dynamisch verwendet werden) als Flugschreiber Wiederverwendung Da keine internen Details komponierter Objekte im Code mit ihnen sichtbar sind.
Die Autoren diskutieren die Spannung zwischen Erbschaft und Einkapselung ausführlich und geben an, dass Designer die Erbschaft überbeanspruchen (Bande von 1995: 20). Die Gefahr wird wie folgt angegeben:
- "Weil die Vererbung a enthüllt Unterklasse Um Details der Umsetzung seiner Eltern zu erledigen, wird oft gesagt, dass die Vererbung die Kapselung bricht "(Bande von vier 1995: 19)
Sie warnen, dass die Umsetzung einer Unterklasse so an die Umsetzung ihrer übergeordneten Klasse verbunden werden kann, dass jede Änderung der Umsetzung des Elternteils die Unterklasse zur Änderung zwingt. Darüber hinaus behaupten sie, dass ein Weg, dies zu vermeiden, nur aus abstrakten Klassen erben kann - aber sie weisen darauf hin, dass es eine minimale Wiederverwendung von Code gibt.
Die Verwendung der Vererbung wird hauptsächlich empfohlen, wenn die Funktionalität vorhandener Komponenten hinzugefügt wird, die meisten alten Code wiederverwendet und relativ kleine Mengen neuer Code hinzugefügt werden.
Für die Autoren ist 'Delegation' eine extreme Form der Objektzusammensetzung, die immer zum Ersetzen der Vererbung verwendet werden kann. Die Delegation umfasst zwei Objekte: Ein "Absender" übergibt sich an einen "Delegierten", um den Delegierten auf den Absender zu verweisen. Somit wird der Zusammenhang zwischen zwei Teilen eines Systems nur zur Laufzeit hergestellt, nicht zur Kompilierungszeit. Das Zurückrufen Artikel enthält weitere Informationen zur Delegation.
Die Autoren diskutieren auch sogenannte parametrisierte Typen, die auch als als bekannt sind Generika (ADA, Eiffel, Java, C#, vb.net und delphi) oder templates (c ++). Diese ermöglichen es, dass jeder Typ definiert wird, ohne alle anderen Typen anzugeben - die nicht spezifizierten Typen werden als „Parameter“ zum Gebrauchsort geliefert.
Die Autoren geben zu, dass Delegation und Parametrisierung sehr leistungsfähig sind, aber eine Warnung hinzufügen:
- "Dynamische, hoch parametrisierte Software ist schwerer zu verstehen und zu erstellen als statischere Software." (Bande von vier 1995: 21)
Die Autoren unterscheiden weiter zwischen 'Anhäufung', wo ein Objekt' oder 'Teil eines anderen Objekts ist (was bedeutet, dass ein Gesamtobjekt und sein Eigentümer identische Lebensdauer haben) und Bekanntschaft, wobei ein Objekt lediglich von einem anderen Objekt weiß. Manchmal wird Bekanntschaft als "Assoziation" oder die "Verwenden" -Beziehung bezeichnet. Bekanntschaftsobjekte können Operationen voneinander anfordern, sie sind jedoch nicht für einander verantwortlich. Bekanntschaft ist eine schwächere Beziehung als die Aggregation und schlägt viel vor lockerer Kopplung zwischen Objekten, die für maximale Wartbarkeit in einem Design häufig wünschenswert sein können.
Die Autoren verwenden den Begriff "Toolkit", bei dem andere heute "Klassenbibliothek" wie in C# oder Java verwenden könnten. In ihrem Sprachgebrauch sind Toolkits das objektorientierte Äquivalent von Subroutine-Bibliotheken, während a ''Rahmen'ist eine Reihe kooperierender Klassen, die ein wiederverwendbares Design für eine bestimmte Softwareklasse ausmachen. Sie geben an, dass Anwendungen schwer zu gestalten sind, Toolkits schwieriger sind und Frameworks am schwierigsten zu gestalten sind.
Muster nach Typ
Kreation
Kreation Muster sind solche, die Objekte erstellen, anstatt Objekte direkt instanziieren zu müssen. Dies gibt dem Programm mehr Flexibilität bei der Entscheidung, welche Objekte für einen bestimmten Fall erstellt werden müssen.
- Zusammenfassung Fabrik Gruppen Objektfabriken, die ein gemeinsames Thema haben.
- Erbauer konstruiert komplexe Objekte durch Trennung von Konstruktion und Darstellung.
- Fabrikmethode Erstellt Objekte, ohne die genaue Klasse zu erstellen.
- Prototyp Erstellt Objekte durch Klonen eines vorhandenen Objekts.
- Singleton schränkt die Objekterstellung für eine Klasse auf nur eine Instanz ein.
Strukturell
Diese betreffenden Klasse und Objektzusammensetzung. Sie verwenden Vererbung, um Schnittstellen zu komponieren und Wege zu definieren, um Objekte zu komponieren, um neue Funktionen zu erhalten.
- Adapter Ermöglicht Klassen mit inkompatiblen Schnittstellen zusammenarbeiten, indem sie eine eigene Schnittstelle um die einer bereits vorhandenen Klasse wickelt.
- Brücke Entkoppelt eine Abstraktion von ihrer Implementierung, damit die beiden unabhängig variieren können.
- Zusammengesetzt Komponiert null-or-more ähnliche Objekte, damit sie als ein Objekt manipuliert werden können.
- Dekorateur Fügt das Verhalten in einer vorhandenen Methode eines Objekts dynamisch hinzu/überschreibt/überschreibt dynamisch.
- Fassade Bietet eine vereinfachte Schnittstelle zu einem großen Codekörper.
- Fliegengewicht Reduziert die Kosten für das Erstellen und Manipulieren einer großen Anzahl ähnlicher Objekte.
- Proxy Bietet einem Platzhalter für ein anderes Objekt, um den Zugang zu kontrollieren, die Kosten zu senken und die Komplexität zu senken.
Verhalten
Die meisten dieser Entwurfsmuster befassen sich speziell mit der Kommunikation zwischen Objekten.
- Verantwortungskette Delegierte Befehle an eine Kette von Verarbeitungsobjekten.
- Befehl Erstellt Objekte, die Aktionen und Parameter zusammenfassen.
- Dolmetscher implementiert eine spezialisierte Sprache.
- Iterator Zugriff auf die Elemente eines Objekts nacheinander, ohne seine zugrunde liegende Darstellung aufzudecken.
- Vermittler erlaubt lose Kopplung Zwischen Klassen durch die einzige Klasse, die detaillierte Kenntnisse über ihre Methoden hat.
- Erinnerung Bietet die Möglichkeit, ein Objekt in seinem vorherigen Zustand (rückgängig zu machen) wiederherzustellen.
- Beobachter ist ein Veröffentlichung/Abonnement -Muster, mit dem eine Reihe von Observer -Objekten ein Ereignis sehen können.
- Bundesland Ermöglicht ein Objekt, sein Verhalten zu ändern, wenn sich sein interner Zustand ändert.
- Strategie Ermöglicht eine Familie von Algorithmen, zur Laufzeit im Fliege ausgewählt zu werden.
- Vorlagenmethode Definiert das Skelett eines Algorithmus als abstrakte Klasse, sodass seine Unterklassen ein konkretes Verhalten bereitstellen können.
- Besucher Trennt einen Algorithmus von einer Objektstruktur, indem die Hierarchie von Methoden in ein Objekt verschiebt wird.
Kritik
Kritik wurde auf das Konzept von gerichtet Software -Designmuster allgemein und bei Designmuster speziell. Eine Hauptkritik an Designmuster ist, dass seine Muster einfach Problemumgehungen für fehlende Merkmale in C ++ sind, wodurch elegante abstrakte Merkmale durch lange Betonmuster ersetzt werden und im Wesentlichen ein "menschlicher Compiler" werden. Paul Graham schrieb:[4]
Wenn ich Muster in meinen Programmen sehe, betrachte ich es als Zeichen von Schwierigkeiten. Die Form eines Programms sollte nur das Problem widerspiegeln, das sie lösen muss. Jede andere Regelmäßigkeit im Code ist für mich ein Zeichen für mich, dass ich Abstraktionen, die nicht leistungsstark genug sind- oft, dass ich die Erweiterungen eines Makros, die ich schreiben muss, generiere.
Peter Norvig zeigt, dass 16 der 23 Muster in Designmuster werden durch Sprachmerkmale in vereinfacht oder beseitigt Lispeln oder Dylan.[5] Verwandte Beobachtungen wurden von Hannemann und gemacht Kiczales Wer hat mehrere der 23 Entwurfsmuster mit einem implementiert Aspektorientierte Programmiersprache (Aspektj) und zeigten, dass Abhängigkeiten auf Code-Ebene aus den Implementierungen von 17 der 23 Entwurfsmuster entfernt wurden und dass die Aspekt-orientierte Programmierung die Implementierungen von Entwurfsmustern vereinfachen könnte.[6]
Es gab auch humorvolle Kritik, wie beispielsweise einen Showversuch bei OOPSLA '99 am 3. November 1999.[7][8][a] und eine Parodie des Formats, von Jim Coplien, berechtigt "Klimaanlage in Kansas City".
In einem Interview mit Informit im Jahr 2009 erklärte Erich Gamma, dass die Buchautoren im Jahr 2005 darüber diskutiert hätten, wie sie das Buch neu gestaltet hätten, und kam zu dem Schluss, dass sie einige Muster neu kategorisiert und einige zusätzliche hinzugefügt hätten. Gamma wollte das Singleton -Muster entfernen, aber es gab keinen Konsens unter den Autoren.[9]
Siehe auch
- Software -Designmuster
- Unternehmensintegrationsmuster
- Greifen (objektorientiertes Design)
- Pädagogische Muster
Anmerkungen
- ^ Vorsitzender Magistrat Neil Harrison, Staatsanwalt Kent Beck, Verteidigung Rechtsanwalt Martin Fowler, Court Baliff Brian Foote; Richard Helm reichte a ein Geständnis, während der Rest stand.
Verweise
- ^ Gruppe von vier, Content Creation Wiki für Menschenprojekte und Muster in der Softwareentwicklung.
- ^ Richard Helm
- ^ Sigplan FY '05 Jahresbericht
- ^ Graham, Paul (2002). Rache der Nerds. Abgerufen 2012-08-11.
- ^ Norvig, Peter (1998). Entwurfsmuster in dynamischen Sprachen.
- ^ Hannemann, Jan (2002). Entwurfsmuster -Implementierung in Java und Aspektj.
- ^ Anklage
- ^ Der Showprozess gegen die Bande von vier Jahren, Brian Foote
- ^ Gamma, Erich; Helm, Richard; Johnson, Ralph (2009-10-22). "Designmuster 15 Jahre später: Ein Interview mit Erich Gamma, Richard Helm und Ralph Johnson". Informit (Interview). Interviewt von Larry O'Brien. Archiviert vom Original am 2019-02-20. Abgerufen 2019-09-01.