Auswahl des richtigen Entwurfsmusters

32

Ich habe immer erkannt, wie wichtig es ist, Designmuster zu verwenden. Ich bin gespannt, wie andere Entwickler die am besten geeignete auswählen. Verwenden Sie eine Reihe von Merkmalen (wie ein Flussdiagramm), um sich zu entscheiden?

Beispielsweise:

Wenn Objekte verwandt sind, wir aber keine konkrete Klasse angeben möchten, ziehen Sie Abstract in Betracht

Wenn die Instanziierung abgeleiteten Klassen überlassen bleibt, ziehen Sie Factory in Betracht

Wenn Sie nacheinander auf Elemente eines Aggregatobjekts zugreifen müssen, versuchen Sie es mit Iterator

oder etwas ähnliches?

Carl Sagan
quelle
8
Was denkst du ist die Wichtigkeit? programmers.stackexchange.com/questions/70877/…
pdr
Ich denke, die Bedeutung liegt in der Fähigkeit, das am besten geeignete und ganzheitlichste Muster zu erkennen, um dies letztendlich anderen Entwicklern mitteilen zu können. Wenn das Sinn macht?
Carl Sagan
Ich bin mit @pdr einverstanden. Ich denke darüber nach, was ich tun muss, und wenn ich mich an den Namen des Musters erinnere, kann ich der Klasse einen Namen geben, damit andere wissen, was sie ebenfalls tut.
Amy Blankenship
4
Tatsächlich. Dies könnte einfach auf "Wie wählen Sie das richtige Design?" Erstens gibt es kein richtiges Design, nur viele falsche. Darüber hinaus kommt es mit Stapel Erfahrung (Auswahl der falschen).
Telastyn

Antworten:

109

Ein wesentlicher Irrtum in der heutigen Codierungswelt ist, dass Muster Bausteine ​​sind. Nehmen Sie ein AbstractFactoryHier und ein FlyweightDort und vielleicht ein SingletonDort und verbinden Sie sie mit XML und Presto. Sie haben eine funktionierende Anwendung.

Sie sind nicht.

Hmm, das war nicht groß genug.

Muster sind keine Bausteine

Das ist besser.

Ein Muster wird verwendet, wenn Sie feststellen, dass Sie ein Problem haben - Sie benötigen eine gewisse Flexibilität, die das Muster bietet, oder Sie sind gestolpert, wenn Sie eine kleine Sprache in der Konfigurationsdatei erstellen und "warten" sagen Moment, hör auf, das ist sein eigener Interpreter, den ich schreibe - das ist ein bekanntes und gelöstes Problem, benutze ein Interpreter-Muster . "

Beachten Sie jedoch, dass es sich um etwas handelt, das Sie in Ihrem Code entdecken , und nicht um etwas, mit dem Sie anfangen. Die Macher von Java sagten zu Beginn nicht "Oh, wir setzen ein Fliegengewicht in die Ganzzahl", sondern stellten ein Leistungsproblem fest, das durch ein Fliegengewicht gelöst werden konnte .

Und so gibt es kein "Flussdiagramm", mit dem Sie das richtige Muster finden. Das Muster ist eine Lösung für eine bestimmte Art von Problem, das immer wieder auftritt, und die wichtigsten Teile davon werden zu einem Muster destilliert.

Mit dem Muster anzufangen ist wie eine Lösung zu haben und nach einem Problem zu suchen. Das ist eine schlechte Sache: Es führt zu Überentwicklung und letztendlich zu Unflexibilität im Design.

Wenn Sie beim Schreiben von Code feststellen, dass Sie eine Factory schreiben, können Sie "ah ha! Das ist eine Factory, die ich gerade schreibe" sagen und Ihr Wissen über das Factory-Muster nutzen, um schnell das nächste Stück zu schreiben Code, ohne zu versuchen, das Factory-Muster neu zu entdecken. Aber du beginnst nicht mit "Ich habe hier eine Klasse, ich schreibe eine Fabrik dafür, damit sie flexibel ist" - weil es nicht so ist.

Hier ist ein Auszug aus einem Interview mit Erich Gamma (von Gamma, Helm, Johnson und Vissides ): Verwendung von Entwurfsmustern :

Der Versuch, alle Muster zu verwenden, ist eine schlechte Sache, da Sie am Ende synthetische Entwürfe haben - spekulative Entwürfe mit einer Flexibilität, die niemand braucht. Heutzutage ist Software zu komplex. Wir können es uns nicht leisten, darüber zu spekulieren, was es sonst noch tun soll. Wir müssen uns wirklich auf das konzentrieren, was es braucht. Deshalb überarbeite ich gerne Muster. Die Leute sollten lernen, dass sie, wenn sie ein bestimmtes Problem oder einen bestimmten Codegeruch haben, wie man es heutzutage nennt, in ihrer Pattern-Toolbox nach einer Lösung suchen können.


Die beste Hilfe für "Was ist wann zu verwenden?" Ist wahrscheinlich die Wikipedia-Seite für Software-Entwurfsmuster. Im Abschnitt "Klassifizierung und Liste" wird beschrieben, in welcher Kategorie sich jedes Muster befindet und was es tut. Es gibt kein Flussdiagramm. Die Beschreibung dort ist wahrscheinlich die beste, die Sie als kurzen Ausschnitt für "Was ist wann zu verwenden?" finden.

Beachten Sie, dass Sie in verschiedenen Programmierbereichen unterschiedliche Muster finden. Webdesign hat einen eigenen Satz von Mustern, während JEE (nicht Webdesign) einen anderen Satz von Mustern hat. Die Muster für die Finanzplanung unterscheiden sich grundlegend von denen für das eigenständige Design der Anwendungsoberfläche.

Jeder Versuch, sie alle aufzulisten, ist daher von Natur aus unvollständig. Sie finden eine, finden heraus, wie man sie benutzt, und dann wird sie irgendwann zur zweiten Natur und Sie müssen sich nicht mehr überlegen, wie oder wann Sie sie jemals wieder benutzen sollen (bis Sie jemand bittet, sie zu erklären).

Robert Harvey
quelle
11
+1 für "Lösung auf der Suche nach einem Problem." Wenn Sie die Muster kennen, können Sie die natürliche Entdeckung überspringen, wenn sich herausstellt, dass Sie ein Problem lösen müssen, das sie gerade lösen. Das Erlernen dieser Funktionen wird wahrscheinlich dazu beitragen, Ihre Codierungs- und Designfähigkeiten zu verbessern, genauso wie das Lesen des Codes anderer Personen oder das Erlernen einer anderen Programmiersprache. Aber Sie sollten auf keinen Fall aktiv versuchen, Muster in Ihren Code einzufügen.
Gregmac
1
Ich empfehle Entwicklern immer, sich mit Mustern zu beschäftigen, um sich zunächst mit den Gestaltungsprinzipien vertraut zu machen. Jedes Muster ist eine Illustration einiger Designprinzipien (Die SOLID-Prinzipien sind nur ein Beispiel).
ryscl
2
Vielleicht fügst du einen Dekorateur hinzu und eine Fassade, für die du eine App hättest ;-) Anders gesagt, der Sinn von Designmustern besteht darin, uns einen Namen zu geben, eine gemeinsame Sprache, wenn wir darüber diskutieren, was wir bauen. Es ist eine Abkürzung für einen Stapel hart erarbeiteten Entwicklungswissens.
EBarr
2
Lesen Sie hier zwischen den Zeilen die Schritte zur Auswahl eines Entwurfsmusters: 1. Denken Sie immer kritisch über den Code nach, in dem Sie arbeiten. 2. Abstrahieren Sie den spezifischen Code in ein Basisproblem. 3. Hat dieses Problem eine bekannte Lösung (Entwurfsmuster)? )? 4. Ja, wie wende ich diese Lösung auf meine spezifischen Anforderungen an? 5. Passen Sie die generische Lösung an das abstrakte Problem an, um eine Lösung für Ihr spezifisches Problem zu erstellen.
Chris
@ Chris, das fasst es wirklich zusammen. Es gibt auch nichts falsch zu schreiben , ohne Muster und dann Refactoring den Code in das entsprechende Muster , wenn das Design es braucht.
18

Ich frage mich:

  1. Welches Problem versuche ich zu lösen?
  2. Welches Software-Entwurfsmuster (falls vorhanden) löst das gleiche Problem am besten oder bietet einen logischen Weg zur Lösung meines Problems?
  3. Benötige ich die zusätzliche Abstraktion (und Komplexität), die das Muster bietet, oder ist es für mein spezielles Problem zu technisch? Kann das Problem auf einfachere und effizientere Weise ohne das Muster gelöst werden?

Der Auswahlprozess eines Softwaremusters ist nicht unähnlich dem Auswahlprozess einer Datenstruktur, mit der Ausnahme, dass Sie bei der Auswahl einer Datenstruktur die Leistungs- und Speichereigenschaften Ihres Problems bewerten und die Datenstruktur auswählen würden, die diesen Eigenschaften am besten entspricht.

Robert Harvey
quelle
Natürlich geht es hier um Erfahrung und Experten, nicht um einen Entwurf oder ein Flussdiagramm, und ich stimme Ihnen zu. Aber es muss einige Ressourcen geben, die voll genutzt werden können, wie ein fortgeschrittener Spickzettel, in dem er kategorisiert wurde, zumindest für den Fall, dass die wichtigsten und häufigsten Muster wie Fabrik usw. Ich bin nach so etwas wie den bekanntesten empfohlenen Situationen in Wofür du besser ein Muster verwenden würdest. Kennst du eine solche Ressource im Internet ?!
Pmpr
3
@Trix: sourcemaking.com/design_patterns
Robert Harvey