Zpo-5-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:
==Duplicated Code==
==Composite: struktura==


[[Image:zpo-5-wyk-Slajd30.PNG|Duplicated Code]]
[[Image:zpo-5-wyk-Slajd30.PNG|Composite: struktura]]




Najpopularniejszym 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.
Centralnym elementem wzorca jest interfejs Component, który reprezentuje dowolny obiekt w strukturze drzewiastej. Posiada on możliwości dodawania i usuwania swojego obiektu potomnego (oczywiście, także typu Component) oraz odwołania się do wybranego potomka. Zawiera on także metodę ''operation'' ''(),'' którą należy wykonać na każdym węźle struktury.  


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ą.
Interfejs Component posiada dwie implementacje: Leaf oraz Composite. Klasa Leaf reprezentuje obiekty, które nie posiadają potomków (czyli liście w strukturze), natomiast Composite jest dowolnym węzłem pośrednim. Ponieważ każdy węzeł pośredni zarządza także poddrzewem, którego jest korzeniem, dlatego metoda ''operation'' ''(),'' poza wykonaniem operacji specyficznych dla każdego węzła, wywołuje swoje odpowiedniki w obiektach potomnych, w ten sposób propagując wywołanie.  


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.
Z punktu widzenia klienta taka struktura umożliwia zarządzanie całością za pomocą jednego obiektu – korzenia drzewa. Niepotrzebna jest także wiedza o rozmiarze drzewa, ponieważ wywołanie zostanie przekazane automatycznie do wszystkich jego elementów.




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

Aktualna wersja na dzień 11:03, 17 paź 2006

Composite: struktura

Composite: struktura


Centralnym elementem wzorca jest interfejs Component, który reprezentuje dowolny obiekt w strukturze drzewiastej. Posiada on możliwości dodawania i usuwania swojego obiektu potomnego (oczywiście, także typu Component) oraz odwołania się do wybranego potomka. Zawiera on także metodę operation (), którą należy wykonać na każdym węźle struktury.

Interfejs Component posiada dwie implementacje: Leaf oraz Composite. Klasa Leaf reprezentuje obiekty, które nie posiadają potomków (czyli liście w strukturze), natomiast Composite jest dowolnym węzłem pośrednim. Ponieważ każdy węzeł pośredni zarządza także poddrzewem, którego jest korzeniem, dlatego metoda operation (), poza wykonaniem operacji specyficznych dla każdego węzła, wywołuje swoje odpowiedniki w obiektach potomnych, w ten sposób propagując wywołanie.

Z punktu widzenia klienta taka struktura umożliwia zarządzanie całością za pomocą jednego obiektu – korzenia drzewa. Niepotrzebna jest także wiedza o rozmiarze drzewa, ponieważ wywołanie zostanie przekazane automatycznie do wszystkich jego elementów.


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