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?
c#
design-patterns
Carl Sagan
quelle
quelle
Antworten:
Ein wesentlicher Irrtum in der heutigen Codierungswelt ist, dass Muster Bausteine sind. Nehmen Sie ein
AbstractFactory
Hier und einFlyweight
Dort und vielleicht einSingleton
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 :
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).
quelle
Ich frage mich:
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.
quelle