it-swarm-eu.dev

Welche Entwurfsmuster sind am schlechtesten oder am engsten definiert?

Für jedes Programmierprojekt versuchen Manager mit Programmiererfahrung in der Vergangenheit zu glänzen, wenn sie einige Entwurfsmuster für Ihr Projekt empfehlen. Ich mag Designmuster, wenn sie sinnvoll sind oder wenn Sie eine skalierbare Lösung benötigen. Ich habe zum Beispiel Proxies, Observers und Command Patterns positiv verwendet und das jeden Tag. Aber ich zögere wirklich, beispielsweise ein Factory-Muster zu verwenden, wenn es nur einen Weg gibt, ein Objekt zu erstellen, da eine Factory möglicherweise in Zukunft alles einfacher macht, aber den Code kompliziert und reiner Overhead ist.

Meine Frage bezieht sich also auf meine zukünftige Karriere und meine Antwort auf Manager-Typen, 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 hätte ich nach den negativen Bewertungen eines insgesamt guten Produkts von Amazon gesucht, um herauszufinden, was die Leute bei der Verwendung von Designmustern am meisten nervte.) Und ich spreche hier nicht von Anti-Patterns, sondern von Patterns, die normalerweise als solche angesehen werden "gute" Muster.

Edit : Wie einige antworteten, besteht das Problem meistens darin, dass Muster nicht "schlecht", sondern "falsch verwendet" sind. Wenn Sie Muster kennen, die oft missbraucht werden oder sogar schwer zu verwenden sind, passen sie auch als Antwort.

28
Akku

Ich glaube nicht an schlechte Muster, ich glaube, dass Muster schlecht angewendet werden können!

  • IMHO der Singleton ist das am meisten missbrauchte und am falschesten angewendete Muster. Menschen scheinen an einer Singleton-Krankheit zu erkranken und sehen überall Möglichkeiten für Singletons, ohne Alternativen in Betracht zu ziehen.
  • IMHO Besuchermuster hat die engste Verwendung und wird die zusätzliche Komplexität fast nie gerechtfertigt sein. Ein schönes PDF kann bekommen werden hier . Nur wenn Sie eine Datenstruktur haben, von der Sie wissen, dass sie durchlaufen wird, während Sie verschiedene Operationen an der Datenstruktur ausführen, ohne vorher alle Möglichkeiten zu kennen, geben Sie dem Besuchermuster eine Kampfchance. Es ist aber hübsch :)

Für diese Antwort habe ich nur die GOF-Muster berücksichtigt. Ich kenne nicht alle möglichen Muster gut genug, um sie auch zu berücksichtigen.

40
KeesDijk

Ich werde hier auf die Nerven gehen und eine Überbeanspruchung der Vererbung vorschlagen. Auf jeden Fall am besten in Sprachen ohne solide Unterstützung des Polymorphismus zur Kompilierungszeit wie Java anwendbar. Die Laufzeitvererbung ist ein Werkzeug, kein Wunder, das nur ein einziges Merkmal bietet.

Andere Leute haben bereits ähnlich wie mein persönlicher Hass auf Singletons geäußert, deshalb werde ich hier nicht weiter darauf eingehen.

14
DeadMG

Abgesehen von Singleton und Visitor, die bereits von den anderen Antwortenden erwähnt wurden, kenne ich keine "berüchtigten" Designmuster. Meiner Meinung nach sind die größten Probleme nicht darauf zurückzuführen, dass ein bestimmtes Entwurfsmuster "falsch" ist, sondern darauf, dass Entwickler Muster zu eifrig anwenden.

Fast jeder durchläuft die "Musterfieber" -Phase, wenn er sich mit Mustern vertraut macht. Wenn man denkt, dass Muster das Beste seit geschnittenem Brot sind, versucht man zunächst, sie anzuwenden, wann immer er eine Möglichkeit sieht. Dies führt dazu, dass der Code unter Mustern vergraben wird, bei denen die Muster selbst nicht mehr helfen. Sie machen es nur schwieriger, den Code auf lange Sicht zu verstehen und zu pflegen.

Schließlich überwinden die meisten von uns diese Phase und lernen, wie man die Muster verwendet, um echte Probleme zu lösen, nicht um ihrer selbst willen. Muster haben ihren Preis, was zu einer zusätzlichen Komplexität führt. Die Anwendung eines bestimmten Musters ist nur dann gerechtfertigt, wenn sich die zusätzliche Komplexität auszahlt, indem ein anderer Teil des Systems vereinfacht wird, wodurch der Code/die Konfiguration insgesamt leichter zu verstehen und zu warten ist. 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.

14
Péter Török

Singleton. Es ist eines der GOF-Muster, das jetzt häufiger als Anti-Muster bezeichnet wird. Einer der Gründe dafür ist, dass Singleton das Testen von Code erschwert.

10
SiberianGuy

Wenn Sie Muster kennen, die oft missbraucht werden oder sogar schwer zu verwenden sind, passen sie auch als Antwort.

Folgen Sie dem MVVM-Muster für [~ # ~] wpf [~ # ~] zu streng, wie zum Beispiel angegeben - durch diese Frage . Einige Leute versuchen, der Richtlinie zu folgen, dass kein Code viel zu streng in den Code dahinter eingefügt werden sollte, und entwickeln alle Arten von exotischen Hacks.

Und natürlich ist MVVM höllisch schwierig und für kleine kurzfristige Projekte einfach nicht wert.

Dr. WPF hat in seinem Artikel M-V-poo einen ironischen Beitrag dazu geschrieben.

7
Steven Jeuris

Factory. Ich habe gesehen, wie Code ihn implementiert, 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 sind nur bei einer größeren Anzahl von Typen wirklich sinnvoll (mit größer meine ich mindestens mehr als 2).

5
Michael K

Einige der Muster im GOF-Buch sind C++ - spezifisch in dem Sinne, dass sie in reflektierenden Sprachen, z. Das Prototypmuster ist in Java weniger bedeutsam.

Ich betrachte das Interpreter-Muster als "schmal". Sie müssen ein allgemeines Problem haben, das es wert ist, einen allgemeinen Problemlöser zu entwickeln. Es funktioniert nur bei speziellen Problemen, 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 nicht, dass Sie oft auf solche Situationen stoßen.

5
Karl

Die, die ich am häufigsten bedauere (wenn auch nicht am vehementesten): Wenn ich gerade eine Funktion hätte erstellen sollen, aber eine OOP -Lösung) implementiert habe.

5
C SD

Singleton

Ich stimme den anderen in Bezug auf Singleton zu. Nicht, dass Sie sie niemals verwenden sollten, nur, dass sie auf sehr wenige Fälle beschränkt sein sollten. Sie werden oft als faule Globale verwendet.

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 anschließenden Reinigung.

Ich bevorzuge es, einen Singleton zu verwenden und alle anderen "Möchtegern" -Singletons Ihren zu "abonnieren". Meine häufigste Singleton-Verwendung ist die Behandlung von "Shout-Ereignissen": Sie "senden nur an die Welt", dass ein Ereignis stattgefunden hat, und jeder, der zuhört, der das Ereignis behandelt, tut dies. Auf diese Weise entkoppeln Sie die Ereignisse, die tatsächlich stattfinden, mit dem, was ihnen zuhört. (Protokollierung, Signale usw.)

Besucher

Das Hässliche daran ist, abgesehen von der Tatsache, dass Entwickler nicht an aussagekräftige Namen denken und nur Methoden visit () aufrufen können, dass es die Erweiterbarkeit in eine Richtung erhöht, während es in eine andere Richtung entfernt wird, dh zusätzliche Funktionen hinzufügt, aber einschränkt 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 nutzt jedoch das Besuchermuster in seiner regulären Form nicht vollständig. 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 jede Art, Objekte in einen Stream umzuwandeln: 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.).

2
CashCow

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 der einzelnen Elemente, dass Sie eine Stunde in jedem neuen Framework verbringen müssen, um herauszufinden, wo die Grenzen liegen.

2
Uri

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 ist oder nicht (Warteschlange böse villianische Musik) wiederverwendbar ist (keuchen!) Als irgendein Mischmasch von InheritAbstractTemplateFaucetSink<Kitchen>.

Wiederverwendbarer Code ist großartig! Möglicherweise schreiben Sie keinen Code, der wiederverwendet 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 wiederzuverwenden.

Zum weiteren Lesen öffnen Sie einen Teil des C-Codes in den vernünftigen Implementierungen der Posix-Header oder der Clibs und spielen Sie das Muster ab. 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 sind, wenn Sie die anderen Teile des Geschehens verstehen, dass die Logik sehr einfach zu verstehen und zu verfolgen ist.

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 meiden und klaren, präzisen 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 Ihr Ziel darin besteht, weniger Code zu schreiben, als ich denke, sind Sie kein Programmierer. Ich liebe es, Code zu schreiben und möchte ihn so oft wie möglich schreiben. Wenn ich etwas neu schreibe, das 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. Als Bonus kann ich es ohne die Einschränkungen des ersten Problemsatzes tun, da es sich um ein neues Problem handelt (ich habe wahrscheinlich 15 Skripte in 5 verschiedenen Sprachen, mit denen Tomcat herumschwirrt).

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 offensichtlich keine Mängel vorliegen, und die andere darin, es so kompliziert zu gestalten, dass keine offensichtlichen Mängel vorliegen. Die erste Methode ist weitaus schwieriger. "

  • Tony Hoare (Erfinder des Quicksort, Vater des modernen Betriebssystemdesigns, Schöpfer der Hoare-Logik und Turing-Preisträger)
1
nsfyn55

Ich stimme definitiv zu, dass es für die meisten Muster eine Zeit gibt und dass Sie viele Muster missbrauchen können. Ich weiß, dass das Muster der abstrakten Vorlage das ist, das ich in der Vergangenheit am meisten missbraucht habe. In vollem Umfang wird es als ASP.NET-Webformular bezeichnet.

0
Wyatt Barnett