Verwenden unterschiedlicher Muster für ähnliche Funktionen

10

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?
ris8_allo_zen0
quelle
Mögliches Duplikat der Auswahl des richtigen Entwurfsmusters
Mücke

Antworten:

7

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:

  • Das Verständnis des Codes dauert doppelt so lange
  • Das Ändern von Code dauert doppelt so lange, wenn Sie einen Teil des Verhaltens ändern, das das Muster betrifft
  • Sie werden doppelt so viele Fehler haben
  • Aktuelle und zukünftige Kollegen werden Sie hassen
JacquesB
quelle
2

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!

Carlossierra
quelle
Ich würde dies lieber in einer Art Aufgabenliste oder zumindest zusätzlich zu einem Hinweis im Code sehen.
JeffO
@ JeffO Ich stimme zu. Obwohl es nicht ohne zusätzliche Probleme ist, sich nur auf Aufgabenlisten zu verlassen, da diese meistens persönlich (nicht geteilt) sind, im Gegensatz zu dem Kommentar in der gemeinsamen Codebasis. Aber auch hier stimme ich zu und es ist wahrscheinlich eine gute Idee, beides zu haben (wenn sie definitiv nicht vermieden werden können).
Carlossierra
Das ist ein guter Punkt. Es sollte mehr als eine einfache Todo-Liste sein, die das Teilen, die Zusammenarbeit, die Kommunikation und all diese anderen lustigen Dinge umfasst.
JeffO
1

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.

Robert Baron
quelle
1

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.

Eric Smith
quelle
1

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.

Ewan
quelle