Ich bin der einzige Entwickler eines Projekts, das wie jedes Softwareprojekt in Zukunft von jemand anderem übernommen werden kann.
Angenommen, ich habe das Muster X zum Implementieren von Feature A verwendet. Nach dem Entwickeln und Beenden des Features habe ich festgestellt, dass ich dasselbe Feature mithilfe von Muster Y implementieren kann, das ich gerade kennengelernt habe. Aber Funktion A funktioniert gut, und das Refactoring von X nach Y ist zeitaufwändig und bietet wenig Nutzen.
Dann ist es Zeit, Feature B zu implementieren. Es ist ähnlich wie A, aber dieses Mal möchte ich diese Gelegenheit nutzen, um mit Muster Y zu spielen. Ich freue mich über das Endergebnis, besser als bei Feature A, aber jetzt verwendet mein Code zwei verschiedene Muster, X und Y, für ähnliche Merkmale.
Es gibt jedoch keinen wirklichen Grund, unterschiedliche Muster zu verwenden, außer der Tatsache, dass AI beim Erstellen von Feature AI nicht geschickt genug war, um dasselbe Muster wie für Feature B zu verwenden.
Beachten Sie, dass es bei dieser Frage nicht darum geht , das richtige Muster für ein bestimmtes Problem auszuwählen. Es geht um zwei Muster, die gleichzeitig in der Codebasis vorhanden sind, um ähnliche Probleme zu lösen. Diese Muster könnten auf eines reduziert werden, wenn genügend Zeit für die Umgestaltung vorhanden ist.
- Riecht dieser Code?
- Was sind die Nachteile, wenn der Quellcode so bleibt?
- Sollte ich mich daran halten, nur ein Muster zu verwenden? dh Refaktor A, um Y zu verwenden oder X weiterhin zu verwenden, wenn B geschrieben wird?
- Wie kann ich in der Quelle mitteilen, dass der Grund, warum es zwei unterschiedliche Muster für ähnliche Funktionen gibt, im Wesentlichen kein Grund ist?
- Mache ich mir zu viele Sorgen darüber, was der nächste Entwickler über meinen Code denkt?
quelle
Antworten:
Wenn Muster X und Y das gleiche Problem lösen und keines objektiv besser ist, sollten Sie sich für eines entscheiden und dabei bleiben. Wenn es überhaupt möglich ist, sollten Sie sich bemühen, dasselbe Problem auf dieselbe Weise konsequent zu lösen.
Sie machen sich nicht zu viele Sorgen, sondern es ist ein ernsthafter Code-Geruch, mit dem Sie auf jeden Fall umgehen und aufräumen sollten.
Die Nachteile unterschiedlicher Lösungen für dasselbe Problem in einer Codebasis:
quelle
Ich stimme der Antwort von JacquesB zu . Ich würde zusammenfassen und andere Ihrer Fragen ansprechen: Wenn Sie im Moment die beiden Muster nebeneinander haben und (noch) nicht die Zeit hatten, Ihre Anwendung zu überarbeiten, um die zu verwenden, die Sie als die beste befunden haben, sollten Sie sie stellen das in Ihren Kommentaren in der "beleidigenden" Klasse (die zu überarbeitende). Auf diese Weise ist es für den zukünftigen Entwickler (Sie oder jemand anderes) offensichtlich, dass noch einige Schulden zu bezahlen sind.
Schließlich ist der Hauptnachteil der Aufrechterhaltung einer solchen Codebasis die zusätzliche, aber unnötige Komplexität. Sie möchten auf jeden Fall unnötige Komplexität um jeden Preis vermeiden!
quelle
Spielen Sie nicht in der Codebasis. Schreiben Sie Prototypen, damit Sie die Vor- und Nachteile eines Musters / Designs gegenüber dem anderen finden können.
Es kann sich herausstellen, dass das, was sich intuitiv anfühlt, reduziert werden kann und tatsächlich komplexer ist als zwei verschiedene Muster.
Erwarten Sie, einen Großteil des für den Prototyp entwickelten Codes wegzuwerfen.
quelle
Ob dies ein Codegeruch ist oder nicht, hängt wirklich davon ab, wie ähnlich Problem A und Problem B sind. Die Antwort von JacquesB scheint davon auszugehen, dass sie sehr ähnlich sind. Wenn Sie Problem A ändern (um beispielsweise einen Fehler zu beheben), müssen Sie gleichzeitig auch Problem B ändern. JaqueB könnte richtig sein, aber es könnte auch der Fall sein, dass sich A und B unabhängig voneinander ändern, weil sie sich nicht allzu ähnlich sind. In dieser Situation ist es unwahrscheinlich, dass die beschriebenen Nachteile auftreten.
Basierend auf Ihrer Beschreibung klingt es wie ein Code-Geruch (Duplizierung), aber es ist schwer zu sagen, wie stinkend der Geruch ist. Wenn beispielsweise A die Vorlagenmethode und B die Strategie verwendet, können die beiden Probleme trotz der verwendeten Spiegelungsmuster sehr unterschiedlich sein. Ich würde abwarten und sehen, wie ich mich nähere. Für den Fall, dass das Problem C auftritt und es genau wie A und B ist, würde ich A umgestalten, um mit B konsistent zu sein, und dann sollte das Erstellen von C sehr einfach sein. Wenn es einen Fehler in A gibt, möchte ich ihn auch so umgestalten, dass er mit B übereinstimmt, und dann den Fehler beheben. Für den Fall, dass sich dann nichts ändert ... spielt es keine Rolle, oder?
Es ist eine Tatsache, mehrere Möglichkeiten zu haben, ähnliche Probleme in einer Codebasis zu lösen. Selbst wenn Sie der einzige Entwickler sind, werden Sie neue Dinge lernen und neue Erkenntnisse gewinnen, sodass sich Ihre Lösungen ändern werden. Wie Sie richtig erkennen, müssen Sie diese Mängel beheben und gleichzeitig einen Mehrwert bieten. Das Neugestalten von Code (was Sie wirklich tun, wenn Sie ein Muster ändern), der sich nie wieder ändern wird, liefert keinen Wert. Der einzige wirkliche Weg zu wissen, dass es sich ändern wird, besteht darin, die Änderung tatsächlich vornehmen zu müssen, weshalb ich auf ein Problem C warten würde.
quelle
Nein, Sie können mehrere Muster in einer einzigen Codebasis verwenden.
Wenn Sie jedoch eine Komponente implementieren und eine Verwendungsmethode offenlegen, die einem Muster folgt, ist es wahrscheinlich am besten, sich an diese zu halten. Angenommen, ich verwende das Builder-Muster für meinen REST-Abfrage-Client, implementiere dann aber eine der Ressourcen anders. Das wird die Leute verwirren.
quelle