Hat die vierköpfige Bande „Pattern Space“ gründlich untersucht?


144

Seit ich vor mindestens 10 Jahren zum ersten Mal von den Designmustern der Gang of Four (GoF) erfahren habe, habe ich den Eindruck, dass diese 23 Muster nur eine kleine Auswahl von etwas viel Größerem sein sollten, das ich gerne als Pattern Space bezeichne . Dieser hypothetische Musterraum besteht aus allen empfehlenswerten Lösungen (bekannt oder unbekannt) für häufig auftretende objektorientierte Softwareentwurfsprobleme.

Daher habe ich erwartet, dass die Anzahl der bekannten und dokumentierten Entwurfsmuster erheblich zunehmen wird.

Es ist nicht geschehen. Mehr als 20 Jahre nach Erscheinen des GoF-Buches sind im Wikipedia-Artikel nur 12 zusätzliche Muster aufgeführt, von denen die meisten viel weniger beliebt sind als die ursprünglichen. (Ich habe die Parallelitätsmuster hier nicht angegeben, da sie ein bestimmtes Thema abdecken.)

Was sind die Gründe?

  • Ist der GoF-Mustersatz tatsächlich umfassender als ich denke?

  • Hat das Interesse an der Suche nach neuen Mustern nachgelassen, vielleicht weil sich herausgestellt hat, dass sie im Software-Design nicht allzu nützlich sind?

  • Etwas anderes?


49
Muster gibt es überall, aber sie werden oft geschmacklos und roboterhaft verwendet. Aus diesem Grund, denke ich, wurde die Idee des Musterkatalogs weniger populär.
USR

6
Design Raum? Jemand bringt Mark Rosewater hier runter, stat!
corsiKa

16
Martin Fowler veröffentlichte 2003 Patterns of Enterprise Application Architecture, in denen etwa 50 Patterns dokumentiert sind, von denen viele noch gut rekonfigurierbar und weit verbreitet sind, z. B. "Data Mapper", "Plugin", "Lazy Load", "Service Layer" usw.
Brian Rogers

2
Das Erforschen des Raums aller möglichen Muster würde bedeuten, den Raum der möglichen Muster überhaupt nicht zu erforschen. Sie können alles zu einem Muster machen. Wenn Sie alles zu einem Muster machen, ist nichts ein Muster, da das Wort an Bedeutung verliert.
Hoffentlich

4
@BradThomas: Sicher, wie bei den interessantesten Fragen neigen die Leute dazu, eine bestimmte Meinung zu haben. Aber Meinungen basieren zumindest teilweise auf Fakten, und ich habe in den Antworten auf diese Frage viele interessante Fakten gefunden, die mir und hoffentlich auch anderen helfen werden, ihre Meinungen zu überdenken und zu fundierteren zu gelangen.
Frank Puffer

Antworten:


165

Als das Buch herauskam, dachten viele Leute so und es gab viele Bemühungen, "Musterbibliotheken" oder sogar "Mustergemeinschaften" zu schaffen. Sie können noch einige von ihnen finden:

Aber dann...

Hat das Interesse, neue Muster zu finden, abgenommen, vielleicht weil sie im Software-Design nicht wirklich nützlich sind?

Das sehr. Der Punkt bei Entwurfsmustern ist die Verbesserung der Kommunikation zwischen Entwicklern. Wenn Sie jedoch versuchen, weitere Muster hinzuzufügen, gelangen Sie schnell an den Punkt, an dem sich die Benutzer nicht mehr an sie erinnern oder sie nicht mehr erinnern können oder nicht mehr darüber einig sind, wie sie genau aussehen sollen und wie die Kommunikation aussieht in der Tat nicht verbessert. Das passiert schon viel mit den GoF-Mustern.

Persönlich würde ich noch weiter gehen: Software-Design, insbesondere gutes Software-Design, ist viel zu vielfältig, um in Mustern sinnvoll erfasst zu werden, insbesondere in der geringen Anzahl von Mustern, an die sich Menschen tatsächlich erinnern können - und sie sind viel zu abstrakt für Menschen Erinnere dich wirklich an mehr als eine Handvoll. Sie helfen also nicht viel.

Und viel zu viele Menschen verlieben sich in das Konzept und versuchen, überall Muster anzuwenden - normalerweise findet man im resultierenden Code nicht das tatsächliche Design zwischen allen (völlig bedeutungslosen) Singletons und Abstract Factories.


50
Umstrittene Meinung: Die abstrakte Fabrik ist sowieso ein Code-Geruch :)
MetaFight

66
Vielleicht eine kontroverse Meinung, aber eine so wichtige, die es auszudrücken gilt. Designmuster sind in Gefahr, ein Beispiel für die neuen Kleider des Kaisers zu werden, wo wir alle Angst haben, zu hinterfragen, ob sie nützlich sind. Gut gemacht.
David Arno

18
@MetaFightControversialDesignPatternOnlineOpinionHumanReadableRetortFactory.newInstance().getText();
corsiKa

11
" Der Punkt bei Entwurfsmustern ist die Verbesserung der Kommunikation zwischen Entwicklern. " Ich dachte, Entwurfsmuster sollten Probleme lösen, auf die Entwickler häufig (und häufig unabhängig voneinander) stoßen. Standards verbessern die Kommunikation, und aufgrund von Schwankungen (Muster, die sich aus XY-Problemen ergeben und Muster, die als Antimuster gelten), betrachten viele Designmuster nicht als Standards. Entwurfsmuster können das Fehlen von Sprachfeatures gut erkennen, und ich glaube, Sprachdesigner implementieren diese Problembehebungen, bevor sie zu Entwurfsmustern werden. Nehmen Sie aber nicht mein Wort
Vince Emigh,

11
@ ChrisW Ich verstehe Ihren Standpunkt nicht ... Wie gesagt, die GoF hat versucht, OO-Mängel und insbesondere C ++ 98-Mängel zu überwinden, da dies die Sprache ihrer Wahl war, zusammen mit Smalltalk. Sie schrieben tatsächlich: "Die Wahl der Programmiersprache ist wichtig, weil sie die Sichtweise beeinflusst. Unsere Muster setzen Sprachfunktionen auf Smalltalk / C ++ - Ebene voraus, und diese Wahl bestimmt, was leicht implementiert werden kann und was nicht."
Shautieh

108

Ich habe den Eindruck, dass diese 23 Muster nur eine kleine Auswahl von etwas viel Größerem sein sollten, das ich gerne den Musterraum nenne.

Dies ist die schreckliche Annahme, die von Neulingen-Programmierern überall verbreitet wird, Programmierern, die glauben, ein Programm nur durch Zusammenfügen von Softwaremustern schreiben zu können. So funktioniert das nicht. Wenn es einen solchen "Musterraum" gibt, können Sie davon ausgehen, dass seine Größe praktisch unendlich ist.

Entwurfsmuster (im Sinne von GoF) haben nur einen Zweck: Mängel in der von Ihnen verwendeten Programmiersprache auszugleichen.

Entwurfsmuster sind weder universell noch umfassend. Wenn Sie zu einer anderen, ausdrucksstärkeren Programmiersprache wechseln, werden die meisten Muster im GoF-Buch unnötig und unerwünscht.


40
"Entwurfsmuster (im Sinne von GoF) haben nur einen Zweck: Mängel in der von Ihnen verwendeten Programmiersprache auszugleichen." Ich höre das immer wieder, muss es aber noch als gerechtfertigt ansehen. Jede vermeintliche Begründung verweist lediglich auf eine Handvoll von Mustern, die in Sprachen mit bestimmten Merkmalen - normalerweise Visitor und vielleicht Singleton - einfacher zu implementieren sind, und lässt die überwiegende Mehrheit der Muster unberührt, was lediglich impliziert, dass auch sie durch überflüssig gemacht werden können bessere Sprachen. Aber woher wissen wir das? Welche Sprachfunktion macht Observer irrelevant? Verantwortungskette? Zusammengesetzt?
Jules

56
@Jules Erstklassige Funktionen allein eliminieren einen beträchtlichen Teil von ihnen, einschließlich der Verantwortungskette (es ist nur die Zusammenstellung einer Liste von Funktionen). Funktionale reaktive Programmierung eliminiert das Observer-Muster. Das zusammengesetzte Muster ist nur eine weniger strenge Definition von Monoiden, und Sprachen mit Typenklassen und dem Schwerpunkt auf algebraischen Gesetzen bieten leistungsstarke Werkzeuge für die Arbeit mit Monoiden. Ich könnte noch viel mehr auflisten, aber Sie haben die Idee.
Jack

12
@Jules: Ich glaube, das ursprüngliche GoF-Buch listete den Iterator als Muster auf, aber jetzt ist seine Umwandlung in eine Sprachfunktion in jeder Remote-OOP-Sprache im Grunde vollständig.
Kevin

9
@RubberDuck Wie wird das Muster bereits implementiert, sodass es veraltet ist? Es ist immer noch das Designmuster, das implementiert wird. Unterschiedliche Sprachmerkmale können zu unterschiedlichen Implementierungen des Musters führen, das Muster selbst ist jedoch noch vorhanden. Muster dienen dazu, die Kommunikation zu vereinfachen, indem sie wiederkehrenden Strategien, die häufig verwendet werden, Namen geben. In diesem Fall werden die .NET-Klassen aufgerufen ObservableSomething<T>, was es einfach macht, ihren Zweck zu verstehen, da der allgemein bekannte Mustername verwendet wird. Ein Muster ist eine Idee, keine genaue Umsetzung.
Null

29
@Jules: Was ist ein Programm? Eine Lösung für ein wiederkehrendes Problem. Was ist ein Entwurfsmuster? Eine Lösung für ein wiederkehrendes Problem. Warum ist es kein Programm? Weil wir es nicht als Programm ausdrücken können. Ergo ist ein Entwurfsmuster eine Lösung für ein wiederkehrendes Problem, das eher ein Programm sein sollte, kein Entwurfsmuster, aber kein Programm, da die Sprache nicht ausdrucksstark genug ist, um das Programm auszudrücken. Beispiel: Vor nicht allzu langer Zeit war "Unterprogrammaufruf" ein Entwurfsmuster! Heutzutage ist es ein Sprachmerkmal.
Jörg W Mittag

61

Ich denke, hier spielen drei Faktoren eine Rolle.

Mangel an kritischer Masse

Erstens ist ein Muster im Grunde nichts anderes, als einem Code einen Namen zu geben, der einen bestimmten Teil der Funktionalität implementiert. Der Name bietet nur dann einen echten Nutzen, wenn Sie sich darauf verlassen können, dass jeder weiß, was der Name bedeutet. Wenn er nur den Namen verwendet, versteht er sofort eine Menge über den Code.

Patterns haben jedoch nie die kritische Masse erreicht, die sie dazu benötigten. Eher das Gegenteil, AAMOF. Ich bin mir ziemlich sicher, dass ich in den 20 (oder so) Jahren seit Erscheinen des GoF-Buches nicht ein Dutzend Konversationen gesehen habe, in denen alle Beteiligten wirklich genug Entwurfsmuster kannten, um die Kommunikation zu verbessern.

Um es etwas kurioser auszudrücken: Designmuster scheiterten speziell daran, dass sie scheiterten.

Zu viele Muster

Ich denke, der zweite Hauptfaktor ist, dass sie anfangs, wenn überhaupt, zu viele Muster benannt haben. In einer Reihe von Fällen sind die Unterschiede zwischen den Mustern hinreichend subtil, so dass es nahezu unmöglich ist, mit wirklicher Gewissheit zu sagen, ob eine bestimmte Klasse zu dem einen oder anderen Muster passt (oder vielleicht zu beiden - oder vielleicht auch zu keinem).

Die Absicht war, dass Sie auf einer höheren Ebene über Code sprechen können. Sie können einen relativ großen Codeabschnitt als Implementierung eines bestimmten Musters bezeichnen. Wenn Sie einfach diesen vordefinierten Namen verwenden, weiß normalerweise jeder, der zuhört, so viel, wie er sich um diesen Code kümmert, sodass Sie zum nächsten Schritt übergehen können.

Die Realität sieht eher anders aus. Nehmen wir an, Sie sind in einer Besprechung und sagen ihnen, dass es sich bei dieser bestimmten Klasse um eine Fassade handelt. Die Hälfte der Teilnehmer des Treffens wusste entweder nie oder hat längst vergessen, was das genau bedeutet. Einer von ihnen bittet Sie, ihn an die genauen Unterschiede zwischen einer Fassade und beispielsweise einem Stellvertreter zu erinnern. Oh, und die paar Leute, die wirklich Muster kennen, verbringen den Rest des Meetings damit zu diskutieren, ob dies wirklich als Fassade oder "nur" als Adapter angesehen werden sollte (wobei dieser eine Mann immer noch darauf besteht, dass es ihm wie ein Stellvertreter vorkommt).

In Anbetracht dessen, dass Sie wirklich nur sagen wollten: "Dieser Code ist nicht sehr interessant. Machen wir weiter." Der Versuch, den Namen eines Musters zu verwenden, hat nur Ablenkung und keinen Wert.

Mangel an Interesse

Die meisten Entwurfsmuster beschäftigen sich nicht wirklich mit den interessanten Teilen des Codes. Sie beschäftigen sich mit Dingen wie: "Wie erstelle ich diese Objekte?" Und "Wie bringe ich dieses Objekt dazu, mit diesem zu sprechen?" Das Auswendiglernen von Musternamen für diese (sowie die oben genannten Argumente über Details und dergleichen) bedeutet einfach, viel Energie in Dinge zu stecken, die den meisten Programmierern einfach nicht so wichtig sind.

Um es etwas anders: Muster beschäftigen sich mit den Dingen , die die gleiche zwischen vielen Programmen sind - aber was wirklich ein Programm interessant macht , ist , wie es ist anders aus anderen Programmen.

Zusammenfassung

Entwurfsmuster sind fehlgeschlagen, weil:

  1. Sie erreichten keine kritische Masse.
  2. Die Unterscheidung der Muster reichte nicht aus, um Klarheit zu gewährleisten.
  3. Sie befassten sich hauptsächlich mit Codeteilen, die sowieso fast niemanden wirklich kümmerten.

2
"... aber was ein Programm wirklich interessant macht, ist, wie es sich von anderen Programmen unterscheidet." Ich stimme vollkommen zu, aber dafür muss man zuerst den gleichen Teil richtig machen, vielleicht unterscheiden sie sich nur durch einen trivialen Aspekt. Wenn Sie sich ein wenig entspannen, müssen Sie Muster benennen und identifizieren. Ich bin überzeugt, dass man fast überall Muster sieht. Es ist nur so, dass sie fast nie in ihrer reinen Form kommen, sondern immer mehr oder weniger an das jeweilige Problem angepasst sind.
Trilarion

5
Sehr gute Antwort.
Robert Harvey

4
@Trilarion: Oh, mir ist klar, dass diese Teile des Codes geschrieben werden müssen. Sie ähneln etwa den Reifen Ihres Autos. Sie brauchen so ziemlich Reifen, um überhaupt zu fahren - aber die meisten Leute kennen die Reifenmarke ihres Autos noch kaum. Dies verlangt, dass sie eine spezielle Terminologie für einen Reifen mit asymmetrischen diagonalen Rillen lernen. Wer weiß - die haben vielleicht mein Leben gerettet, aber ich verbringe mein Leben immer noch nicht damit, Namen für sie zu lernen.
Jerry Coffin

3
@DavidRicherby: Okay, dann verwenden wir eine "Producer Side" -Version der Analogie. Ist es wichtig, dass John, der Reifen für Goodyear entwirft, ein Wort für diese Art von Groove verwendet, aber Pierre, der für Michelin arbeitet, ein ganz anderes Wort verwendet? Ist es wichtig, dass einer ein Wort verwendet, das sich nur auf die Rille bezieht, der andere ein Wort, das sich auf einen vollständigen Reifen mit horizontalen Rillen auf der einen Seite der Mitte und diagonalen Rillen auf der anderen Seite bezieht?
Jerry Coffin

2
@immibis: Ich würde meistens ja sagen, sie sind gescheitert. Ich würde sagen, es gibt weniger als ein halbes Dutzend Muster, die die meisten Programmierer erkennen. Singleton ist bekannt, aber eigentlich (bestenfalls) nur selten anwendbar. Der Name "Factory" war lange vor der Einführung von "patterns" gebräuchlich (ich erinnere mich an seine Verwendung in den späten 1970ern oder sehr frühen 1980ern). Muster sollten einen Wortschatz bilden, aber derzeit sind sie ungefähr so ​​wie mein Wortschatz auf Griechisch - genug, um (möglicherweise) in Schwierigkeiten zu geraten, aber sicherlich nicht genug, um ein Menü zu bestellen, geschweige denn, um ein bedeutungsvolles Gespräch zu führen.
Jerry Coffin

35

Mustern fehlen Abstraktionen, einfache Muster werden abstrahiert, komplexe Muster werden nicht erkannt, daher sind Muster nicht nützlich (mit Ausnahme einiger weniger übergeordneter Muster).

Ich denke, Paul Graham sagte es am besten:

Wenn ich Muster in meinen Programmen sehe, sehe ich das als Anzeichen für Probleme. Die Form eines Programms sollte nur das zu lösende Problem widerspiegeln. Jede andere Regelmäßigkeit im Code ist für mich zumindest ein Zeichen dafür, dass ich Abstraktionen verwende, die nicht leistungsfähig genug sind - oftmals, dass ich die Erweiterungen eines Makros, das ich schreiben muss, von Hand generiere.

Wenn Sie ein Muster in Ihrem Code erkennen, bedeutet dies, dass sich etwas wiederholt, und Sie sollten eine bessere Abstraktion verwenden. Wenn Sie keine bessere Abstraktion haben, verwenden Sie das Muster als Problemumgehung. Da neuere Programmiersprachen bessere Abstraktionen liefern, werden Muster weniger nützlich.
Auch einfache Muster lassen sich oft leicht abstrahieren und komplexe Muster werden selten erkannt.
Wenn ein Muster durch eine Abstraktion ersetzt wird, bedeutet dies nicht, dass das Konzept hinter dem Muster verschwindet, sondern dass das Konzept explizit anstatt indirekt geschrieben werden kann und dass es im Vergleich zu anderem Code keine Besonderheiten mehr aufweist und nicht mehr als erkennbar ist ein Muster.


2
Ich persönlich mag diese Idee irgendwie wirklich. Aber dann sollte Code für Menschen und Menschen wie Muster lesbar sein. Muster helfen uns, uns zurechtzufinden. Wenn Sie alle Muster aus unserem Code entfernen , ist dieser nicht mehr lesbar.
Frank Puffer

2
@Frank Ich denke, woher PG kommt, ist, dass ein Muster ein "Geruch" einer zugrunde liegenden Funktion ist, die Sie abstrahieren können, und die Tatsache, dass Sie es nicht in eine Funktion oder ein Makro gezogen haben, ist der Grund für die Wiederholung Wenn Sie keine String.replaceFunktion hätten, könnten Sie sich vorstellen, dass sie als Muster auftaucht. Es ist jedoch besser, sie einmal zu schreiben, als sie weiterhin zu implementieren. Stimmen Sie zu, dass, wenn Sie diese Dinge nicht richtig benennen, das Lesen schwieriger wird, aber wenn es richtig gemacht wird, liest der Code deklarativer IMO (z. B. der getOrElseStil von Optionsmonaden gegen Null-Prüfung)
anotherdave

11
In Paul Grahams Zitat ging es darum, Ihre Lösungen trocken zu halten, was sich von der GoF-Musteridee unterscheidet. Bei der GoF-Idee ging es darum, häufig verwendete Lösungen zu benennen. Das haben wir schon gemacht, lange bevor die GoF ihr Buch veröffentlicht hat. Beispielsweise kann ich meinem Kollegen mitteilen, dass ich eine Warteschlange verwenden werde , und er weiß sofort, worüber ich spreche, ohne dass er die Details der Funktionsweise oder Funktionsweise einer Warteschlange erläutern muss. Aber siehe Michael Borgwardts ausgezeichnete Antwort oben.
Solomon Slow

10
Meiner Meinung nach ist diese Antwort falsch, was Muster sind. Ein Entwurfsmuster ist eine häufig vorkommende Lösung für ein häufiges Problem. Es ist keine Code-Vervielfältigung. Nehmen Sie einen Iterator. Sie lösen das Problem, den Container zu abstrahieren, damit Sie die darin enthaltenen Elemente durchgehen können, unabhängig davon, um welchen Container es sich handelt. Auf diese Weise erstellen Sie eine Iteratorklasse, die dies für jeden Ihrer Container erledigt, und lassen sie eine gemeinsame Schnittstelle implementieren. Was ist hier zu abstrahieren? Ein Iterator ist bereits eine Abstraktion. Und natürlich ist es für alle Container unterschiedlich implementiert, sodass keine Code-Vervielfältigung erforderlich ist.
Malcolm

3
Der wichtigste Teil von Grahams Zitat ist oft, dass ich die Erweiterungen eines Makros, das ich schreiben muss, von Hand generiere. Dies verweist speziell auf Lisp-Makros. Es gibt nur so viel Abstraktion, dass man auf Makros verzichten kann.
Bart van Nierop

13

Während ich den Antworten der anderen weitgehend zustimme, glaube ich persönlich, dass ein Hauptgrund für eine nicht wachsende Anzahl von Mustern darin besteht, dass Muster ihre Bedeutung verlieren, wenn es unzählige gibt. Das Schöne an diesen wenigen Mustern ist, dass sie auf übliche Weise viele Problembereiche abdecken. Wenn Sie sich auf eine endlose Musterdomäne konzentrieren, haben Sie am Ende überhaupt kein Muster. Es ist ein bisschen wie "Wie lang ist die Küste einer Insel?". Wenn Sie auf einer Karte messen, kommen Sie mit einer anständigen Nummer. Wenn Sie jedoch versuchen, genauer zu werden und eine feinere Auflösung zu erzielen, werden Sie feststellen, dass die Länge immer mehr ins Unendliche steigt (oder die Unsicherheit; wie würden Sie die genaue Grenze mit Gezeiten und auf atomarer Ebene messen?).


1
Richtig, Muster können nur funktionieren, wenn nicht zu viele vorhanden sind. Aber warum sind die GoF immer noch die beliebtesten? Einige von ihnen werden heute von vielen Menschen (Singleton, Builder usw.) als Antimuster angesehen. Dies sollte Platz für neue, nützlichere Muster schaffen, ohne die Gesamtzahl zu erhöhen.
Frank Puffer

2
Ich denke, es ist wie die 10 Gebote. Die Quelle ist nur 2 Zeichen entfernt (GOF, GOE, GOD) xD
qwerty_so

9
Ja, und manchmal scheint es, als beziehe sich modernes Software-Engineering auf GoF, wie mittelalterliche Scholastiker auf Aristoteles.
Frank Puffer

11

Etwas, das in keiner der anderen Antworten erwähnt wird, das ebenfalls relevant ist:

Der Aufstieg dynamisch getippter Sprachen.

Als das Buch herauskam, gab es ernsthafte Diskussionen darüber, dass Java einfach zu langsam war, um echte Arbeit zu leisten. Heute wird Java aufgrund seiner Geschwindigkeit häufig in ausdrucksstärkeren Sprachen verwendet . Vielleicht sind Ruby, Python, JavaScript usw. für einige wichtige Anwendungsklassen immer noch zu langsam, aber im Großen und Ganzen sind sie für die meisten Zwecke schnell genug. Und JavaScript wird immer schneller, obwohl in jeder Version mehr Funktionen enthalten sind.

Das ursprüngliche GoF-Buch hatte die Muster sowohl in smalltalk als auch in c ++, und wenn Speicherplatz zur Verfügung steht, waren die Muster in smalltalk immer kürzer und manchmal bedeutend kürzer. Einige der Merkmale der klassischen Entwurfsmuster sind wirklich Möglichkeiten, einem statisch typisierten System dynamische Merkmale hinzuzufügen (wie die bereits diskutierte AbstractFactory, in der Sie die richtige Klasse basierend auf Laufzeitdaten instanziieren). Andere sind in dynamischen Sprachen so viel kürzer, dass sie sich einfach in den idiomatischen Gebrauch der Sprache selbst einfügen.


10

Es ist geschehen. Dutzende, wenn nicht sogar Hunderte von Büchern wurden veröffentlicht, um die gesamte Informatik auf Entwurfsmuster zu reduzieren, während Verleger und Autoren versuchten, einen weiteren Zug zu erobern (oder zu erschaffen). Ich habe ein Regal von ihnen. Nie konsultiert, seitdem ich das erste Mal gescannt habe, und ja, ich war ein Trottel, weil dort wenig oder gar nichts von tatsächlichem Nutzen war oder das noch nicht gut bekannt war (siehe zum Beispiel Typ Objekt, das nicht mehr als die dritte Normalform ist, die über ausgedrückt wird) ein Dutzend Seiten statt eines Absatzes), und weil offensichtlich je weniger Muster desto besser: Ein Punkt, der den meisten Praktizierenden entgangen ist. In der Tat, als ich eine Widerlegung von Type Object postete, wurde ich angewiesen, meinen Text als Entwurfsmuster umzugestalten.Wahre Geschichte. Was auch einen anderen Mangel des Projekts zeigt: kein Überprüfungs-, Ausschluss- oder Ablehnungsmechanismus.

Tatsächlich hat die GoF nicht wirklich versucht, "Design Patterns" gründlich zu erforschen. Vielmehr beschäftigten sie sich mit einem viel größeren Projekt: der Einführung von „Mustersprache“ in CS mit all seinen bizarren Notationen von Kräften, Teilnehmern usw., die schlichtweg scheiterten, weil sie von Grund auf falsch gedacht und auch sinnlos waren.

Was sie erreicht haben, was nützlich war, waren zwei Dinge:

  • Veröffentlichen Sie einige nützliche Tricks wie das Besuchermuster
  • Geben Sie einen Standardsatz von Namen an, der größtenteils hängen geblieben ist: Factory, Adapter, Iterator, ... Wenn Sie sich CORBA ansehen, das unmittelbar zuvor entworfen wurde, werden Sie den Wert davon sehen: alle Arten von "fremden" Namen wie Interceptor , Diener, Makler, ...

Ein weiteres nützliches Konzept, das aufkam, war das "Anti-Pattern", z. B. "Log and Throw". Das Projekt wurde, wie viele Modeerscheinungen in CS, durch seine eigene Evangelisation und die irrtümliche Übernahme als eine weitere CS - Religion zum Scheitern verurteilt, und es ging den Weg der meisten dieser Religionen Fred Brooks (1965). Schade, dass wir das wirklich alle paar Jahre wieder entdecken müssen.


Ist es immer noch traurig, wenn es zu dieser Diskussion geführt hat (und zu allem, was dazu gehört)
r3wt

1
@ r3wt Nicht sequitur. Was ich sagte, ist traurig, dass die IT-Branche die Schwäche hat, zu glauben, dass jede neue Entwicklung die mythische Silberkugel sein wird, und im Übrigen, dass sie einige ihrer eigenen früheren Arbeiten vernichtet hat.
user207421

2
Betrachten Sie es aus einer anderen Perspektive. Es ist nicht traurig, wenn ich Ihre Antwort lese und lerne, den Fehler nicht zu wiederholen. Was Sie für selbstverständlich halten, ist für andere sehr nützlich.
r3wt

6

Es gab / gibt mehrere Bücher mit dem Titel PLoP ( Pattern Languages ​​of Program Design ), bei denen es sich jeweils um eine Sammlung von Beiträgen handelt, die auf einer jährlichen Konferenz vorgestellt wurden .

Beim Lesen der Bücher stellte ich fest, dass einige Muster interessant und für mich neu waren, einige davon als Standard (z. B. "halbes Objekt plus Protokoll").

Nein, die Sammlung der GoF war nicht erschöpfend und inspirierte / inspiriert die Menschen, neue zu sammeln / zu beschreiben / zu entdecken / zu erfinden.

Die "nur 12 zusätzlichen Muster, die im Wikipedia-Artikel aufgeführt sind", sind vermutlich auch keine vollständige Sammlung: dh es gibt andere, die anderswo dokumentiert sind, z. B. in den PLoP-Büchern und vielleicht auch anderswo.


Ja, Sie können Beschreibungen von Hunderten von Mustern finden, wenn Sie nach ihnen suchen. Aber keine davon scheint so beliebt zu sein wie die GoF.
Frank Puffer

Weil ich das GoF-Buch gern las, las ich mehr (Bücher), als sie (später) veröffentlicht wurden.
ChrisW

1
@FrankPuffer Ich wette, die Muster sind beliebt, auch wenn die Namen nicht sind.
Entkorken

5

Das Buch Gang of Four (GoF) enthält die meisten Muster, die ein erfahrener Programmierer in einer nicht funktionalen Sprache im Werkzeuggürtel hat. Es ist wie die Basis-Tools, mit denen alle Builder vertraut sind. Der Hauptbeitrag des Buches bestand darin , den Mustern, die von den meisten erfahrenen Programmierern zu dieser Zeit gebräuchlich waren , einen genau definierten Namen zu geben und so die Kommunikation zwischen Programmierern zu unterstützen, die über Entwurfsoptionen diskutieren.

Sie erwarten, dass ein Elektriker einige Werkzeuge hat, die ein normaler Builder nicht hat. Ebenso erwarten Sie, dass ein WPF-Programmierer die Entwurfsmuster für "Abhängigkeitseigenschaften" oder ein "SQL-Programmierer" die Entwurfsmuster für die Verwendung von Triggern kennt Erstellen Sie Audit-Daten.

Wir betrachten diese jedoch nicht als „Entwurfsmuster“, da sie nur mit einer Technologie verwendet werden.

Einige weitere moderne Design Pattern-Bücher sind „Refactoring, Improving the Design of Existing Code (Martin Fowler)“ und „Clean Code: Ein Handbuch für agiles Software-Handwerk (Robert C. Martin) “. Beide Bücher präsentieren den Inhalt als Transformationen, die Sie vornehmen Nach Ihrem aktuellen Code und nicht als "vorkonfektioniertes wiederverwendbares Design", es handelt sich jedoch ebenso um "Designmuster".


3

Hier ist ein Interview mit Erich Gamma, in dem er über ihre Auswahl von Mustern nachdenkt und darüber, was sie heute ändern würden (heute wie vor 10 Jahren, haha).

http://www.informit.com/articles/article.aspx?p=1404056

Larry: Wie würden Sie "Design Patterns" umgestalten?

Erich: Wir haben diese Übung im Jahr 2005 gemacht. Hier sind einige Notizen aus unserer Sitzung. Wir haben festgestellt, dass sich die objektorientierten Gestaltungsprinzipien und die meisten Muster seitdem nicht geändert haben. Wir wollten die Kategorisierung ändern, einige neue Mitglieder hinzufügen und auch einige der Muster löschen. Die meiste Diskussion drehte sich um die Änderung der Kategorisierung und insbesondere darum, welche Muster gelöscht werden sollen.

Bei der Diskussion, welche Muster fallen gelassen werden sollen, haben wir festgestellt, dass wir sie alle immer noch lieben. (Nicht wirklich - ich bin dafür, Singleton fallen zu lassen. Seine Verwendung ist fast immer ein Designgeruch.)

Hier sind einige der Änderungen:

  • Dolmetscher und Fliegengewicht sollten in eine separate Kategorie verschoben werden, die wir als "Sonstiges / Gemisch" bezeichnen, da es sich tatsächlich um andere Tiere als die anderen Muster handelt. Die Fabrikmethode wird auf die Fabrik verallgemeinert.
  • Die Kategorien sind: Core, Creational, Peripheral und Other. Hier geht es darum, die wichtigen Muster hervorzuheben und von den weniger häufig verwendeten zu trennen.
  • Die neuen Elemente sind: Null-Objekt, Typ-Objekt, Abhängigkeitsinjektion und Erweiterungsobjekt / Schnittstelle (siehe "Erweiterungsobjekt" in Pattern Languages ​​of Program Design 3, Addison-Wesley, 1997).
  • Dies waren die Kategorien:
    • Kern: Composite, Strategie, Status, Befehl, Iterator, Proxy, Template-Methode, Fassade
    • Creational: Factory, Prototyp, Builder, Abhängigkeitsinjektion
    • Peripherie: Abstrakte Fabrik, Besucher, Dekorateur, Vermittler, Typobjekt, Nullobjekt, Erweiterungsobjekt
    • Sonstiges: Fliegengewicht, Dolmetscher

Warum stimmst du mich schlecht? Bitte erläutern Sie dies in einem Kommentar, damit ich die Antwort verbessern kann.
Akuhn

3

Die tatsächlichen Muster in dem Buch sind manchmal wirklich nützlich, aber sie sind nur Beispiele für ein leistungsfähigeres Werkzeug, das das Buch Ihnen bietet: ein tiefes Verständnis, wann und wo es besser ist, monolithischen Code in unabhängige Teile zu schneiden, die durch eine Schnittstelle getrennt und geregelt werden .

Wenn Sie diese Fähigkeit erlernen, werden Sie feststellen, dass Sie sich nicht die genauen Details jedes einzelnen Musters merken müssen, da Sie die von Ihnen implementierte Lösung immer so schneiden können, wie es am besten zu ihrem Zweck passt. Die Idee, immer mehr Muster aufzuschreiben, erscheint daher sehr akademisch und sinnlos.


Guter Punkt, aber ich bezweifle, dass viele Leute das Buch (oder die Muster im Allgemeinen) so verstehen.
Frank Puffer

@ Lud1977 Wenn wir keine Geschichte aufzeichnen, was hindert die Zukunft daran, in die gleichen Fallen zu tappen? es muss also immer aufgezeichnet werden. es ist nicht sinnlos.
r3wt

2

Daher habe ich erwartet, dass die Anzahl der bekannten und dokumentierten Entwurfsmuster erheblich zunehmen wird.

Es ist nicht geschehen. Mehr als 20 Jahre nach Erscheinen des GoF-Buches sind im Wikipedia-Artikel nur 12 zusätzliche Muster aufgeführt, von denen die meisten viel weniger beliebt sind als die ursprünglichen. (Ich habe die Parallelitätsmuster hier nicht angegeben, da sie ein bestimmtes Thema abdecken.)

Das GoF-Buch und Wikipedia sind kaum die einzige Quelle bekannter Designmuster. Wenn Sie nur nach "Design Patterns" in Amazon.com suchen, erhalten Sie Hunderte von Büchern (versuchen Sie diese Suche ). Ich denke, sie listen nur das bekannteste Muster im Wikipedia-Artikel auf .

Das Problem ist also nicht, dass es nicht genügend dokumentierte Entwurfsmuster gibt. Vielmehr gibt es so viele, dass sich niemand alle merken kann und die meisten Programmierer nur wenige erkennen. Das große Versprechen der gemeinsamen Mustersprache bricht an dieser Stelle zusammen.


-1

Es gibt wahrscheinlich viele Strukturen, an die noch nicht gedacht wurde. Solange Menschen Software entwickeln, werden Design-Herausforderungen zu bewältigen sein. Einige davon lassen sich möglicherweise mit cleveren neuen Mustern lösen, die andere verwenden könnten.

Programmiersprachen wurden entwickelt und weiterentwickelt, um die am häufigsten verwendeten Muster zu abstrahieren. Diese Muster existieren noch in der Gestaltung der Sprachen. Sie werden heute vielleicht ignoriert, aber das macht sie nicht unwichtig.

Ist das Wissen, wie man ein Haus baut, plötzlich unwichtig, wenn wir Roboter haben, die es für uns tun können? Ich würde nein argumentieren, ist es nicht. Es ist sicher weniger relevant - und wahrscheinlich auch weniger lohnend zu studieren, da die Nachfrage stark gesunken ist und niemand anderes es studiert.

Also nein, ich glaube nicht, dass der Musterraum, wie Sie ihn nennen, erschöpft ist. Wie eine andere Antwort hervorhob, ist es wahrscheinlich unendlich. Aber mit dem Nachlassen der Nachfrage nach Systemdesign, der Erhöhung unseres Abstraktionsturms und der Leistungsfähigkeit unserer Programmiersprachen werden immer weniger Leute, die sich auf den obersten Ebenen aufhalten, auf die Details des Turmbaus achten .


-2

Muster sind unendlich. Sie können jedes Muster optimieren oder mischen, um neue zu erstellen. Enterprise-Integrationsmuster sind ebenfalls gut definiert für jede Domain entwickeln sich Muster und sie ändern sich auch für ausdrucksstarke Sprachen wie Python oder Scala.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.