Wie entferne ich doppelten Code (im Allgemeinen)?

10

Wie können Sie in einer OO-Sprache (z. B. Java) doppelten Code je nach Umfang des Auftretens reparieren? Ich würde mit (zum Beispiel) beginnen

  • Führen Sie in derselben Klasse (Bereich) das Refactoring der Extraktionsmethode durch (Fix).
  • Führen Sie in Klassen derselben Hierarchie (Gültigkeitsbereich) die Extraktionsmethode und das Pull-Up (Fix) aus.
  • ...
Peter Kofler
quelle
Schauen Sie sich ein Beispiel für die Implementierung des DRY-Prinzips (Wiederholen Sie sich nicht) mit derselben Klasse an: geekswithblogs.net/chrisfalter/archive/2008/03/07/…
NoChance
Die ursprüngliche Frage bei SO ( stackoverflow.com/questions/7380946/… ) wurde geschlossen. Also habe ich es hierher gebracht.
Peter Kofler

Antworten:

8

Kürzlich habe ich in Onkel Bobs "Clean Code" eine gute Antwort auf meine Frage gefunden, die ich teilen möchte. Er unterscheidet drei Arten der Vervielfältigung

Teile identischen Codes sollten durch eine einzige Methode ersetzt werden. Die Lösung wäre also, die Methode zu extrahieren und an allgemeines Verhalten zu delegieren.

  • Führen Sie auf dieselbe Weise die Option Lokale Variable extrahieren aus und verwenden Sie sie erneut.
  • Führen Sie in derselben Klasse das Refactoring der Extraktionsmethode durch.
  • in Klassen derselben Hierarchie Methode extrahieren und hochziehen. Möglicherweise wird eine Hierarchie erstellt, um einen Platz für die Methoden zu finden.
  • Verwenden Sie in Klassen mit separaten Hierarchien die Delegierung an neue Objekte.
  • Wenn die Methoden keinen umschließenden Status benötigen, wird möglicherweise das Muster "lib" angewendet (dh ein Container für statische Methoden, normalerweise SthUtiloder genannt SthLib).

Fälle von switch/caseund if/elsedie immer auf die gleichen Bedingungen testen .

  • Diese sollten durch Polymorphismus ersetzt werden.

Module, die ähnliche Algorithmen implementieren . Diese sind am schwersten zu finden, da kein Klondetektor sie finden kann.

  • Da der Umfang größer ist, werden Designmuster verwendet. Das Entwurfsmuster der Vorlagenmethode kann für Algorithmen innerhalb einer Klassenhierarchie angewendet werden.
  • Das Strategieentwurfsmuster kann für jeden Algorithmus angewendet werden, der an verschiedenen Stellen verwendet wird.

Auch ein gültiger Punkt, der von Oded erwähnt wird, wenn es um verschiedene Versionen von Bibliotheken geht

  • auf einer einzigen Version konsolidieren. Hier könnte das Fassadenmuster helfen.

Am Ende ist der beste Satz, um meine Frage zu beantworten, von stimms:

Die in OO-Sprachen verwendete Methode zur Wiederverwendung von Code sind Objekte.

Peter Kofler
quelle
5

Im Allgemeinen: Konsolidieren Sie doppelten Code an einem einzigen Ort und stellen Sie sicher, dass die ursprüngliche Duplizierungssite den konsolidierten Ort aufruft.

In Ihren Beispielen wäre dies innerhalb einer Klasse die extrahierte Methode und innerhalb einer Reihe von Klassen die Pulled-up-Methode innerhalb der Basisklasse.

Beim Kopieren und Einfügen von Code werden die Duplikate entfernt und sichergestellt, dass alle Benutzer jetzt die einzelne Kopie verwenden (auf welcher Ebene auch immer).

Wenn Sie mit verschiedenen Versionen von Bibliotheken arbeiten, konsolidieren Sie diese auf einer einzigen Version (falls möglich).

Oded
quelle
Wäre es nicht die "Pulldown" -Methode, wenn es sich um eine Basisklasse handelt? Ich stelle mir Basisklassen immer als physisch unter den abgeleiteten Klassen vor.
Dave Nay
Der Eigenname aus dem Refactoring-Buch lautet "pull up".
Peter Kofler
1

Ich denke, dies ist eine offene Frage, aber es hängt auch vom Status des Codes ab. Ich meine, Sie können den doppelten Code je nach Kontext ein wenig tolerieren. Die Dreierregel ist in dieser Angelegenheit gut.

Dreierregel Wenn Sie zum ersten Mal etwas tun, tun Sie es einfach. Wenn Sie das zweite Mal etwas Ähnliches tun, zucken Sie bei der Vervielfältigung zusammen, aber Sie machen die Vervielfältigung trotzdem. Wenn Sie das dritte Mal etwas Ähnliches tun, überarbeiten Sie es.

Obwohl dies ziemlich fraglich ist, werden in diesem Beitrag auch Fälle berücksichtigt, in denen Sie doppelten Code tolerieren würden.

Will Hughes
quelle
1
+1 über die "Dreierregel". Ich bin immer wieder erstaunt, wie breit anwendbar es ist.
Andy Mango
1
Dies beantwortet nicht die Wie- Frage.
Jan Doggen