Bei jedem Programmierprojekt versuchen Manager mit früherer Programmiererfahrung zu glänzen, wenn sie einige Entwurfsmuster für Ihr Projekt empfehlen. Ich mag Entwurfsmuster, wenn sie sinnvoll sind oder wenn Sie eine skalierbare Lösung benötigen. Ich habe zum Beispiel Proxies, Observers und Command Patterns positiv eingesetzt und tue dies jeden Tag. Aber ich zögere wirklich, ein Factory-Muster zu verwenden, wenn es nur eine Möglichkeit gibt, ein Objekt zu erstellen, da eine Factory in Zukunft möglicherweise alles einfacher macht, aber den Code kompliziert und nur mit Overhead verbunden ist.
Meine Frage bezieht sich also auf meine zukünftige Karriere und meine Antwort auf Managertypen, die zufällige Musternamen herumwerfen:
Welche Designmuster haben Sie verwendet, die Sie insgesamt zurückgeworfen haben? Welches sind die schlechtesten Entwurfsmuster , die Sie berücksichtigen sollten, außer in einer einzigen Situation, in der sie sinnvoll sind (lesen Sie: Welche Entwurfsmuster sind sehr eng definiert)? (Es ist, als ob ich nach den negativen Bewertungen eines insgesamt guten Amazon-Produkts gesucht hätte, um zu sehen, was die Leute am meisten daran hinderte, Designmuster zu verwenden.) Und ich spreche hier nicht von Anti-Mustern, sondern von Mustern, die normalerweise als solche angesehen werden "gute" Muster.
Bearbeiten: Wie einige geantwortet haben, ist das Problem meistens, dass Muster nicht "schlecht", sondern "falsch verwendet" sind. Wenn Sie Muster kennen, die häufig missbraucht oder sogar schwierig zu verwenden sind, eignen sie sich auch als Antwort.
Antworten:
Ich glaube nicht an schlechte Muster, ich glaube, dass Muster schlecht angewendet werden können!
Bei dieser Antwort habe ich nur die GOF-Muster berücksichtigt. Ich kenne nicht alle möglichen Muster gut genug, um sie auch zu berücksichtigen.
quelle
Abgesehen von Singleton und Visitor, die bereits von den anderen Antwortenden erwähnt wurden, kenne ich keine "berüchtigten" Designmuster. Meines Erachtens sind die größten Probleme nicht darauf zurückzuführen, dass ein bestimmtes Entwurfsmuster "falsch" ist, sondern dass Entwickler die Muster zu eifrig anwenden.
Fast jeder durchläuft die "Musterfieber" -Phase, wenn er sich mit Mustern vertraut macht. Da man denkt, dass Muster das Beste seit geschnittenem Brot sind, versucht man sie anfangs anzuwenden, wann immer er eine Möglichkeit sieht. Dies führt dazu, dass der Code unter Mustern verborgen bleibt, bei denen die Muster selbst nicht mehr helfen. Sie erschweren lediglich das Verständnis und die langfristige Pflege des Codes.
Schließlich haben die meisten von uns diese Phase hinter sich und lernen, wie man die Muster verwendet, um echte Probleme zu lösen, nicht um ihrer selbst willen. Muster haben ihren Preis, was eine zusätzliche Komplexität bedeutet, und die Anwendung eines bestimmten Musters ist nur dann gerechtfertigt, wenn es sich für die zusätzliche Komplexität auszahlt, indem es dazu beiträgt, einen anderen Teil des Systems zu vereinfachen und so den Code / die Konfiguration insgesamt leichter verständlich und wartbar zu machen. Wenn dies nicht der Fall ist, ist es oft besser, sich von Mustern fernzuhalten und sich an die einfachste Lösung zu halten, die möglicherweise funktionieren könnte.
quelle
Ich gehe hier auf die Probe und schlage vor, die Vererbung übermäßig zu nutzen. Auf jeden Fall am besten in Sprachen wie Java geeignet, die keinen soliden Polymorphismus zur Kompilierungszeit unterstützen. Die Vererbung zur Laufzeit ist ein Tool, keine Art von One-Feature-Fits-All-Wonder.
Andere Leute haben sich bereits ähnlich zu meinem persönlichen Hass auf Singletons geäußert, daher werde ich hier nicht weiter darauf eingehen.
quelle
Singleton. Es ist eines der GOF-Muster, die jetzt häufiger als Anti-Muster bezeichnet werden. Einer der Gründe dafür ist, dass Singleton das Testen von Code erschwert.
quelle
:-)
Befolgen Sie das MVVM-Muster für WPF zu genau, wie zum Beispiel in dieser Frage angegeben . Einige Leute versuchen, die Richtlinie zu befolgen, dass kein Code zu streng in den Code eingefügt werden sollte und kommen mit allen Arten von exotischen Hacks.
Und natürlich ist MVVM höllisch schwierig und es lohnt sich einfach nicht für kleine kurzfristige Projekte.
Dr. WPF hat in seinem Artikel MV-poo einen ironischen Beitrag dazu verfasst .
quelle
Einige der Muster im GOF-Buch sind C ++ -spezifisch, da sie in Sprachen mit Reflektion weniger anwendbar sind, z. B. ist das Prototype-Muster in Java weniger wichtig.
Ich betrachte das Interpreter-Muster als 'eng'. Sie müssen ein allgemeines Problem haben, das es wert ist, einen allgemeinen Problemlöser zu entwickeln. Es funktioniert nur für spezielle Probleme, für die Sie eine Sprache erfinden, eine Grammatik definieren und einen Dolmetscher schreiben können. Die Probleminstanzen sollten als Satz in der Grammatik darstellbar sein. Ich glaube, Sie stoßen nicht oft auf solche Situationen.
quelle
Die, die ich am häufigsten bereue (wenn auch nicht am heftigsten): Wenn ich nur eine Funktion hätte erstellen sollen, aber eine OOP-Lösung implementiert habe.
quelle
Fabrik. Ich habe gesehen, wie Code es implementiert hat, der nur einen Typ erstellt. Das ist völlig nutzloser Code IMO. Es hilft nicht, dass viele der Online-Beispiele vollständig erfunden sind. Pizzafabrik?
Möglicherweise ist die Fabrik aufgrund der Abhängigkeitsinjektion einfacher zu testen. Aber diesen Code hinzuzufügen, wenn Sie ihn nicht benötigen, ist für mich sinnlos, und das Testargument verschwindet, wenn Sie Schein-Frameworks wie JMockit verwenden können. Je einfacher Sie ein Programm erstellen können, desto besser. Fabriken machen nur mit einer größeren Anzahl von Typen wirklich Sinn (mit größer meine ich mindestens mehr als 2).
quelle
Singleton
Ich stimme mit den anderen über Singleton überein. Nicht, dass Sie sie niemals verwenden sollten, nur, dass sie auf sehr wenige Fälle beschränkt sein sollten. Sie werden häufig als faule Globals eingesetzt.
Thread-Sicherheit ist ein Problem bei Singletons. Die Ausnahmebehandlung ist eine andere - wenn der Singleton nicht ordnungsgemäß erstellt wird - Sie wissen nicht immer, ob Sie den Fehler sicher abfangen können, insbesondere wenn es sich um eines dieser Objekte handelt, die "vor main" erstellt wurden. Und dann gibt es das Problem der Reinigung danach.
Ich tendiere dazu, lieber einen Singleton zu verwenden und alle anderen "Möchtegern" Singletons "abonnieren" zu lassen. Meine häufigste Singleton-Verwendung ist die Ereignisbehandlung: Sie "senden nur an die Welt", dass ein Ereignis stattgefunden hat, und jeder, der das Ereignis behandelt, tut dies. Auf diese Weise entkoppeln Sie die tatsächlich stattfindenden Ereignisse mit dem, was sie hören. (Protokollierung, Signale usw.)
Besucher
Das Hässliche daran ist, dass sich Entwickler keine aussagekräftigen Namen einfallen lassen und nur Methoden visit () aufrufen, sondern die Erweiterbarkeit in eine Richtung erhöhen und in eine andere Richtung entfernen, dh zusätzliche Funktionen hinzufügen, aber einschränken Die Anzahl der Objekte, die Ihre Besucher über alle Objekttypen wissen müssen, die sie möglicherweise besuchen.
Es ist zwar chaotisch, die Erweiterung in beide Richtungen zuzulassen, dies verwendet jedoch das Besuchermuster nicht vollständig in seiner regulären Form. Die häufigste Anwendung hierfür ist das Drucken von Objekten: Sie haben verschiedene Möglichkeiten zum Drucken von Objekten und verschiedene Objekte, die gedruckt werden müssen. Sie sollten dies in beide Richtungen erweitern können. (Drucken bedeutet, dass Objekte in einen Stream umgewandelt werden: Speichern in einer Datei / Schreiben in eine Konsole / GUI usw.).
(Hinweis: Sie sollten dies nicht mit der Architektur der Dokumentansicht verwechseln, bei der es sich um ein etwas anderes Muster handelt.)
quelle
Ich denke, das Problem bei einigen der komplexeren Muster ist, dass es so viele Variationen gibt, dass sie viel von ihrem Wert als Kommunikationsgerät verlieren.
Der schlimmste Täter, den ich mir in dieser Kategorie vorstellen kann, ist das MVC-Muster. Selbst wenn wir MVP ignorieren, gibt es so viele Variationen in den Rollen dieser Elemente, dass Sie eine Stunde in jedem neuen Framework verbringen müssen, um herauszufinden, wo die Grenzen liegen.
quelle
Es gibt keine schlechten Muster, nur schlechte Menschen.
Ich würde viel lieber leicht lesbaren Code erben, der etwas Klares bewirkt, aber ein wenig ausführlich oder nicht (Queue Evil Villian Music) wiederverwendbar ist (keuch!), Als irgendeinen Mischmasch von
InheritAbstractTemplateFaucetSink<Kitchen>
.Wiederverwendbarer Code ist großartig! Möglicherweise schreiben Sie keinen Code, der erneut verwendet wird, oder das erneute Schreiben einer ähnlichen Logik für eine andere Anwendung würde weniger Zeit in Anspruch nehmen als ein verrückter Versuch, den Code einer anderen Anwendung erneut zu verwenden.
Zum weiteren Lesen öffnen Sie einen Teil des C-Codes in den korrekten Implementierungen der Posix-Header oder der Clibs und spielen Sie das Muster aus. Dieser Code wurde von einigen der intelligentesten und engagiertesten Programmierer der Welt geschrieben. Wissen Sie, wie viele abstrakte Fabrikmuster Sie sehen werden? ... KEINER!. Noch bessere Chancen bestehen darin, dass Sie die Logik sehr leicht verstehen und nachvollziehen können, wenn Sie die anderen Teile des Geschehens verstehen.
Mein Punkt ist, dass die meisten "Muster" nicht erstellt wurden, um den Code zu verbessern. Sie wurden erstellt, um Bücher und Modellierungssoftware zu verkaufen. Wenn Sie gut programmieren können, werden Sie wahrscheinlich die meisten davon vermeiden und klaren, prägnanten und clever gestalteten Code schreiben, der Ihr Problem löst. Wenn Sie ein anderes Problem haben, schreiben Sie klaren, präzisen und clever gestalteten Code, um dieses Problem zu lösen. Wenn es Ihr Ziel ist, weniger Code zu schreiben, als ich denke, Sie sind kein Programmierer. Ich liebe es, Code zu schreiben und möchte ihn so oft wie möglich schreiben. Wenn ich etwas neu schreibe, was ich bereits geschrieben habe, mache ich es zehnmal so schnell und werde all die Dinge los, mit denen ich beim ersten Mal nicht zufrieden war.
Damit hinterlasse ich Ihnen das wahrscheinlich beste (relevante) Zitat in der Informatik.
" Es gibt zwei Möglichkeiten, ein Software-Design zu erstellen: Eine Möglichkeit besteht darin, es so einfach zu gestalten, dass es offensichtlich keine Mängel gibt, und die andere darin, es so kompliziert zu gestalten, dass es keine offensichtlichen Mängel gibt. Die erste Methode ist weitaus schwieriger . "
quelle
Ich stimme definitiv zu, dass es eine Zeit für die meisten Muster gibt und dass Sie viele Muster missbrauchen können. Ich weiß, dass das Abstract Template-Muster das ist, das ich in der Vergangenheit am häufigsten missbraucht habe. In vollem Umfang wird es als ASP.NET-Webformulare bezeichnet.
quelle