Sind Designmuster heutzutage wirklich wichtig?


107

Ich habe "Coders at Work" gelesen und festgestellt, dass einige der in dem Buch interviewten Fachleute nicht so begeistert von Designmustern sind.

Ich denke, dass es zwei Hauptgründe dafür gibt:

  1. Designmuster zwingen uns, in ihren Begriffen zu denken. Mit anderen Worten, es ist fast unmöglich, etwas Neues (vielleicht sogar Besseres) zu erfinden.

  2. Entwurfsmuster halten nicht ewig. Sprachen und Technologien ändern sich schnell. Daher werden Entwurfsmuster irgendwann irrelevant.

Vielleicht ist es wichtiger zu lernen, wie man ohne bestimmte Muster richtig programmiert und sie nicht lernt.

Der Punkt war auch, dass Menschen, die normalerweise mit einem Problem konfrontiert sind und nicht viel Zeit haben, versuchen, ein Muster zu verwenden. Dies bedeutet, dass Sie vorhandenen Code mit geringfügigen Änderungen kopieren und in Ihr Projekt einfügen müssen, damit er funktioniert. Wenn es Zeit ist, etwas zu ändern oder hinzuzufügen, weiß ein Entwickler nicht, wo er anfangen soll, weil es nicht sein Code ist und er nicht tief mit ihm vertraut ist.


79
Wenn das Anwenden eines Musters das Kopieren und Einfügen von vorhandenem Code bedeutet, dann machen Sie es wahrscheinlich falsch
Dyppl

9
unter Verwendung von Designmustern! = Frachtkultprogrammierung
jhocking

11
Der Titel dieser Frage kann umformuliert werden als "Ist es heutzutage nicht unbedingt erforderlich, das Rad neu zu erfinden?"
Eric King

2
Designmuster zwingen uns, in ihren Begriffen zu denken - wenn Sie es zulassen. Das Erkennen von Mustern ermöglicht es mir, Möglichkeiten für ein bestimmtes Designproblem zu prüfen. Oft ist es so, als würde man ein Restaurantmenü lesen ... "nein, nein, interessant, nein, hmm, a-ha!". Darüber hinaus machen moderne Sprachmerkmale die spezifischen Musterdiagramme, die vor Jahrzehnten kodifiziert wurden, oft archaisch.
Radarbob

Antworten:


261

Ich denke, für mein Geld fehlt jedem der Sinn von Designmustern. Es kommt selten vor, dass ich mich frage, welches Muster ich in einer bestimmten Situation verwenden soll. Außerdem habe ich die meisten dieser Muster verwendet, lange bevor ich wusste, dass sie Namen hatten.

Die Kraft von Designmustern liegt in der Kommunikation. Es ist für mich viel schneller zu sagen, "benutze eine Strategie dafür", als im Detail zu beschreiben, was ich vorschlage. Es ist für uns viel einfacher, die Vorteile von Fat-Domain-Modellen gegenüber Transaktionsskripten zu diskutieren, wenn wir alle wissen, was diese beiden Begriffe bedeuten. Und so weiter.

Und am stärksten ist es, wenn ich eine Klasse FooBuilder benannt habe, dann wissen Sie, dass ich das Builder-Muster verwende, um mein Foo zu generieren.

Auch wenn Sie nicht wissen, wovon ich spreche, wenn ich sage "Beobachtermuster ist ideal dafür", können Sie es ganz einfach googeln.

In diesem Sinne wird die Kraft von Designmustern niemals verblassen.


55
+1 für "Ich habe die meisten dieser Muster verwendet, lange bevor ich wusste, dass sie Namen hatten." Sie sind alle schon lange da, nur ohne die Musternomenklatur. 1991 schrieb ich Singletons in C und zeigte sie einem erfahreneren Programmierer, der sie noch nie zuvor gesehen hatte und sie für ziemlich geschickt hielt.
Bob Murphy

8
Muster verschwinden jedoch auch. In den 1950er Jahren war "Unterprogrammaufruf" ein recht beliebtes Muster. In C ist "Objekt" ein (etwas) beliebtes Muster. Beide sind praktisch ausgestorben, da sie in modernen Sprachen und (im Fall von Unterprogrammen) sogar in die Befehlssätze moderner CPUs aufgenommen wurden.
Jörg W Mittag

9
@Bob Murphy: Argh Singleton :( :( @pdr: Bei Mustern geht es genau genommen um Kommunikation über das Programmieren. Das Anwenden eines Musters, weil es fast passt, ist der größte Fehler, den man machen kann. Sie sollten nur dann in das Design einsteigen, wenn es darum geht, zu erklären, worüber Sie nachgedacht haben: "Es ist fast wie ein <Muster>, außer dass ich es optimiert habe ..." Ich denke, dass die sehr GOF es selbst anerkennen: Die Muster werden gekürzt / vereinfacht Visionen, sie müssen an die jeweilige Situation angepasst werden
Matthieu M.

10
@Jorg: Wann ist das Muster "Unterprogrammaufruf" verschwunden? Was ist Ihrer Meinung nach ein Methoden- / Funktionsaufruf?
Dunk

10
@Dunk: Das hängt natürlich von den Sprachen ab, die Sie verwenden. Ich weiß nicht, welche Sprachen Sie verwenden, aber in allen Sprachen, die ich heute verwende, sind Unterprogrammaufrufe eine integrierte Sprachfunktion und kein Entwurfsmuster. In C beispielsweise ist der Methodenaufruf jedoch ein Entwurfsmuster, während es sich in Java um eine integrierte Sprachfunktion handelt.
Jörg W Mittag

32

Design Patterns sind eine Steigerung der Ausdruckskraft der gemeinsamen Sprache, die wir als Softwareleute verwenden. Diese gemeinsame Sprache ist nicht wesentlich, aber sie erleichtert und beschleunigt das Ausdrücken vieler gängiger Problemlösungen. Zum Beispiel ist es viel einfacher, über Singletons zu sprechen, als über "Klassen, in denen wir nur eine Instanz haben sollen, die aber nicht statisch und global gemacht werden können".

Die Lösungen, die Entwurfsmuster bieten, sind nützlich, aber es sind Lösungen, an die Sie wahrscheinlich schon gedacht haben, wenn Sie mit den Problemen konfrontiert waren, die sie lösen. Ein gewisser Reifegrad ist erforderlich, um Entwurfsmuster zu verstehen. Wenn Sie das Problem nie lösen mussten, werden Sie den Wert oder das Interesse an der Lösung nicht erkennen.


15

Muster dienen hauptsächlich zwei Zwecken:

  • Vorhersehbare Lösung von Spannungen: Muster dienen dazu, bestimmte Spannungen auf eine Weise zu lösen, von der bekannt ist, dass sie funktionieren. Kent Beck, Autor von Smalltalk Best Practice Patterns , beschreibt Patterns als eine Möglichkeit, die Entscheidung zu wiederholen, die ein Experte unter ähnlichen Umständen treffen würde. Solange die Spannungen gleich bleiben (und dies häufig tun), bleiben die Muster, die sie auflösen, nützlich.

  • Kommunikationskraftmultiplikator : Muster erlauben es uns, viel mit wenig zu sagen. Sie nutzen eine kleine Reihe leistungsfähiger, gut verständlicher Konzepte, die in einer Vielzahl von Problembereichen anwendbar sind. Über den kommunikativen Wert von Mustern ist die Antwort von @ pdr hinfällig.


12

Ich halte die Behauptung, dass Designmuster Innovationen behindern, für völlig falsch. Sie sollten wissen, wo bereits vorhanden ist, damit Sie das Rad nicht neu erfinden müssen. Als temporär gelten Muster als Ganzes für OOP-Systeme und sind nicht an eine bestimmte Plattform oder Sprache gebunden.

Was ich nicht mag, wenn Leute über Muster sprechen, ist, dass einige Leute eine Art Besessenheit mit ihnen haben. Ich hatte einmal einen Kunden, der mich bat, "mindestens zwei weitere Muster einzuschließen" (WTF ?!), da mein Code mangels Modewörtern nicht unternehmerisch genug aussah.


3
Ich habe die Erfahrung gemacht, dass gut geschriebener Code mehreren Entwurfsmustern entspricht, gerade weil sie bewährte Verfahren beschreiben. Um Ihren Kunden zufriedenzustellen, sollte es nur darum gehen, welche Sie bereits verwendet haben, und deren Namen in die Dokumentation aufzunehmen. Einfach!
Donal Fellows

1
@Donal Fellows Das habe ich getan :) Am Ende habe ich Spotting-Muster gefunden und benannt, was dem Projekt ein Happy End verlieh. Mein größtes Problem ist, dass es ein sehr, sehr kleines Projekt war (ungefähr eine Woche Arbeit) und sehr unkompliziert: Es las Daten aus einem verrückten Datenformat, führte einige Transformationen durch, zeichnete die Daten und versenkte sie in eine Datenbank.
Vitor Py

@Vitor Da stimme ich dir voll zu. Ich persönlich kenne Leute, die denken, dass es eine schlechte Idee ist, nach einem Entwurfsmuster Ausschau zu halten, das zu Ihrem Problem / Szenario passt! Sie bevorzugen es, das Rad neu zu erfinden. Ich befürchte, dass sie eines Tages aufwachen und mich bitten, die Java IO-Klassen nicht zu verwenden und meine eigenen IO-Handler zu schreiben!
CKing

6

Vielleicht ist das Konzept der Anti-Muster deutsch. Ich halte das Studium von Entwurfsmustern nicht für den entscheidenden Schritt, um Software-Ingenieur zu werden. Software-Design ist wichtig, oft als Vorrecht des Software-Architekten für ein Projekt vorbehalten, aber realistisch etwas, das durch Konsens im sprichwörtlichen "gut gelaunten" Team herausgearbeitet werden kann.

Aber Designmuster und Anti-Muster bilden eine Ressource für diese Diskussionen. Man muss die Lektionen verstehen, die gut funktionierten (oder nicht) und wie man die Konsequenzen von Designentscheidungen ausnutzen (oder abmildern) kann. Ein gutes Team könnte sich für solche Diskussionen ein eigenes Vokabular einfallen lassen, aber es ist wirklich nicht so schlimm, auf die Defacto-Standards zu verweisen, die von Autoren ausgearbeitet wurden, die dort waren und dies getan haben.


3
"Anti-Muster" ist nur ein langatmiger Euphemismus für "schlecht".
Michael Shaw

@hardmath "Anti-Muster" bedeutet viel mehr als nur "schlecht"
GoatInTheMachine

1
@GoatInTheMachine: Ich stimme zu, das war ein Kommentar zu meinem Beitrag. Während Anti-Patterns Beispiele dafür sind, was zu vermeiden ist, weisen sie charakteristische Merkmale auf, die sie zu attraktiven Designentscheidungen machen. Manchmal ist es vernünftig, bewusst einem Anti-Muster zu folgen und seine Mängel und Fallen zu kennen.
Hardmath

4

Es gibt zwei Arten von Entwurfsmustern:

  1. Universelle Muster , bei denen es viel mehr darum geht, komplexe Programme so zu organisieren, dass Sie sie überhaupt verstehen können. Diese verschwinden nicht, obwohl weitere Beispiele dafür entdeckt werden können.
  2. Situationsmuster , die so stark in die durch die Beschränkungen (z. B. die Programmiersprache) induzierten Kräfte eingebunden sind, dass sie irrelevant werden, wenn sich diese Kräfte ändern.

OK, wohl alle Muster sind etwas situativ, aber bei einigen kommen die Kräfte aus der realen Welt, und bei anderen kommen die Kräfte aus den Werkzeugen. Werkzeuge ändern sich viel schneller als die reale Welt.


Alle Muster werden durch die Art und Weise definiert, in der sie bestimmte Spannungen auflösen. Solange die Spannungen gleich sind (und dies häufig der Fall ist, sind sie Muster ), bleiben die Muster nützlich.
Rein Henrichs

@Rein: Aber die Kräfte, die die Spannungen erzeugen, können intern oder extern sein. Verschiedene Sprachen haben unterschiedliche interne Kräfte (z. B. sind Muster in Bezug auf Schnittstellen aufgrund der unterschiedlichen Spannungen in ihren Klassensystemen für Java relevanter als für C ++).
Donal Fellows

Bestimmt. Ein Blick durch die Implementierungsmuster (Kent Becks Java-Musterbuch) zeigt eine ziemlich gleichmäßige Verteilung zwischen allgemeinen Mustern und solchen, die spezifischer für die Eigenschaften von Java sind. Der Vergleich dieses Buches mit Smalltalk Best Practice Patterns ist ebenfalls aufschlussreich.
Rein Henrichs

3

Über Entwurfsmuster zu lesen ist wie Mathematik zu lernen, anstatt sie neu zu erfinden. Keiner hält Sie davon ab, große Fortschritte in einem bestimmten Bereich zu erzielen, wenn Sie erst einmal ein solides Verständnis für das haben, was vorher war. Glaubst du, Rieman hat nie Euklid gelesen?


1

Das Entwerfen von Mustern hat den Vorteil, dass die Zeit, die Ihre Kollegen oder Kunden mit dem Gedanken "Wie funktioniert das?" Verbringen, verkürzt wird. Auch wenn es keinen Sinn macht, einen Standard zum Zwecke der Standardisierung durchzusetzen, haben Sie immer dann, wenn ein Programmierer nach diesem Muster sucht und dies erwartet, seine und Ihre Aufgaben erfüllt einfacher.


1

Ich glaube, dass die vierköpfige Bande selbst Designmuster als klassifiziert

eine gemeinsame Lösung für ein häufig auftretendes Problem *

Also ja, die Muster sind relevant, wenn die gleiche Art von Problem auftritt. Und das bringt uns zu einem Problem mit dem Begriff "Design Pattern". Ein Muster ist etwas Erkennbares, das wiederholt auftritt. In Wirklichkeit gibt es also kein Muster von Designs, sondern ein Muster von Problemen.

Einige Programmiersprachen haben möglicherweise native Lösungen für einige dieser Probleme. Das Buch "Design Patterns" selbst erwähnt, dass das Besuchermuster bei Verwendung von CLOS von geringem Wert ist, da Multi-Dispatch von CLOS unterstützt wird, dem eigentlichen Problem, das das Besuchermuster zu lösen versucht.

Darüber hinaus verfügt das .NET Framework über einen integrierten Ereignismechanismus zum Veröffentlichen von Ereignissen für mehrere Listener, sodass das Observer-Muster in diesem Kontext weniger relevant ist.

Der Wechsel von Desktop-Anwendungen zu Web-Anwendungen ** ändert auch die Art der zu lösenden Programmierprobleme. Viele der Muster im Buch "Design Patterns" sind für Desktop-Anwendungen relevant, jedoch weniger für Web-Anwendungen. Natürlich können diese Muster bei Apps mit nur einer Seite wieder auf der Clientseite relevant sein.

Aber die Entwurfsmuster und Bücher wie "Entwurfsmuster" oder "Muster der Unternehmensanwendungsarchitektur" sind von großem Wert, wenn Sie ein Anfänger in der Programmierung sind und zum ersten Mal mit einer neuen Art von Problem konfrontiert werden. Als ich das erste Mal war, wurde ich gebeten, die Undo-Funktionalität zu implementieren. Wäre da nicht das Buch "Design Patterns" gewesen, hätte meine Implementierung wahrscheinlich so etwas wie das Speichern eines Schnappschusses der Daten nach jeder Zustandsänderung *** gewesen - ein sehr fehleranfälliger und fürchterlich ineffizienter Ansatz.

Ja, einige Muster verlieren mit der Zeit an Relevanz, und wenn Sie ein erfahrener Programmierer werden, denken Sie weniger über sie nach. Für einen Neuling sind sie jedoch wertvoll, solange Sie sich daran erinnern, dass sie das Mittel zur Lösung eines Problems sind - und nicht die Aufgabe, so viele wie möglich zu verwenden.

* Das Zitat ist möglicherweise nicht 100% genau, da es aus dem Speicher stammt

** Nach meiner Erfahrung ist es in Unternehmen sehr verbreitet, Web-Bereitstellungsmechanismen für interne Branchenanwendungen zu wählen.

*** Nach dem Erlernen der funktionalen Programmierung und der funktionalen Datenstrukturen ist dies möglicherweise die Art und Weise, wie ich sie heute lösen würde.


-3

Das sklavische Festhalten an Designmustern kann sich nachteilig auswirken - Muster sind dokumentierte Lösungen für häufig auftretende Probleme, aber keine Bedienungsanleitungen. Nur weil sie ausführlich besprochen und in einigen Fällen außerhalb wirksamer Problembereiche angewendet werden, bedeutet dies jedoch nicht, dass sie überhaupt keinen Wert haben. Es handelt sich um eine Reihe von Grundsätzen, die beim Entwerfen der Programmarchitektur als Framework verwendet werden sollen. Auf diese Weise kann der Architekt einen Eindruck davon gewinnen, wie er die Lösung sehen möchte. Ein gutes Entwicklungsteam betrachtet sie eher als Grundlage für Funktionalität als als funktionale Spezifikation.


2
dies scheint nicht alles substantisl bieten über Punkte gemacht und erklärt in früheren Antworten
gnat
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.