Manchmal ist Code-Duplikation das Ergebnis eines "Wortspiels": Zwei Dinge sehen gleich aus, sind es aber nicht.
Möglicherweise kann eine Überabstraktion die wahre Modularität Ihres Systems sprengen. Im Rahmen der Modularität müssen Sie sich entscheiden, "was sich voraussichtlich ändern wird". und "was ist stabil?". Was stabil ist, wird in die Schnittstelle gestellt, während was instabil ist, in die Implementierung des Moduls eingeschlossen wird. Wenn sich die Dinge ändern, wird die Änderung, die Sie vornehmen müssen, auf dieses Modul beschränkt.
Refactoring ist erforderlich, wenn das, was Sie für stabil hielten (z. B. dieser API-Aufruf benötigt immer zwei Argumente), geändert werden muss.
Für diese beiden duplizierten Codefragmente würde ich also fragen: Bedeutet eine Änderung an dem einen unbedingt, dass auch der andere geändert werden muss?
Wie Sie diese Frage beantworten, gibt Ihnen möglicherweise einen besseren Einblick in das, was eine gute Abstraktion sein könnte.
Entwurfsmuster sind auch nützliche Werkzeuge. Möglicherweise durchläuft Ihr duplizierter Code eine bestimmte Form, und das Iterationsmuster sollte angewendet werden.
Wenn Ihr duplizierter Code mehrere Rückgabewerte enthält (und Sie deshalb keine einfache Extraktionsmethode ausführen können), sollten Sie möglicherweise eine Klasse erstellen, die die zurückgegebenen Werte enthält. Die Klasse kann für jeden Punkt eine abstrakte Methode aufrufen, die zwischen den beiden Codefragmenten variiert. Sie würden dann zwei konkrete Implementierungen der Klasse vornehmen: eine für jedes Fragment. [Dies ist effektiv das Entwurfsmuster der Vorlagenmethode, nicht zu verwechseln mit dem Konzept der Vorlagen in C ++. Alternativ könnte das, was Sie sich ansehen, mit dem Strategiemuster besser gelöst werden.]
Eine andere natürliche und nützliche Art, darüber nachzudenken, sind Funktionen höherer Ordnung. Zum Beispiel Lambdas erstellen oder anonyme innere Klassen verwenden, damit der Code an die Abstraktion übergeben wird. Im Allgemeinen können Sie Duplikate entfernen, aber wenn es nicht wirklich eine Beziehung zwischen ihnen gibt (wenn sich eines ändert, muss sich das andere ändern), kann dies die Modularität beeinträchtigen, ohne Abhilfe zu schaffen.
Persönlich ignoriere ich es und gehe weiter. Wenn es so seltsam ist, dass es besser ist, es duplizieren zu lassen, könnten Sie Ewigkeiten damit verbringen, es zu überarbeiten, und der nächste Entwickler wird einen Blick darauf werfen und Ihre Änderung rückgängig machen!
quelle
Ohne ein Codebeispiel ist es schwierig zu sagen, warum Ihr Code keine leicht identifizierbare Abstraktion aufweist. Mit dieser Einschränkung, hier sind ein paar Ideen:
Die größte Schwierigkeit in dieser Übung besteht darin, dass Ihre Funktion wahrscheinlich zu viele unabhängige Verhaltensweisen auf einer bestimmten Abstraktionsebene enthält und Sie einige davon auf einer niedrigeren Ebene behandeln müssen. Sie vermuten zu Recht, dass Klarheit der Schlüssel zur Aufrechterhaltung des Codes ist, aber das Verhalten des Codes (sein aktueller Zustand) deutlich zu machen, unterscheidet sich stark von der Absicht des Codes.
Machen Sie das Wie der kleineren Codeteile abstrakt, indem Sie ihre Funktionssignaturen das Was identifizieren lassen, und die größeren Teile sollten einfacher zu klassifizieren sein.
quelle