Zpo-8-lab: 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:
=Ćwiczenie 8. Wzorce projektowe cz. III=
=Ćwiczenie 8: Identyfikacja obszarów wymagających refaktoryzacji =


==Informacje wstępne==
==Informacje wstępne==
Ćwiczenie jest realizowane w języku Java w środowisku Eclipse 3.2.
Przed przystąpieniem do realizacji ćwiczenia należy zapozanać się z wykładem.
Przed przystąpieniem do realizacji ćwiczenia należy zapozanać się z wykładem.
Celem ćwiczenia jest zastosowanie metryk oraz narzędzia XSmells do identyfikacji obszarów kodu wymagających refaktoryzacji (tzw. przykrych zapachów w kodzie programu).
Ćwiczenie jest ostatnią częścią związaną z wzorcami projektowymi. Celem jest zastosowanie kolejnych wzorców w przykładowym systemie obiektowym dotyczącym [[ZPO-bank|banku]].


==Instalacja==
==Instalacja==    
Przygotowanie do ćwiczenia polega na zainstalowaniu JDK 5.0 [http://java.sun.com/javase/downloads/index.jsp] oraz środowiska Eclipse [http://www.eclipse.org/downloads] w wersji 3.2
Przygotowanie do ćwiczenia polega na zainstalowaniu JDK 5.0 [http://java.sun.com/javase/downloads/index.jsp] oraz środowiska Eclipse [http://www.eclipse.org/downloads] w wersji 3.2
Ćwiczenie jest kontynuacją poprzedniego, dlatego należy prowadzić prace w dotychczasowym projekcie.
Dodatkowo należy zainstalować wtyczkę Metrics (opisaną w materiale do ćwiczenia nr 4) oraz wtyczkę [[media:xsmells.zip|XSmells]] autorstwa Błażeja Pietrzaka (instrukcja instalacji znajduje się w pliku)
Po uruchomieniu środowiska należy zaimportować (menu File->Import->Existing projects into workspace) [[media:sudoku.zip|przykładowy projekt Sudoku]].


==Zadanie 1==
==Zadanie 1==
Zaimplementuj w systemie bankowym mechanizm wykonywania raportów, stanowiący realizację wzorca Visitor. Każdy raport jest obiektem Visitor, który odwiedza kolejne typy rachunków i produktów bankowych (obiektów Element), wykonując na nich operacje specyficzne dla danej klasy elementów.
Zadanie polega na próbie zidentyfikowania przykrego zapachu Long Method w klasach ''com.vitting.rcpsudoku.model.SudokuDocument'' oraz ''com.vitting.rcpsudoku.rules.Rule4''.
Długa metoda to nie tylko metoda o dużej liczbie linii kodu, ale przede wszystkim wykonująca zbyt wiele czynności, zatem trudna w zrozumieniu i przetestowaniu. Dlatego warto rozważyć następujące kryteria:
* rozmiar kodu
* złożoność cyklomatyczną metody
* rozmiar komentarzy
* liczba parametrów
* liczba instrukcji return


Stwórz metodę w klasie bank, odpowiedzialną za uruchomienie wykonania raportu, która przyjmuje obiekt Raport jako parametr.
Typowym mechanizmem służącym do oceny tych kryteriów są oczywiście metryki. Na podstawie wyników uzyskanych za pomocą wtyczki Metrics oraz np.
arkusza kalkulacyjnego oceń, które z metod są obciążone wymienionym przykrym zapachem. Które spośród metryki okazały się przydatne w wykrywaniu tego przykrego zapachu?


Zaimplementuj następujące raporty:
Następnie uruchom dla tych samych klas wtyczkę XSmells, która samodzielnie ocenia obecność przykrych zapachów i porównaj otrzymane wyniki.
* obliczający sumę sald na wszystkich rachunkach, których posiadają bieżący typ oprocentowania A
 
* wykonujący zestawienie wszystkich rachunków o wartości salda powyżej 1000 PLN
Na tej podstawie sformułuj reguły dotyczące występowania tego przykrego zapachu


==Zadanie 2==
==Zadanie 2==
Zaimplementuj w systemie bankowym możliwość chronienia niektórych danych rachunku w postaci wzorca Proxy. Wywołania metod pytających o wartość salda, nazwisko właściciela etc. powinny zwracać wartości nieznaczące, np. -1 lub "--nieznany--".
Korzystając z doświadczeń uzyskanych podczas realizacji poprzedniego zadania, określ warunki występowania innego przykrego zapachu - Large Class. Dotyczy on zbyt dużej odpowiedzialności powierzonej klasie.
Użycie ochrony powoduje, że nie można odczytać wartości wybranych pól (m.in. nie są one widoczne w raportach).
Zwróć uwagę na jego wielokryterialność - wśród jego symptomów można wymienić m.in.:
* duża liczba pól klasy
* duża liczba metod
* duża liczba instancji klasy
* duża liczba implementowanych interfejsów
* duża liczba linii kodu klasy
* niska spójność klasy


Metody wprowadzające i usuwające ochronę obiektu Rachunek powinny być dostępne w klasie Bank.
Jakie metryki pozwalają ocenić jego występowanie? Ponownie, spróbuj zdefiniować reguły dotyczące występowania tego przykrego zapachu.


==Pytania do dyskusji==
==Pytania do dyskusji==
# Wzorce Proxy, Adapter i Decorator mimo podobnej struktury różnią się od siebie w bardzo istotny sposób. Dokonaj ich porównania.
# W jaki sposób agregować wyniki różnych metryk w celu identyfikacji przykrego zapachu?
# Czy obiekty poleceń występujące we wzorcu Command mogą podlegać zarządzaniu przez pulę (wzorzec Pool of Objects)? Odpowiedź uzasadnij.
# Jak wykorzystać wiedzę o zależnościach pomiędzy różnymi przykrymi zapachami do wykrywania przykrego zapachu Large Class?
 
==Literatura==
# E. Gamma, R. Helm, R. Johnson, J. Vlissides "Design Patterns: Elements of Reusable Object-Oriented Software". Addison-Wesley, 1995.
# D. Gallardo "Java Design Patterns 101". [[http://www-128.ibm.com/developerworks/edu/j-dw-javapatt-i.html IBM]]
# J. Cooper "Java. Wzorce projektowe". Helion, 2001
# A. Shalloway, J. R. Trott "Programowanie zorientowane obiektowo. Wzorce projektowe". Wydanie II, Helion, 2005.

Aktualna wersja na dzień 09:38, 30 paź 2006

Ćwiczenie 8: Identyfikacja obszarów wymagających refaktoryzacji

Informacje wstępne

Przed przystąpieniem do realizacji ćwiczenia należy zapozanać się z wykładem. Celem ćwiczenia jest zastosowanie metryk oraz narzędzia XSmells do identyfikacji obszarów kodu wymagających refaktoryzacji (tzw. przykrych zapachów w kodzie programu).

Instalacja

Przygotowanie do ćwiczenia polega na zainstalowaniu JDK 5.0 [1] oraz środowiska Eclipse [2] w wersji 3.2 Dodatkowo należy zainstalować wtyczkę Metrics (opisaną w materiale do ćwiczenia nr 4) oraz wtyczkę XSmells autorstwa Błażeja Pietrzaka (instrukcja instalacji znajduje się w pliku) Po uruchomieniu środowiska należy zaimportować (menu File->Import->Existing projects into workspace) przykładowy projekt Sudoku.

Zadanie 1

Zadanie polega na próbie zidentyfikowania przykrego zapachu Long Method w klasach com.vitting.rcpsudoku.model.SudokuDocument oraz com.vitting.rcpsudoku.rules.Rule4. Długa metoda to nie tylko metoda o dużej liczbie linii kodu, ale przede wszystkim wykonująca zbyt wiele czynności, zatem trudna w zrozumieniu i przetestowaniu. Dlatego warto rozważyć następujące kryteria:

  • rozmiar kodu
  • złożoność cyklomatyczną metody
  • rozmiar komentarzy
  • liczba parametrów
  • liczba instrukcji return

Typowym mechanizmem służącym do oceny tych kryteriów są oczywiście metryki. Na podstawie wyników uzyskanych za pomocą wtyczki Metrics oraz np. arkusza kalkulacyjnego oceń, które z metod są obciążone wymienionym przykrym zapachem. Które spośród metryki okazały się przydatne w wykrywaniu tego przykrego zapachu?

Następnie uruchom dla tych samych klas wtyczkę XSmells, która samodzielnie ocenia obecność przykrych zapachów i porównaj otrzymane wyniki.

Na tej podstawie sformułuj reguły dotyczące występowania tego przykrego zapachu

Zadanie 2

Korzystając z doświadczeń uzyskanych podczas realizacji poprzedniego zadania, określ warunki występowania innego przykrego zapachu - Large Class. Dotyczy on zbyt dużej odpowiedzialności powierzonej klasie. Zwróć uwagę na jego wielokryterialność - wśród jego symptomów można wymienić m.in.:

  • duża liczba pól klasy
  • duża liczba metod
  • duża liczba instancji klasy
  • duża liczba implementowanych interfejsów
  • duża liczba linii kodu klasy
  • niska spójność klasy

Jakie metryki pozwalają ocenić jego występowanie? Ponownie, spróbuj zdefiniować reguły dotyczące występowania tego przykrego zapachu.

Pytania do dyskusji

  1. W jaki sposób agregować wyniki różnych metryk w celu identyfikacji przykrego zapachu?
  2. Jak wykorzystać wiedzę o zależnościach pomiędzy różnymi przykrymi zapachami do wykrywania przykrego zapachu Large Class?