Wann soll welches Muster verwendet werden? [geschlossen]

7

Als Junior-Entwickler bin ich etwas verwirrt über einige Design-Muster. Manchmal weiß ich einfach nicht, welches ich in welchem ​​Kontext verwenden soll.

Zum Beispiel, auf schöpferischen Mustern, ich weiß nicht wirklich wann zu verwenden:

  • Fabrik
  • Prototyp
  • Builder

Tatsächlich sehe ich einige Unterschiede; aber ich sehe auch, dass Sie mehrere Lösungen wie:

verwenden können
  • Aufruf einer Factory, die den entsprechenden Builder aufruft, der einen Prototyp klont.
  • Aufruf einer Fabrik, die den entsprechenden Prototyp klont
  • Aufruf eines Builders mit dem entsprechenden Director
  • ...

Ich meine, das Ergebnis dieser Kreationen ist am Ende das selbe: Sie erhalten Ihre Objektinstanz.

Ich frage mich nur, welche Art von Design Sie in verschiedenen Kontexten verwenden würden (ich denke, es könnte abhängig von Performance-Anforderungen, Komplexität von Objekten, Kopplung sein ...)

Außerdem sehe ich keine großen Unterschiede zwischen einer Fassade und einem Mediator , außer dass der Mediator verschiedene Schnittstellen aufruft.

Dasselbe gilt für die Kette der Verantwortung , verstehe nicht wirklich, warum alle Implementierungen, die ich sehe, verkettete Listen verwenden. Kann dieses Muster nicht mit einer einfachen Liste von Handlern implementiert werden, die wir nacheinander aufrufen?

Deshalb möchte ich, dass die Leute mir sagen, in welchem ​​ konkreten Kontext Sie ein GoF-Muster verwenden würden und warum Sie auch keines der anderen Muster verwenden würden, die zu dem passen könnten gegebenes Problem (aber wahrscheinlich auf eine weniger elegante Art).

Danke

    
Sebastien Lorber 21.09.2010, 12:09
quelle

6 Antworten

13

Wie viele Leute, als ich zum ersten Mal auf Designmuster stieß, wurde mir klar, dass viele von ihnen nur Namen für Mechanismen waren, mit denen ich bereits Designprobleme gelöst hatte. Das Problem kam zuerst, dann die Lösung. Ich bin nie Designmustern begegnet, als wären sie Puzzleteile, die irgendwo passen müssen.

Sie sind nicht wirklich verpflichtet, ein Problem mit dem Namen eines Musters zu beantworten, als ob es eine Prüfung wäre. Der Weg dazu ist, sich hinzusetzen und darüber nachzudenken, wofür Sie Ihren Code benötigen und wie er sich in Zukunft ändern kann. So sind wir zu diesen Designmustern gekommen. Die Leute benutzten die gleichen Tricks, um eine bestimmte Menge von Problemen zu lösen, bis schließlich jemand kam und diesen Tricks Namen gab.

Das einzige Problem, das Sie haben, ist mangelnder Erfahrung, und das kann nicht nur durch SO behoben werden. Während Sie Software schreiben, werden Sie immer etwas falsch verstehen. Du wirst entdecken, dass, wenn du Dinge so gemacht hättest, wären sie besser gewesen. Übrigens hat dieser Weg einen Namen; "abstrakte Fabrik", "Adapter", "Beobachter", was auch immer. In Zukunft werden Sie wissen wann und warum Sie es verwenden. Für jetzt erinnere dich an das KISS-Prinzip. Kompliziere Dinge, die nicht kompliziert sein müssen.

Die Tatsache, dass Sie Design-Muster kennen, bevor Sie wissen, wie Sie sie verwenden, bedeutet, dass Sie den meisten Entwicklern einen Schritt voraus sind. Schwitzen Sie es nicht zu sehr, denken Sie daran, dass das nächste Mal, wenn Sie ein Problem haben, eine von ihnen eine akzeptable Antwort sein könnte. Nach und nach werden Sie herausfinden, wann ein Designmuster verwendet werden sollte und wann nicht.

    
Manos Dilaverakis 21.09.2010, 13:16
quelle
3

Was ich in dieser Antwort am meisten betonen möchte, ist meine Meinungsverschiedenheit mit diesem Teil einer anderen Antwort:

  

Es ist schwierig (wie Sie bemerkt haben), ein Muster zum ersten Mal anzuwenden und zu verstehen, was die Vorteile sein könnten

Sie müssen einen klaren Vorteil sehen, den das Muster vor der Anwendung gibt. Wenn dies nicht der Fall ist, verwenden Sie es nicht. Das Hinzufügen von Mustern zu Ihrem Code, die keine eindeutigen Vorteile ergeben, wird sehr wahrscheinlich in ein Anti-Pattern-Szenario fallen .

  

Deshalb möchte ich, dass die Leute mir sagen, in welchem ​​CONCRETE-Kontext Sie ein GoF-Muster verwenden würden, und auch, warum Sie keines der anderen Muster verwenden würden, die zu dem gegebenen Problem passen könnten (aber wahrscheinlich in einem weniger elegante Art).

Begrenzen Sie sich zunächst nicht auf das, was Sie dort lesen. Der beste Aspekt der Muster besteht darin, dass Sie Gestaltungsoptionen für verschiedene Szenarien erhalten können.

Natürlich gibt es Szenarien, die auf mehrere Arten gemacht werden können. Kämpfen Sie zwischen 2 Mustern in einem ganz bestimmten Szenario? überprüfen Sie sie noch einmal, sehen Sie, was sie über das Szenario und die Vorteile sagten.

Wenn Sie sich von der Menge der Muster überwältigt fühlen, geben Sie den meisten eine Pause. Stelle nicht alle Muster gleichzeitig in deine Fähigkeiten ein. Wählen Sie eine verwandte Handvoll von denen, und lernen Sie gut, wenn Sie sie anwenden (lesen Sie sie erneut, suchen / fragen Sie nach Vergleichen in SO / Blog-Posts.

Achten Sie immer darauf, wie gut die von Ihnen angewendeten Muster auf Änderungen reagieren und wie komplex der Code um sie herum ist. Stellen Sie sich die Frage, wie sich diese Merkmale bei den anderen alternativen Mustern unterscheiden.

Verstehen Sie schließlich, dass Sie einem sich entwickelnden Code-Ansatz am besten folgen. Tun Sie Ihr Bestes, um Ihren Code sauber zu halten, aber seien Sie nicht davon besessen, eine Lösung zu finden, die sich niemals ändern muss. Selbst mit den vorliegenden Mustern werden Sie einige Annahmen treffen, die sich auf das von Ihnen gewählte Muster auswirken können. Änderungen sind möglicherweise nicht im Einklang mit diesen Annahmen, ist eine Tatsache oder ein Leben.

Lesen Sie diese 2 E-Books , die Ihnen dabei helfen können, sich auf die Entwicklung / Entwicklung / Verbesserung von Code zu konzentrieren.

    
eglasius 21.09.2010 17:13
quelle
2

Am Anfang fand ich den einfachsten Weg, Muster zu lernen, eine Situation zu finden, die Hilfe benötigte (zu komplex, um sie auf einen Blick zu verstehen) und sie dann umzusetzen. Es ist schwierig zu verstehen, warum ein Muster nützlich ist, bis Sie ein Problem haben, das es wirklich erfordert.

Eine ausgezeichnete Quelle dafür ist 'Refactoring to Patterns' von Joshua Kerievsky.

    
Steve Jackson 21.09.2010 12:14
quelle
1

Verwenden Sie Ihre Kreativität Verwirrung:

  • Factory : Erstellt eine Instanz mehrerer abgeleiteter Klassen

  • Prototyp : Eine vollständig initialisierte Instanz, die kopiert oder geklont werden soll

  • Builder : Trennt die Objektkonstruktion von ihrer Repräsentation

Ich hatte kürzlich einen Fall, bei dem ich ein Objekt konstruieren muss, das eine Schnittstelle implementiert. Ich weiß nicht oder möchte nicht wissen, welches Objekt (oder welche Objekte) verwendet werden, um diese Schnittstelle zu implementieren. Da ich persönlich wollte die Objekte zu verstecken, musste ich ein Factory :

verwenden %Vor%

Und ich habe die Objekte versteckt, die innerhalb der Fabrik verwendet werden - solange ich eine Schnittstelle bekomme, bin ich gut zu gehen.

Ich möchte nicht einmal sehen die Objekte, die die Schnittstelle implementieren - sie sind eine komplizierte Menge von Objekten, auf die die Person, die sie benutzt, keinen Bedarf hat. Manchmal wird ein Objekt benötigt, manchmal ist es ein Mehrfaches. Das ist ein Detail, das ich in der Fabrik versteckt haben möchte.

Aber Sie sehen Sie sich dieselbe Situation an, Sie scheinen sich auf die Verwendung von prototype zu konzentrieren. Das heißt, Sie müssen Objekte erstellen, Eigenschaften festlegen und dann clone sie wie erforderlich. Das ist gut für Sie, wenn Sie wissen, welches Objekt Sie verwenden möchten. Sie müssen auch eine .Clone() -Methode für Ihre Objekte schreiben.

ich nicht möchte die Objekte sehen, meine Objekte unterstützen keine Clone() -Methode, und ich möchte keine schreiben. Das führt mich zurück zum Factory -Muster.

    
Ian Boyd 21.09.2010 17:47
quelle
0

Meine persönliche Sichtweise ist, dass Designmuster für sich allein in der realen Welt sehr begrenzt sind - ich sehe oft Muster als eine pas- sende Lösung "Du solltest das X-Muster verwenden", wenn es tatsächlich die reale Welt ist ist nicht so einheitlich wie ein Lehrbuch - Softwareentwicklung ist keine Ausnahme.

Obwohl das Verstehen und Erkennen von Mustern nützlich ist, sollten Sie sich nicht zu sehr darum bemühen, "Design Patterns" auf Probleme in der realen Welt anzuwenden, sondern stattdessen das Designmuster als Inspiration für die Lösung Ihrer eigenen Probleme verwenden, zum Beispiel wenn ich oft komme mit Lösungen, die Aspekte enthalten, die dem Fabrikmuster ähneln können, muss ich noch eine Klasse mit dem Wort "Factory" im Namen schreiben.

Wenn es wirklich so einfach wäre, Designmuster überall zu verwenden, wären wir alle arbeitslos! : -)

    
Justin 21.09.2010 12:44
quelle
0

Factory : Erstellt Objekte, ohne die Instanziierungslogik dem Client auszusetzen.

Prototyp : Geben Sie die Arten von Objekten an, die mit einer prototypischen Instanz erstellt werden sollen, und erstellen Sie neue Objekte, indem Sie diesen Prototyp kopieren.

Verwenden Sie dieses Muster beim Erstellen einer Instanz (mit neuem Operator) ist teuer. Im Allgemeinen wird clone() verwendet, um ein Objekt aus einem bestehenden Objekt zu erstellen.

Builder : Trennen Sie die Konstruktion eines komplexen Objekts von seiner Darstellung

Verwenden Sie dieses Muster, wenn Sie ein Objekt mit wenigen obligatorischen Attributen und vielen optionalen Attributen erstellen müssen. Die Bereitstellung eines Konstruktors zum Erstellen eines Objekts mit allen obligatorischen und optionalen Attributen ist komplex. Der Builder erleichtert diesen Konstruktionsprozess, indem er Schritt für Schritt vorgeht.

Builder konzentriert sich darauf, ein komplexes Objekt Schritt für Schritt aufzubauen. Abstract Factory betont eine Familie von Produktobjekten (entweder einfach oder komplex). Builder gibt das Produkt als letzten Schritt zurück, aber soweit es die Abstract Factory betrifft, wird das Produkt sofort zurückgegeben.

Fassade bietet eine vereinfachte Schnittstelle zu komplexen Systemen. Es umschließt eine Sammlung von APIs mit einer einzigen, gut gestalteten API.

Das

Mediator -Muster definiert ein Objekt (Mediator), das die Interaktion einer Gruppe von Objekten kapselt. Es ermöglicht viele-zu-viele Kommunikation.

Verwandte Beiträge:

Entwurfsmuster: Factory vs Factory-Methode vs Abstrakte Fabrik

Builder in separater Klasse (fließende Schnittstelle)

Was ist Fassadenmuster?

Mediator Vs Observer objektorientierte Entwurfsmuster

    
Ravindra babu 23.09.2016 18:30
quelle