Jak usunąć zduplikowany kod (ogólnie)?

10

W języku OO (np. Między innymi w Javie) jak naprawić duplikat kodu w zależności od zakresu jego występowania? Zacznę od (na przykład)

  • w tej samej klasie (zakresie) wykonaj refaktoryzację metody ekstrakcji (poprawka)
  • w klasach o tej samej hierarchii (zakresie) wykonaj Extract Method i Pull Up (fix)
  • ...
Peter Kofler
źródło
spójrz na przykład implementacji zasady DRY (nie powtarzaj się) z tą samą klasą pod tym adresem: geekswithblogs.net/chrisfalter/archive/2008/03/07/…
NoChance 11.11.11
Oryginalne pytanie na SO ( stackoverflow.com/questions/7380946/... ) zostało zamknięte. Więc przeniosłem to tutaj.
Peter Kofler,

Odpowiedzi:

8

Niedawno znalazłem dobrą odpowiedź na moje pytanie w „Czystym kodzie” wuja Boba, którym chcę się podzielić. Rozróżnia trzy typy powielania

Fragmenty identycznego kodu należy zastąpić jedną metodą. Tak więc poprawka polegałaby na wyodrębnieniu metody i delegowaniu do typowego zachowania.

  • w tej samej metodzie wykonaj Wyodrębnij zmienną lokalną i użyj jej ponownie.
  • w tej samej klasie przeprowadź refaktoryzację metody wyodrębniania.
  • w klasach o tej samej hierarchii Wyodrębnij metodę i wyciągnij ją. Można stworzyć hierarchię, aby znaleźć miejsce dla metod.
  • w klasach oddzielnych hierarchii użyj delegacji do nowych obiektów.
  • Jeśli metody nie wymagają żadnego stanu zamykającego, można zastosować wzorzec „lib” (tzn. Kontener dla metod statycznych, zwykle nazywany SthUtillub SthLib).

przypadki switch/casei if/elsezawsze sprawdzają ten sam zestaw warunków .

  • Należy je zastąpić polimorfizmem.

Moduły implementujące podobne algorytmy . Są najtrudniejsze do znalezienia, ponieważ żaden detektor klonów nie może ich znaleźć.

  • Ponieważ zakres jest większy, stosowane są wzorce. Wzorzec projektowy metody szablonowej może być zastosowany do algorytmów wewnątrz hierarchii klas.
  • Wzorzec projektowania strategii można zastosować do dowolnego algorytmu używanego w różnych miejscach.

Również ważny punkt wspomniany przez Odeda, w przypadku różnych wersji bibliotek

  • skonsolidować na jednej wersji. Pomocny może być tutaj wzór fasady.

Ostatecznie najlepszym zdaniem, na które można odpowiedzieć na moje pytanie, są bodźce:

Metoda ponownego wykorzystania kodu używana w językach OO to obiekty.

Peter Kofler
źródło
5

Ogólnie - skonsoliduj zduplikowany kod w jednym miejscu i upewnij się, że oryginalna witryna do powielania dzwoni do skonsolidowanego miejsca.

W twoich przykładach w ramach klasy byłaby to wyodrębniona metoda, aw zestawie klas metoda wyciągnięta w klasie bazowej.

W kodzie kopiuj-wklej oznaczałoby to usunięcie duplikatów i upewnienie się, że wszyscy użytkownicy używają teraz pojedynczej kopii (niezależnie od poziomu).

W przypadku różnych wersji bibliotek należy skonsolidować jedną wersję (jeśli to możliwe).

Oded
źródło
Czy nie byłaby to metoda „rozwijana”, gdyby należała do klasy podstawowej? Zawsze wyobrażam sobie, że klasy podstawowe są fizycznie w ramach klas pochodnych.
Dave Nay,
Właściwa nazwa z książki Refaktoryzacja to „pull up”.
Peter Kofler,
1

Myślę, że jest to pytanie otwarte, ale zależy to również od stanu kodu. Mam na myśli, że możesz trochę tolerować duplikat kodu w zależności od kontekstu. Zasada trzech jest dobra w tej sprawie.

Reguła trzech Po raz pierwszy coś robisz, po prostu to robisz. Za drugim razem, gdy robisz coś podobnego, skrzywisz się przy powielaniu, ale i tak robisz to samo. Za trzecim razem, gdy zrobisz coś podobnego, dokonujesz refaktoryzacji.

Chociaż jest to dość dyskusyjne, ten post rozważa również przypadki, w których tolerowałbyś duplikat kodu.

Will Hughes
źródło
1
+1 o „zasadzie trzech”. Zawsze jestem zdumiony, jak szerokie jest to zastosowanie.
andy mango
1
To nie odpowiada na pytanie jak .
Jan Doggen,