Sind Designmuster im Allgemeinen eine Kraft zum Guten oder zum Schlechten? [geschlossen]


33

Ich habe gehört, es argumentiert, dass Designmuster die beste Sache seit geschnittenem Brot sind. Ich habe auch gehört, dass Designmuster dazu neigen, das "Second System Syndrome" zu verschlimmern, dass sie massiv überbeansprucht werden und dass ihre Benutzer sich als bessere Designer fühlen, als sie wirklich sind.

Ich neige dazu, näher an das ehemalige Lager heranzukommen, aber in letzter Zeit habe ich Entwürfe gesehen, bei denen fast jede einzelne Interaktion durch eine Beobachterbeziehung ersetzt wird und alles ein Singleton ist.

Sind Entwurfsmuster in Anbetracht der Vorteile und Probleme im Allgemeinen gut oder schlecht und warum?

Antworten:


53

Entwurfsmuster sind eine Sprache , keine Empfehlung zum Schreiben eines Programms oder eines Vertrags. Ihre hauptsächliche Verwendung ist eine nachträgliche Erklärung, wie eine Komponente oder ein System implementiert wurde (oder werden wird). Anstatt auf zu viele Details einzugehen, können Sie nur ein paar Worte sagen, die die Implementierung gut genug beschreiben, damit der Hörer versteht, wie sie funktioniert und was wichtig ist.

Alex: Hey, wie werden die Konfigurationsdateien erstellt?

Bob: Sie werden von einer Fabrik erzeugt, die sich in befindet config.h.

Jetzt weiß Alex, dass das Erstellen von Konfigurationsdateien keine trivialen Vorbereitungen erfordert, da ihre Erstellung sonst nicht in einer Factory enthalten wäre.

Wenn Bob jedoch eine Fälschung mit Musterkopf war und nur hier und da Muster verwendete, konnte Alex nichts über das Erstellen von Konfigurationen erzählen, da Bob Factory einfach überall verwendete. Dies würde auch zu einer übermäßigen Komplexität des Programms führen.

Programmieren Sie also zuerst und erkennen Sie dann Muster in Ihrem Code, nicht umgekehrt. So werden sie effektiv eingesetzt.


11
+1 auf jeden Fall, aber vor allem für "then spot patterns" - genau so haben wir zuerst Muster erhalten, aber wir suchen nach wiederkehrenden Problemen .
Frank Shearar

16
Sie werden aus einem bestimmten Grund als Entwurfsmuster bezeichnet . Während beim Codieren nichts an Fleckenmustern falsch ist, ist es auch nicht falsch, geeignete Muster zu identifizieren, bevor das Codieren beginnt. Das Problem liegt darin, sich wie ein Hammer zu verhalten und zu denken, alles sei ein Nagel.
George Marian

11
Das Wichtigste ist, die Muster in der Funktionsweise des Codes zu erkennen , anstatt zu sagen, welches Designmuster für diesen Code verwendet werden soll, was zu bürokratischem Aufblähen des Codes führt. Besonders wenn Sie DPs missbrauchen, die auf eine Sprache in einer mit einer anderen Codierungsmethode abzielen.
Peter Boughton

Gute Antwort. Meine Definition der Übernahme: Jede Technik gilt erst als übernommen, wenn sie als ausführbares, kompilierbares Artefakt in der Erstellungskette identifiziert wurde. Keine Menge von Büchern, Blogs und schwer atmenden Handbewegungen, die eine einzige echte Anweisung in einer Build-Kette wert sind.

14

Designmuster sind großartig . Bei richtiger Verwendung wird der Code leichter zu verwalten, leichter zu lesen und leichter zu bearbeiten. Ein guter Programmierer muss wissen, wann er aufhören und sehen muss, dass jedes weitere Refactoring die Vorteile überwiegt. Die Verwendung von Entwurfsmustern allein macht niemanden zu einem guten Programmierer, aber wenn man weiß, wann und wo man sie verwendet, ist dies der Fall. Genau wie bei allem anderen auf dieser Welt können Designmuster zu Extremen werden und missbraucht werden. Ich weiß, dass ich immer noch nach der perfekten Balance in meinem Code suche (und das wird noch lange dauern), bei der jedes Designmuster einen Zweck hat und genau wie ein Puzzlestück zusammenpasst.


10

Designmuster sind großartig, wenn sie richtig verwendet werden.

Es ist nützlich sich daran zu erinnern, dass die Idee der Entwurfsmuster in der Architektur entstanden ist. Die Architektur kann sehr unterschiedlich sein. Es gibt jedoch viele Kernideen, die in jedem Gebäude vorhanden sind. Stellen Sie sich Muster auf diese Weise als Bausteine ​​des Designs vor. Es ist wichtig zu beachten, dass nicht jedes Gebäude alle möglichen Architekturmuster enthält.

Angenommen, Sie entwerfen ein Haus. Anstatt die Haustür zur Straße hin zu öffnen, möchten Sie einen geschützten Bereich vor dem Betreten des Hauses, dh einen Vorraum. Dieser Bereich passt zu einem bestimmten Muster. Es wird nämlich zwei Eingänge haben, einige Wände und wahrscheinlich ein Dach. Beachten Sie, dass das Muster keine Türen, Fenster oder wie viele Wände angibt. In den meisten Implementierungen gibt es zwei Türen, vier Wände und möglicherweise Fenster. Das Muster beschreibt jedoch einen geschlossenen Bereich mit zwei Eingängen. Einer führt von außerhalb des Hauses in den Vorraum selbst und der andere in den Rest des Hauses. Der Schlüssel hier ist, dass, wenn Sie einen Vorraum wünschen, Sie einen Bereich einschließen und zwei Eingänge in diesen Bereich zur Verfügung stellen müssen.

Die typischen Probleme mit Entwurfsmustern bei der Programmierung sind zu häufig und der Glaube, dass es sich bei ihnen um Wundermittel handelt, um ein Problem zu beheben. Sie sind nicht. Sie sind Wege zu kommunizieren und über nützliche Programmierideen nachzudenken. Wenn es sich bei den Syntaxelementen einer bestimmten Sprache um die Bausteine ​​und Mörtel handelt, beschreiben Muster nützliche Methoden, um sie so anzuordnen, dass sie bestimmten Anforderungen entsprechen.


+ 1 gute Erklärung, insbesondere, dass sie am besten beim Entwerfen des Systems verwendet werden. Leider beruht das Wissen darüber, wo und wie diese Muster verwendet werden, hauptsächlich auf der Erfahrung mit der Umgestaltung früherer Systeme, bei denen sie nur während der Implementierung entdeckt wurden. Meine Version ist also eine Nebenerweiterung: Zuerst überlegen, dann Code schreiben. Analysieren Sie dann das Ergebnis und überarbeiten Sie es, falls erforderlich und möglich. Das nächste Mal werden weitere Muster vor dem Codieren offensichtlich sein :-)
Lorand Kedves

7

Ich halte Designmuster eher für " Ratschläge " als für einen unveränderlichen Vertrag, der unbedingt eingehalten werden muss. Warum? Genau aus dem Grund, den Sie erwähnt haben. Das Befolgen eines Entwurfsmusters in allem führt zu einem großen Durcheinander von Code, der den Zweck der Verwendung eines Musters an erster Stelle zunichte macht.

Aus diesem Grund hasse ich Websites wie Java Practices . Sicher, einige der Ideen sind gut, aber dann hat der Autor beschlossen, ein komplettes Programm (plus ein Framework) nach jedem einzelnen von ihm erwähnten Entwurfsmuster zu schreiben. Der Autor schrieb auch jeden Artikel mit großen beängstigenden Zitaten, die den Leser denken lassen, dass die tatsächlichen Java-Praktiken schrecklich sind und wie die Pest vermieden werden sollten.

TL; DR: Verwenden Sie Designmuster. Missbrauche sie einfach nicht


Ich war im Allgemeinen zwischen skeptisch und zynisch in Bezug auf Designmuster. Ich glaube nicht , dass ich direkt Gelegenheit gehabt haben zu wollen , sie in meiner beruflichen Arbeit verwenden. Möglicherweise, weil ich kein Java oder "hardcore" OO C ++ verwende. Interessant. Richard Gabriel berichtet, dass der Urheber von Entwurfsmustern (Alexander in der Gebäudearchitektur) einige böse Fehler bei der tatsächlichen Anwendung von Entwurfsmustern auf Gebäude hatte und anscheinend nie die Qualität von Gebäuden erreichte, die Alexander mit Entwurfsmustern suchte.
Paul Nathan

2

Seet diesen Thread auch auf SO. Von einem anderen POV sind Entwurfsmuster Boilerplate-Code, um die Mängel der verwendeten Methodik zu kompensieren. Ich bin kein Fan davon, diese Problemumgehungen zu sehr zu feiern.


Und anstatt die Sprachen zu verwenden, die diese Muster weniger notwendig machen (Common Lisp und Smalltalk), werden weiterhin Sprachen verwendet, für die das Boilerplate erforderlich ist.
Frank Shearar

Genau meine Gedanken.
Fehlender Faktor

1
Design Patterns sollten niemals als Boilerplate betrachtet werden. Boilerplate ist definiert als "Codeabschnitte, die an vielen Stellen ohne oder mit nur geringen Änderungen eingefügt werden müssen". Auf der anderen Seite sind Entwurfsmuster nicht nur Codestücke. Dies sind umfassende Prinzipien zur Strukturierung von Code, um bestimmte Arten von Entwurfsproblemen zu lösen. Sie haben keine spezifische Implementierung. Die Implementierung von Entwurfsmustern sollte immer gemäß den Anforderungen eines Projekts variiert werden.
Kramii setzt Monica

@Kramii: Zum Beispiel ist ein "Funktionsobjekt" / "Funktor" in imperativen Programmiersprachen ein Boilerplate-Code im Vergleich zu funktionalen Sprachen, in denen Funktionen erstklassig sind. Sie müssen dort nichts codieren, es wird in der Sprache unterstützt. Umgekehrt müssen Sie in Haskell ein "Entwurfsmuster" namens "IO Monad" verwenden, um sequentielle, zwingende E / A zu erhalten, die Sie in zwingenden Sprachen kostenlos erhalten. Ich empfehle, dem Thread zu folgen, zu dem ich verlinkt habe.
LennyProgrammers

1
@ Lenny222: Ich habe den Link gelesen und bin damit einverstanden, dass Muster Mängel einer Sprache beseitigen. Ich bin jedoch nicht einverstanden mit Ihrer Verwendung des Begriffs "Boilerplate". Boilerplate bezieht sich normalerweise auf die wiederholte Implementierung desselben Codes - oft gleichbedeutend mit Copy-Paste-Code oder zumindest mit Code-Fragmenten mit Vorlagen. OTOH die Implementierung von Entwurfsmustern sollte je nach Anforderung auf unterschiedliche Weise implementiert werden.
Kramii Reinstate Monica

0

Ich werde die in der Mitte bevorzugen. Wie auf dem Poster richtig ausgeführt, macht Sie ein Verständnis der Muster nicht zu einem guten Entwickler. Andererseits hilft Ihnen ein Verständnis des Musters, ein guter Entwickler zu werden.

Das Verständnis der Beziehung von Mustern und das Sehen eines Musters in einem Projekt (während der Konzeptionsphase) machen Sie zu einem guten Entwickler.


0

Es wird oft gesagt, dass Entwurfsmuster eine vorgefertigte Lösung für Programmierprobleme darstellen. Was für Probleme sind das? "Wie kann ich das Objektverhalten ändern, aber die Änderungen vom Rest des Systems isolieren?"

Die GoF-Muster werden erkannt, um diese Isolation (Kapselung) vom Rest des Systems bereitzustellen, aber es ist oft schwierig zu wissen, welchem ​​Teil des Systems durch die Verwendung ihrer Entwurfsmuster Variabilität verliehen wird. Anstatt dem von ihnen vorgeschlagenen Klassifizierungsschema (kreativ, verhaltensbezogen und strukturell) zu folgen, habe ich die Unterschiede der Muster grafisch dargestellt und zwei andere Schemata zur Klassifizierung ihrer Muster entwickelt: Lebenszyklus- und Komponenten-Verkapselungshierarchie.

Design Pattern Encapsulation Hierarchie

Wie Sie dieser Tabelle für die Verkapselungshierarchie entnehmen können, können Entwurfsmuster auf jeder Ebene einer Komponente angewendet werden. Aber würde es Sinn machen? Muss die Komponente eine Verhaltensänderung auf der vorgeschlagenen Verkapselungsebene bereitstellen, und wird das richtige Muster für diese Ebene verwendet? Wenn diese Fragen nicht richtig beantwortet werden, werden die Entwurfsmuster höchstwahrscheinlich falsch angewendet. Nur weil ein vertikaler Drehpunkt in die Kabine eines Autos eingebaut werden könnte, ist dies keine gute Idee.


0

In Analogie zu Geld sollte ein Entwurfsmuster als Lösung mit hohen Kapitalkosten, aber niedrigen Betriebskosten betrachtet werden. Designmuster kosten im Voraus ein Vermögen in Bezug auf zusätzliche Kodierung, Ausführlichkeit und das konzeptionelle Gewicht der zusätzlichen Indirektion, die sie erzeugen. Sie neigen auch dazu, andere Aspekte Ihres Designs zu blockieren. Wenn Sie beispielsweise die Vorlagenmethode verwenden, werden Sie gezwungen, stark OO-programmiert zu sein.

Wenn Sie jedoch eine Menge eng verwandter Probleme lösen müssen, die sich in gewisser Weise geringfügig unterscheiden, oder in Zukunft einen Code auf bestimmte Weise stark ändern müssen, können sich die Vorabkosten aufgrund des Designs lohnen Muster verleihen Ihrem Code mehr Flexibilität. Die Modifikationen oder die Lösung des zweiten Ihrer eng verwandten Probleme wird mit Mustern viel einfacher sein als ohne.


0

Beide Lager sind richtig - sie sind eine Macht für das Gute, wenn sie richtig eingesetzt werden, eine Macht für das Schlechte, wenn sie überall verteilt sind.


0

Designmuster können ein Händchen für Sie sein, aber das Gleiche gilt für die Codierung im Allgemeinen. Wenn Sie die ultimative Toolbox schreiben, können Sie sich leicht verführen lassen - Sie müssen nur YAGNI im Hinterkopf behalten, um nicht vom Kurs abgehalten zu werden und ein Gefühl dafür zu bekommen, wie viel Struktur die Anwendung benötigt. IMO ist dies nur Sache des Einzelnen und ein Zeichen seiner Erfahrung / Urteilskraft.


0

Ich denke an Designdaten, nicht an etwas, das Sie ständig versuchen, auf Ihren Code anzuwenden. Für mich geht es hauptsächlich um eine gemeinsame Sprache für Entwickler. Es ist einfacher zu sagen "wir folgen einem Baumuster" als das Ganze immer wieder zu erklären.

Momentan lese ich Patterns Of Enterprise Application Architecture erneut , da ich auf eine Menge Code stoße, der einem der Muster aus diesem Buch folgt. Ich glaube nicht, dass es absichtlich ausgewählt wurde, um einem der Muster zu folgen, aber es hilft definitiv, wenn Sie sagen können, dass es ein Transaktionsskript ist und jeder ein klares Verständnis dafür hat, was das bedeutet.

Aber ich mag die Idee, dass Sie aus einem vorbereiteten Musterkatalog auswählen können, wenn Sie eine neue Funktionalität oder eine brandneue Anwendung entwerfen. Warum alles neu erfinden, wenn es bewährte Lösungen für bestimmte Probleme gibt?

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.