it-swarm-eu.dev

Wann sollte ich Entwurfsmuster verwenden - und nicht verwenden?

In eine frühere Frage von mir zu Stack Overflow , FredOverflow in den Kommentaren erwähnt:

Beachten Sie, dass Muster die Qualität Ihres Codes nicht auf magische Weise verbessern.

und

Jedes Qualitätsmaß, das Sie sich vorstellen können. Muster sind kein Allheilmittel. Ich habe einmal ein Tetris-Spiel mit ungefähr 100 Klassen geschrieben, das alle Muster enthielt, die ich damals kannte. Warum ein einfaches if/else verwenden, wenn Sie ein Muster verwenden können? OO ist gut und die Muster sind noch besser, oder? Nein, es war ein schrecklicher, überentwickelter Mist.

Diese Kommentare verwirren mich ziemlich: Ich weiß, dass Entwurfsmuster dazu beitragen, Code wiederverwendbar und lesbar zu machen, aber wann sollte ich Entwurfsmuster verwenden und, was vielleicht noch wichtiger ist, wann sollte ich vermeiden, mich von ihnen mitreißen zu lassen?

57
ashmish2

KUSS zuerst, Muster später, vielleicht viel später. Ein Muster ist meistens ein Geisteszustand. Versuchen Sie niemals, Ihren Code in ein bestimmtes Muster zu zwingen, sondern bemerken Sie, welche Muster aus Ihrem Code herauskristallisieren, und helfen Sie ihnen ein wenig.

Die Entscheidung "OK, ich werde ein Programm schreiben, das X mit Muster Y ausführt" ist ein Rezept für eine Katastrophe. Es könnte für Hallo Weltklasse-Programme funktionieren, die zur Demonstration der Codekonstrukte für Muster geeignet sind, aber nicht viel mehr.

99
jwenting

Ich denke, das Hauptanliegen ist, dass Menschen oft dazu neigen, Designmuster zu missbrauchen. Sie lernen ein paar, sehen, wie nützlich sie sind, und ohne es zu merken, verwandeln sie diese wenigen Muster in eine Art goldenen Hammer, den sie dann auf alles anwenden.

Der Schlüssel ist nicht unbedingt, die Muster selbst zu lernen. Der Schlüssel besteht darin, zu lernen, die Szenarien und Probleme zu identifizieren, mit denen sich die Muster befassen sollen. Dann ist das Anwenden des Musters einfach eine Frage der Verwendung des richtigen Werkzeugs für den Job. Es ist die Aufgabe, die identifiziert und verstanden werden muss, bevor das Werkzeug ausgewählt werden kann.

Und manchmal ist es ein seltsames Setup und es gibt kein Cut-and-Dry-Muster, um es sofort zu lösen. An diesem Punkt muss dem Problem mehr Aufmerksamkeit geschenkt werden als der Lösung. Teilen Sie es in Komponentenprobleme auf, identifizieren Sie Bereiche des Problems, die gemeinsame Merkmale mit Problemen aufweisen, die durch bekannte Muster behoben werden, passen Sie die Muster an das Problem an usw.

52
David

Ein Entwurfsmuster funktioniert am besten, wenn es in Ihrem Team als gemeinsame Sprache verwendet wird.

Damit meine ich, Sie können etwas sagen wie "Diese Klasse ist eine Singleton , die unser IHairyWidget implementiert Abstract Factory " und jeder in Ihrem Team versteht, was das bedeutet, ohne auf detaillierte Erklärungen eingehen zu müssen.

Designmuster scheitern, wenn das Team sie nicht versteht oder wenn sie so oft überbeansprucht werden, dass sie das Design nicht mehr klarer machen und es stattdessen schwieriger machen, zu verstehen, was wirklich vor sich geht.

24
GrahamS

vielleicht ein bisschen abseits des Themas, aber ich denke, es deckt auch Ihre Frage ab: Ich würde Ihnen ein gutes Buch vorschlagen Refactoring to Patterns :

Dieses Buch führt in die Theorie und Praxis von mustergesteuerten Refactorings ein: Sequenzen von Refactorings auf niedriger Ebene, die es Designern ermöglichen, sich sicher zu bewegen Designs zu, auf oder von Musterimplementierungen weg. Mit Code aus realen Projekten dokumentiert Kerievsky das Denken und die Schritte, die über zwei Dutzend musterbasierten Design-Transformationen zugrunde liegen. Unterwegs bietet er Einblicke in Musterunterschiede und wie man Muster auf einfachste Weise implementiert.

sie finden Beispiele, wenn Entwurfsmuster gut zu verwenden sind und wenn Sie sie entfernen müssen, um die Anwendung nicht zu komplizieren. Und ja, die Hauptidee ist, alles so einfach wie möglich zu halten.

Eine gute Antwort/ein guter Rat auf Ihre Frage war in Artikel Erkennen Sie die 4 Frühwarnzeichen für Missbrauch von Entwurfsmustern? , aber ich kann sie jetzt nicht laden, Fehler 500. Sie ist nicht groß, also ich habe gerade den Google Cache benutzt, um es zu bekommen:

Software-Design-Muster können und müssen zu Überentwicklung führen

Überentwicklung ist der Prozess, etwas zu komplizieren. Im Falle der Programmierung wird Ihr Code komplexer und möglicherweise flexibler als nötig. Insbesondere Implementierung komplexer Software-Entwurfsmuster bei einfachen Problemen.

1. Einfach anfangen nicht komplex

Wie kommt es dazu? Normalerweise programmieren Sie zusätzliche Funktionen, von denen Sie erwarten, dass sie später verwendet werden oder sich als nützlich erweisen. Aber was passiert, wenn dieses Bedürfnis nie eintritt? In den meisten Fällen bleibt die Kruft dort zurück. Es wird nicht entfernt. Daher wächst das Softwaresystem mit all diesen Funktionen, die nie verwendet werden, weiter an Größe und Komplexität.

2. Sei vorsichtig mit den Zeichen

Dies ist vielleicht für jeden anders, aber ich vermute, dass es in den meisten Fällen keine bewusste Anstrengung ist. Es ist vielmehr etwas, das durch die Angst hervorgerufen wird, mit einem unangenehmen, uneleganten, unangemessenen oder einfach gesagt schlechten Design festzuhalten. an etwas hängen bleiben, das einfach nicht flexibel genug ist. Ironischerweise sind Sie wieder da, wo Sie angefangen haben, wenn Sie über das Engineering oder das Anwenden von Mustern hinausgehen.

Software-Design-Muster sprechen Programmierer oder Entwickler an, weil sie es ihnen ermöglichen, schöne Architekturen auf natürliche Weise auszudrücken und zu erstellen. Es ist ein Teil des kreativen Programmierens.

. Ziehen Sie in Betracht, ein Muster umzugestalten, anstatt von einem zu beginnen

Was könnte ein guter Weg sein, um diesen Missbrauch von Designmustern zu vermeiden? Ziehen Sie in Betracht, ein Muster umzugestalten, anstatt von einem zu beginnen. Versuchen Sie nicht, ein Muster in Ihr Design zu zwingen. Wahrscheinlich könnte Ihr Design ohne es viel einfacher sein. Wenn Sie zu einem späteren Zeitpunkt feststellen, dass Ihr Design wirklich von einem strukturierten Muster profitieren kann, sollten Sie es umgestalten, um dies zu berücksichtigen. Lösen Sie das Problem beim Entwerfen auf einfachste Weise. Einfache, leichte Software ist immer eine gute Sache. Es gibt bessere Möglichkeiten, die unterentwickelte Alternative zu vermeiden, bei der Sie bei einem Design oder einer Lösung hängen bleiben, die einfach nicht flexibel genug ist oder nicht zum Problem passt.

4. Zwingen Sie sich nicht, es gleich beim ersten Mal richtig zu machen

Das Erzwingen von Software-Entwurfsmustern oder -strukturen in das Design ist einfach nicht die Antwort, das ist nur schlechtes Design. Das Prototyping oder das Erstellen eines ersten Builds0 (Proof-of-Concept-Build vor Produktionsbeginn für das eigentliche Produkt) kann jedoch dazu beitragen, dies und das Problem der Überentwicklung zu vermeiden. Weil Sie nicht das Gefühl haben, es beim ersten Mal perfekt machen zu müssen.

Ursprüngliche URL (jetzt tot): http://codelines.net.au/article/do-you-recognise-the-4-early-warning-signs-of-design-pattern-abuse/

14
Maxym

wann soll man aufhören, alles mit Mustern zu machen?

Die Frage ist, wann haben Sie angefangen, alles mit Mustern zu machen? Nicht alle Lösungen passen genau in ein vorhandenes Entwurfsmuster, und die Übernahme eines Musters kann dazu führen, dass Sie die Sauberkeit Ihrer Lösung trüben. Möglicherweise stellen Sie fest, dass Sie anstelle des Entwurfsmusters, das Ihr Problem löst, ein weiteres Problem generieren, indem Sie versuchen, Ihre Lösung zu erzwingen passend ein Entwurfsmuster.

Wenn Sie das richtige Entwurfsmuster für ein bestimmtes Szenario auswählen, haben Sie natürlich kein Problem. Die Auswahl des richtigen Musters ist jedoch leichter gesagt als getan.

Ich habe eine Überbeanspruchung von Mustern in Projekten gesehen, in denen sie wirklich nicht notwendig sind.

Ich denke, der Schlüssel ist - Versuchen Sie, Ihren Code sauber, modular und lesbar zu halten, und stellen Sie sicher, dass Ihre Klassen nicht eng gekoppelt sind =. Möglicherweise stellen Sie fest, dass Sie versehentlich eine Variation eines Standardentwurfsmusters verwendet haben. Vielleicht hätten Sie dies gleich zu Beginn Ihres Projekts erkannt, bevor Sie mit dem Codieren begonnen haben. Wenn Sie wie die meisten Leute, die ich kenne (einschließlich mir selbst), codieren, dann wahrscheinlich nicht :)

9
El Ronnoco

Das Wichtigste ist, das Problem zu kennen, das Sie lösen. Dann müssen Sie entscheiden, ob die Einführung eines Musters Ihnen einige Vorteile gegenüber der Nichtverwendung verschafft (Leistungsgewinn, Einfachheit oder was auch immer). Verwandte Fragen: https://stackoverflow.com/questions/85272/how-do-you-know-when-to-use-design-patterns

5
sinek

Das Nein. von Designmustern, die im ursprünglichen/de-facto-Go-to-Text zu diesem Thema erwähnt werden, d. h. GoF erfordert einiges an Erfahrung und oft mehrere erneute Lesevorgänge sowie Brainstorming mit kompetenten Kollegen, um sie zu meistern. Nach dieser Phase kommen bei einem Problem und einer Architektur oft die natürlichsten Designmuster auf ziemlich offensichtliche Weise heraus. Jeder Versuch, das Entwurfsmuster zwangsweise an Probleme anzupassen oder Probleme auf Entwurfsmuster abzubilden, ist jedoch mit Gefahren verbunden. In diesem Fall ist es am besten, Experten zu konsultieren, ein wenig Brainstorming durchzuführen und es als Lernerfahrung zu betrachten. Wenn Sie mit den üblicherweise verwendeten 10-maligen Designmustern nicht vertraut sind, wird dies etwas schwierig bleiben, und AFAIK, es gibt keine Abkürzungen.

Ich bin auf Millionen von SLOC C++ - Codeprojekten mit zahlreichen Beispielen für Force-Fit-Entwurfsmuster gestoßen, also Fehler s.a. Überbeanspruchung ist keine Seltenheit.

4
icarus74

So geht es mit jedem Thema, bei dem Sie Regeln lernen und anwenden müssen :

  1. Wenn Sie ein Neuling sind, müssen Sie die Regeln befolgen, weil Sie es nicht besser wissen.
  2. Wenn Sie ein Amateur sind, folgen Sie den Rollen, weil Sie wissen, warum Sie sie brauchen.
  3. Wenn Sie ein Profi sind, arbeiten Sie mit den Regeln und nicht gegen sie. Sie wissen genau, was Sie verwenden sollen, wo und wann sie nicht gelten.
  4. Wenn Sie ein Experte sind, ignorieren Sie die Regeln.
  5. Wenn Sie Ihre Kunst beherrschen, bevorzugen Sie die Regeln, da Ihr Code auch von Personen der Kategorie 1-3 gesehen werden muss. :) :)

Das Gleiche gilt für Kampfkunst, Malen, Schreiben, Fußball, Mechanik, Rennfahren usw. usw.

Als # 5-Typ bringt man den # 1- # 4-Jungs normalerweise bei, wie man der Top wird, also gilt dies immer, auch in wettbewerbsorientierten Kontexten.

( Wie man die Regeln überschreitet und ignoriert erklärt dies im allgemeinen Sinne, aber es gibt wahrscheinlich bessere Aufsätze da draußen.)

4
Macke

Die Regel ist, dass es keine Regel gibt. Ihre Erfahrung (Erfolg mehr als Misserfolg) zeigt Ihnen, wann Sie sie rein verwenden, wann Sie sie anpassen oder wann Sie sie überhaupt nicht verwenden sollten.

Es gibt eine Präsentation von Dan North, in der er ein wenig über Lernen und Muster spricht

3
Augusto

Halte alles so einfach wie möglich. Wenn Sie jedoch ein Problem lösen müssen, möchten Sie möglicherweise ein Entwurfsmuster verwenden, anstatt das Rad neu zu erfinden, da viele Entwurfsmuster Lösungen für häufig auftretende Probleme bieten. Aber wie gesagt: benutze sie nur, wenn sie wirklich gebraucht werden.

2
Puce

Vielleicht verwenden Sie das KISS DRY SoC-Muster) (ja, vielleicht ist es kein Muster, aber es klingt lustig).

Halten Sie es einfach blöd.
Wiederholen Sie sich nicht.
Trennung von Bedenken.

Ich denke, diese drei Punkte sollten für jeden Programmierer inspirierend sein.

2
Fredrik Norlin

Das Problem mit "Mustern" ist, dass alles als Muster betrachtet werden kann und oft ist.

Ich hatte Code schon lange professionell entwickelt, bevor ich zum ersten Mal jemanden über "Muster" sprechen hörte, und ich habe es all die Jahre gut geschafft. Wenn ich zurückblicke, folgten viele der Dinge, die ich geschrieben habe, zumindest teilweise einigen der bekannten Muster.

Mein Punkt ist, dass es nicht wirklich die Antwort ist, einem bestimmten Muster streng zu folgen. Erfahren Sie mehr über neue Muster, aber binden Sie sich nicht an sie: Sie werden sich ändern. Gute Codierungspraxis heute ist nicht dasselbe wie gute Codierungspraxis vor zehn Jahren, und egal wie klug die heutigen Programmierer sind, Sie können sicher sein, dass in zehn Jahren Dinge, die heute als gute Praxis gelten, abgelöst werden.

Off Topic: Persönlich hasse ich die Verwendung der Wortmuster in diesem Zusammenhang wirklich. Es stinkt nach unnötigem Jargon.

1
Spudley

Normalerweise werden Entwurfsmuster verwendet, um dem breiteren Publikum zu erklären, was Ihr Code wirklich tut. Auf diese Weise können die Leute leichter verstehen, was Sie tun. Man verwendet es selten als Referenz, um Lösungen zu finden, da ein Muster tatsächlich auf viele Arten implementiert werden kann.

0
Gaurav Sehgal

Die Art und Weise, wie Sie die Logik Ihres Codes strukturieren, sollte es einem Neuling in diesem Code ermöglichen, ihn zu interpretieren und zu ändern. Ein Muster zu haben, nur weil es eine bewährte Methode ist, bringt Sie nicht weiter, wenn Sie den Kontext nicht vollständig verstehen, wie, wer und wo dieser Code ist und möglicherweise verwendet werden könnte.

Das Muster "Keep it simple" ist eher ein gesunder Menschenverstand als ein Muster und muss beim Erstellen von Code Teil des Denkprozesses eines Entwicklers sein. Angenommen, jeder bekommt ein bestimmtes Muster, ist auch nicht unbedingt korrekt. Idealerweise möchten Sie ein Muster, das ohne so viel Wissen gelesen und identifiziert werden kann.

0

Imho, du wirst es einfach wissen. Ich meine, ich habe sogar ein Designmuster verwendet, bevor ich die Definition des Designmusters kannte. Es ist nur eine gute Codierung. Manchmal können Sie es beim Schreiben der Projektanforderungen erkennen und manchmal müssen Sie Ihren Code umgestalten.

jwenting sagte KISS zuerst, Muster später . Ich denke, Muster sind eine Möglichkeit, [~ # ~] [~ # ~] ein Projekt zu küssen, weil Sie etwas anwenden können, von dem Sie wissen, dass es funktioniert und es schonen wird Ihre Zeit in der Zukunft.

Das einzige, was schief gehen könnte, ist, dass es viele Möglichkeiten gibt, ein einzelnes Entwurfsmuster zu implementieren, sogar in derselben Sprache. Sie müssen also vollständig verstehen, was Ihr Problem ist.

0
dierre