Ein wesentlicher Irrtum in der heutigen Codierungswelt ist, dass Muster Bausteine sind. Nehmen Sie ein AbstractFactory
Hier und ein Flyweight
Dort und vielleicht ein Singleton
Dort 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).