Zpo-8-wyk-Slajd30: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Bwalter (dyskusja | edycje)
Nie podano opisu zmian
 
Bwalter (dyskusja | edycje)
Nie podano opisu zmian
 
Linia 1: Linia 1:
==Przykład 2==
==Duplicated Code==


[[Image:zpo-8-wyk-Slajd30.PNG|Przykład 2]]
[[Image:zpo-8-wyk-Slajd30.PNG|Duplicated Code]]




Drugi przykład jest bardziej skomplikowany i pokazuje, że realizacja tego przekształcenia może napotykać na problemy.
Najczęściej spotykanym problemem, który dotyczy niemal każdego systemu, jest duplikacja kodu. Badania wskazują, że średnio ok. 20-30% kodu to dokładne lub przybliżone duplikaty. Istotą duplikatów jest problem ze śledzeniem zmian: zwykle poprawki i aktualizacje są stosowane jedynie do jednej kopii, natomiast pozostałe – w zamyśle programisty zachowujące się identycznie jak pierwsza – pozostają niezmienione. To rodzi sporo trudnych do zlokalizowania błędów.


Tym razem w klasie Wydawnictwo są zdefiniowane dwie metody: ''wyznaczRegal'' ''(),'' która wskazuje, na którym regale powinno znaleźć się Wydawnictwo, oraz ''czyDuze'' ''(),'' określające rozmiar Wydawnictwa. Metody te są wykorzystane w konstruktorze klasy Książka, w którym wyznaczenie regału jest wykonywane tylko dla dużych Wydawnictw. Należy jednak zauważyć, że metoda ''czyDuze'' ''()'' jest pokryta w klasie Książka, co wskazuje, że metoda ''wyznaczRegal'' ''()'' jest wywoływana w nadklasie, natomiast metoda ''czyDuze'' ''()'' – lokalnie.  
Istotnym problemem jest wykrywanie duplikatów. Najprostsze metody posługują się jedynie zwykłym dopasowaniem tekstu, jednak ich skuteczność jest ograniczona. Bardziej zaawansowane dopuszczają przemianowania identyfikatorów, a nawet zmiany algorytmu. W niektórych przypadkach za duplikaty uznaje się także fragmenty nie identyczne, ale w dużym stopniu podobne. Ocena podobieństwa fragmentów kodu wymaga złożonych struktur danych i ma dużą złożoność obliczeniową.


Taki graf wywołań powoduje, że nie można w prosty sposób przenieść fragmentu konstruktora Książki do klasy Wydawnictwo, ponieważ klasa ta posiada własną definicję metody ''czyDuze'' ''(),'' której nie można w takim wypadku zastosować.
Sposób działania zależy od lokalizacji problemu. W przypadku pojedynczej klasy należy wyłączyć zduplikowany kod do wspólnej metody. W przypadku klas "bliźniaczych" przesunąć go do wspólnej nadklasy jako dziedziczoną metodę. W przypadku klas niespokrewnionych ze sobą możliwe jest m.in. utworzenie nowej klasy z duplikatami i odwoływanie się do niej lub jej instancji z dotychczasowych lokalizacji zduplikowanego kodu.




[[zpo-8-wyk-Slajd29 | << Poprzedni slajd]] | [[zpo-8-wyk-toc|Spis treści ]] | [[zpo-8-wyk-Slajd31 | Następny slajd >>]]
[[zpo-8-wyk-Slajd29 | << Poprzedni slajd]] | [[zpo-8-wyk-toc|Spis treści ]] | [[zpo-8-wyk-Slajd31 | Następny slajd >>]]

Aktualna wersja na dzień 18:14, 4 lis 2006

Duplicated Code

Duplicated Code


Najczęściej spotykanym problemem, który dotyczy niemal każdego systemu, jest duplikacja kodu. Badania wskazują, że średnio ok. 20-30% kodu to dokładne lub przybliżone duplikaty. Istotą duplikatów jest problem ze śledzeniem zmian: zwykle poprawki i aktualizacje są stosowane jedynie do jednej kopii, natomiast pozostałe – w zamyśle programisty zachowujące się identycznie jak pierwsza – pozostają niezmienione. To rodzi sporo trudnych do zlokalizowania błędów.

Istotnym problemem jest wykrywanie duplikatów. Najprostsze metody posługują się jedynie zwykłym dopasowaniem tekstu, jednak ich skuteczność jest ograniczona. Bardziej zaawansowane dopuszczają przemianowania identyfikatorów, a nawet zmiany algorytmu. W niektórych przypadkach za duplikaty uznaje się także fragmenty nie identyczne, ale w dużym stopniu podobne. Ocena podobieństwa fragmentów kodu wymaga złożonych struktur danych i ma dużą złożoność obliczeniową.

Sposób działania zależy od lokalizacji problemu. W przypadku pojedynczej klasy należy wyłączyć zduplikowany kod do wspólnej metody. W przypadku klas "bliźniaczych" przesunąć go do wspólnej nadklasy jako dziedziczoną metodę. W przypadku klas niespokrewnionych ze sobą możliwe jest m.in. utworzenie nowej klasy z duplikatami i odwoływanie się do niej lub jej instancji z dotychczasowych lokalizacji zduplikowanego kodu.


<< Poprzedni slajd | Spis treści | Następny slajd >>