Ich habe gehört, es argumentiert, dass Designmuster die beste Sache seit geschnittenem Brot sind. Ich habe auch gehört, dass Designmuster dazu neigen, das "Second System Syndrome" zu verschlimmern, dass sie massiv überbeansprucht werden und dass ihre Benutzer sich als bessere Designer fühlen, als sie wirklich sind.
Ich neige dazu, näher an das ehemalige Lager heranzukommen, aber in letzter Zeit habe ich Entwürfe gesehen, bei denen fast jede einzelne Interaktion durch eine Beobachterbeziehung ersetzt wird und alles ein Singleton ist.
Sind Entwurfsmuster in Anbetracht der Vorteile und Probleme im Allgemeinen gut oder schlecht und warum?
quelle
Designmuster sind großartig . Bei richtiger Verwendung wird der Code leichter zu verwalten, leichter zu lesen und leichter zu bearbeiten. Ein guter Programmierer muss wissen, wann er aufhören und sehen muss, dass jedes weitere Refactoring die Vorteile überwiegt. Die Verwendung von Entwurfsmustern allein macht niemanden zu einem guten Programmierer, aber wenn man weiß, wann und wo man sie verwendet, ist dies der Fall. Genau wie bei allem anderen auf dieser Welt können Designmuster zu Extremen werden und missbraucht werden. Ich weiß, dass ich immer noch nach der perfekten Balance in meinem Code suche (und das wird noch lange dauern), bei der jedes Designmuster einen Zweck hat und genau wie ein Puzzlestück zusammenpasst.
quelle
Designmuster sind großartig, wenn sie richtig verwendet werden.
Es ist nützlich sich daran zu erinnern, dass die Idee der Entwurfsmuster in der Architektur entstanden ist. Die Architektur kann sehr unterschiedlich sein. Es gibt jedoch viele Kernideen, die in jedem Gebäude vorhanden sind. Stellen Sie sich Muster auf diese Weise als Bausteine des Designs vor. Es ist wichtig zu beachten, dass nicht jedes Gebäude alle möglichen Architekturmuster enthält.
Angenommen, Sie entwerfen ein Haus. Anstatt die Haustür zur Straße hin zu öffnen, möchten Sie einen geschützten Bereich vor dem Betreten des Hauses, dh einen Vorraum. Dieser Bereich passt zu einem bestimmten Muster. Es wird nämlich zwei Eingänge haben, einige Wände und wahrscheinlich ein Dach. Beachten Sie, dass das Muster keine Türen, Fenster oder wie viele Wände angibt. In den meisten Implementierungen gibt es zwei Türen, vier Wände und möglicherweise Fenster. Das Muster beschreibt jedoch einen geschlossenen Bereich mit zwei Eingängen. Einer führt von außerhalb des Hauses in den Vorraum selbst und der andere in den Rest des Hauses. Der Schlüssel hier ist, dass, wenn Sie einen Vorraum wünschen, Sie einen Bereich einschließen und zwei Eingänge in diesen Bereich zur Verfügung stellen müssen.
Die typischen Probleme mit Entwurfsmustern bei der Programmierung sind zu häufig und der Glaube, dass es sich bei ihnen um Wundermittel handelt, um ein Problem zu beheben. Sie sind nicht. Sie sind Wege zu kommunizieren und über nützliche Programmierideen nachzudenken. Wenn es sich bei den Syntaxelementen einer bestimmten Sprache um die Bausteine und Mörtel handelt, beschreiben Muster nützliche Methoden, um sie so anzuordnen, dass sie bestimmten Anforderungen entsprechen.
quelle
Ich halte Designmuster eher für " Ratschläge " als für einen unveränderlichen Vertrag, der unbedingt eingehalten werden muss. Warum? Genau aus dem Grund, den Sie erwähnt haben. Das Befolgen eines Entwurfsmusters in allem führt zu einem großen Durcheinander von Code, der den Zweck der Verwendung eines Musters an erster Stelle zunichte macht.
Aus diesem Grund hasse ich Websites wie Java Practices . Sicher, einige der Ideen sind gut, aber dann hat der Autor beschlossen, ein komplettes Programm (plus ein Framework) nach jedem einzelnen von ihm erwähnten Entwurfsmuster zu schreiben. Der Autor schrieb auch jeden Artikel mit großen beängstigenden Zitaten, die den Leser denken lassen, dass die tatsächlichen Java-Praktiken schrecklich sind und wie die Pest vermieden werden sollten.
TL; DR: Verwenden Sie Designmuster. Missbrauche sie einfach nicht
quelle
Seet diesen Thread auch auf SO. Von einem anderen POV sind Entwurfsmuster Boilerplate-Code, um die Mängel der verwendeten Methodik zu kompensieren. Ich bin kein Fan davon, diese Problemumgehungen zu sehr zu feiern.
quelle
Ich werde die in der Mitte bevorzugen. Wie auf dem Poster richtig ausgeführt, macht Sie ein Verständnis der Muster nicht zu einem guten Entwickler. Andererseits hilft Ihnen ein Verständnis des Musters, ein guter Entwickler zu werden.
Das Verständnis der Beziehung von Mustern und das Sehen eines Musters in einem Projekt (während der Konzeptionsphase) machen Sie zu einem guten Entwickler.
quelle
Es wird oft gesagt, dass Entwurfsmuster eine vorgefertigte Lösung für Programmierprobleme darstellen. Was für Probleme sind das? "Wie kann ich das Objektverhalten ändern, aber die Änderungen vom Rest des Systems isolieren?"
Die GoF-Muster werden erkannt, um diese Isolation (Kapselung) vom Rest des Systems bereitzustellen, aber es ist oft schwierig zu wissen, welchem Teil des Systems durch die Verwendung ihrer Entwurfsmuster Variabilität verliehen wird. Anstatt dem von ihnen vorgeschlagenen Klassifizierungsschema (kreativ, verhaltensbezogen und strukturell) zu folgen, habe ich die Unterschiede der Muster grafisch dargestellt und zwei andere Schemata zur Klassifizierung ihrer Muster entwickelt: Lebenszyklus- und Komponenten-Verkapselungshierarchie.
Wie Sie dieser Tabelle für die Verkapselungshierarchie entnehmen können, können Entwurfsmuster auf jeder Ebene einer Komponente angewendet werden. Aber würde es Sinn machen? Muss die Komponente eine Verhaltensänderung auf der vorgeschlagenen Verkapselungsebene bereitstellen, und wird das richtige Muster für diese Ebene verwendet? Wenn diese Fragen nicht richtig beantwortet werden, werden die Entwurfsmuster höchstwahrscheinlich falsch angewendet. Nur weil ein vertikaler Drehpunkt in die Kabine eines Autos eingebaut werden könnte, ist dies keine gute Idee.
quelle
In Analogie zu Geld sollte ein Entwurfsmuster als Lösung mit hohen Kapitalkosten, aber niedrigen Betriebskosten betrachtet werden. Designmuster kosten im Voraus ein Vermögen in Bezug auf zusätzliche Kodierung, Ausführlichkeit und das konzeptionelle Gewicht der zusätzlichen Indirektion, die sie erzeugen. Sie neigen auch dazu, andere Aspekte Ihres Designs zu blockieren. Wenn Sie beispielsweise die Vorlagenmethode verwenden, werden Sie gezwungen, stark OO-programmiert zu sein.
Wenn Sie jedoch eine Menge eng verwandter Probleme lösen müssen, die sich in gewisser Weise geringfügig unterscheiden, oder in Zukunft einen Code auf bestimmte Weise stark ändern müssen, können sich die Vorabkosten aufgrund des Designs lohnen Muster verleihen Ihrem Code mehr Flexibilität. Die Modifikationen oder die Lösung des zweiten Ihrer eng verwandten Probleme wird mit Mustern viel einfacher sein als ohne.
quelle
Beide Lager sind richtig - sie sind eine Macht für das Gute, wenn sie richtig eingesetzt werden, eine Macht für das Schlechte, wenn sie überall verteilt sind.
quelle
Designmuster können ein Händchen für Sie sein, aber das Gleiche gilt für die Codierung im Allgemeinen. Wenn Sie die ultimative Toolbox schreiben, können Sie sich leicht verführen lassen - Sie müssen nur YAGNI im Hinterkopf behalten, um nicht vom Kurs abgehalten zu werden und ein Gefühl dafür zu bekommen, wie viel Struktur die Anwendung benötigt. IMO ist dies nur Sache des Einzelnen und ein Zeichen seiner Erfahrung / Urteilskraft.
quelle
Ich denke an Designdaten, nicht an etwas, das Sie ständig versuchen, auf Ihren Code anzuwenden. Für mich geht es hauptsächlich um eine gemeinsame Sprache für Entwickler. Es ist einfacher zu sagen "wir folgen einem Baumuster" als das Ganze immer wieder zu erklären.
Momentan lese ich Patterns Of Enterprise Application Architecture erneut , da ich auf eine Menge Code stoße, der einem der Muster aus diesem Buch folgt. Ich glaube nicht, dass es absichtlich ausgewählt wurde, um einem der Muster zu folgen, aber es hilft definitiv, wenn Sie sagen können, dass es ein Transaktionsskript ist und jeder ein klares Verständnis dafür hat, was das bedeutet.
Aber ich mag die Idee, dass Sie aus einem vorbereiteten Musterkatalog auswählen können, wenn Sie eine neue Funktionalität oder eine brandneue Anwendung entwerfen. Warum alles neu erfinden, wenn es bewährte Lösungen für bestimmte Probleme gibt?
quelle