Ich denke, das ist eine kontroverse Meta-Antwort, und ich bin ein bisschen spät dran, aber ich denke, es ist sehr wichtig, dies hier zu erwähnen, weil ich glaube, ich weiß, woher du kommst.
Das Problem bei der Verwendung von Entwurfsmustern besteht darin, dass sie beim Lernen einen Fall wie den folgenden darstellen:
Sie haben dieses spezielle Szenario. Organisieren Sie Ihren Code auf diese Weise. Hier ist ein schickes, aber etwas ausgeklügeltes Beispiel.
Das Problem ist, dass die Dinge, wenn Sie anfangen, echtes Engineering zu betreiben, nicht ganz so einfach sind. Das Designmuster, über das Sie gelesen haben, passt nicht genau zu dem Problem, das Sie lösen möchten. Ganz zu schweigen davon, dass die von Ihnen verwendeten Bibliotheken gegen alle im Text enthaltenen Erklärungen zu diesen Mustern verstoßen, die jeweils auf ihre eigene Art und Weise erstellt wurden. Infolgedessen fühlt sich der von Ihnen geschriebene Code "falsch an" und Sie stellen Fragen wie diese.
Darüber hinaus möchte ich Andrei Alexandrescu zitieren, wenn er über Software-Engineering spricht, der sagt:
Das Software-Engineering weist, vielleicht mehr als jede andere technische Disziplin, eine große Vielfalt auf: Sie können dasselbe auf so viele korrekte Arten tun, und es gibt unendlich viele Nuancen zwischen richtig und falsch.
Vielleicht ist dies etwas übertrieben, aber ich denke, dies erklärt perfekt einen weiteren Grund, warum Sie sich in Ihrem Code möglicherweise weniger sicher fühlen.
In Zeiten wie diesen schreit mir die prophetische Stimme von Mike Acton, Game Engine Lead bei Insomniac, in den Kopf:
KENNEN SIE IHRE DATEN
Er spricht über die Eingaben in Ihr Programm und die gewünschten Ausgaben. Und dann ist da noch dieses Juwel von Fred Brooks aus dem Mythical Man Month:
Zeigen Sie mir Ihre Flussdiagramme und verbergen Sie Ihre Tabellen, und ich werde weiterhin mystifiziert sein. Zeigen Sie mir Ihre Tabellen, und ich benötige normalerweise nicht Ihre Flussdiagramme; Sie werden offensichtlich sein.
Wenn ich Sie wäre, würde ich anhand meines typischen Eingabefalls über mein Problem nachdenken und feststellen, ob es die gewünschte korrekte Ausgabe liefert. Und stell Fragen wie diese:
- Sind die Ausgabedaten meines Programms korrekt?
- Wird es für meinen häufigsten Eingabefall effizient / schnell erstellt?
- Ist mein Code für mich und meine Teamkollegen so einfach, dass ich vor Ort darüber nachdenken kann? Wenn nicht, kann ich es dann einfacher machen?
Wenn Sie dies tun, ist die Frage "Wie viele Ebenen von Abstraktions- oder Entwurfsmustern werden benötigt?" Viel einfacher zu beantworten. Wie viele Abstraktionsebenen benötigen Sie? So viele wie nötig, um diese Ziele zu erreichen, und nicht mehr. "Was ist mit Designmustern? Ich habe keine verwendet!" Nun, wenn die oben genannten Ziele ohne direkte Anwendung eines Musters erreicht wurden, dann ist das in Ordnung. Lassen Sie es funktionieren und fahren Sie mit dem nächsten Problem fort. Beginnen Sie mit Ihren Daten, nicht mit dem Code.