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)
  • ...

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.


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).


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.


1
+1 o „zasadzie trzech”. Zawsze jestem zdumiony, jak szerokie jest to zastosowanie.
andy mango

1
To nie odpowiada na pytanie jak .
Jan Doggen,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.