Zpo-10-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
 
(Nie pokazano 2 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 1: Linia 1:
=Ćwiczenie 10. Wzorce projektowe cz. II=
=Ćwiczenie 10. Refaktoryzacja prostego programu w języku Java=


==Informacje wstępne==
==Informacje wstępne==
Ćwiczenie jest realizowane w języku Java w środowisku Eclipse 3.2.
Ć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 [http://www-128.ibm.com/developerworks/library/os-ecref artykułem] nt. refaktoryzacji w Eclipse IDE]
Ćwiczenie jest kontynuacją cyklu związanego z wzorcami projektowymi. Celem jest zastosowanie kolejnych wzorców w przykładowym systemie obiektowym dotyczącym [[ZPO-bank|banku]].
Celem ćwiczenia jest wykonanie przekształceń refaktoryzacyjnych wybranych fragmentów kodu znajdujących się w załączonym projekcie


==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
Po uruchomieniu środowiska należy zaimportować (menu File->Import->Existing projects into workspace) [[media:zpo-10-lab.zip|projekt]], w którym będą stosowane wzorce projektowe.
Po uruchomieniu środowiska należy zaimportować (menu File->Import->Existing projects into workspace) [[media:zpo-8-konwerter.zip|projekt Konwerter]].


==Zadanie==
==Zadanie 1==
Zaimplementuj w systemie bankowym mechanizm naliczania oprocentowania w postaci wzorca State. Uwzględnij trzy rodzaje oprocentowania:
Oceń jakość programu Konwerter. Wskaż naruszenia zasad projektowych (tzw. przykre zapachy), które są w nim obecne. Zaproponuj przekształcenia, które pozwolą je usunąć.
* oprocentowanie typu A: 2% do kwoty 800 PLN oraz 4% od kwoty powyżej 800 PLN
* oprocentowanie typu B: 3% do kwoty 1000 PLN oraz 5% od kwoty powyżej 1000 PLN
* oprocentowanie typu C: 3.5%, niezależnie od wartości salda na rachunku klienta
Mechanizmy naliczania oprocentowania należy zaimplementować w postaci osobnych klas, dziedziczących po wspólnej nadklasie lub implementujących wspólny interfejs.  


Zmiana oprocentowania związanego z rachunkiem bankowym polega na zmianie bieżącego obiektu reprezentującego oprocentowanie. Polecenia naliczenia odsetek powinno być delegowane do bieżącego obiektu reprezentującego oprocentowanie.
==Zadanie 2==
 
Zaproponuj łańcuch przekształceń refaktoryzacyjnych pozwalający przekształcić program Konwerter do postaci, w której:
Zwróć uwagę, aby obiekty reprezentujące oprocentowanie były bezstanowe, tzn. nie przechowywały informacji związanej z rachunkiem (np. wysokości salda). Referencja do rachunku powinna być przekazywana obiektowi reprezentującemu oprogramwanie jako parametr metody obliczającej odsetki.
* każda konwersja będzie niezależną klasą, implementującą wspólny interfejs, o nazwie np. Konwersja
 
* każda konwersja jest dwukierunkowa
==Pytania do dyskusji==
* dla każdej rodziny wielkości (np. dotyczących długości, objętości lub powierzchni) istnieje jedna, wyróżniona wielkość, nazywana wielkością znormalizowaną. Każda konwersja umożliwia przeliczenie podanej wartości do wielkości znormalizowanej (np. jeżeli dla długości wielkością taką jest metr, wówczas klasa konwertująca jardy będzie przeliczała je na metry, a dopiero w dalszej kolejności na żądaną jednostkę wyjściową, np. cale).
# Wzorzec Prototype jest zaimplementowany w języku Java w postaci metody ''clone()'', wykonującej tzw. płytką kopię obiektu. Dlaczego domyślnie nie jest wykonywana głęboka kopia obiektu?
* dodanie nowej jednostki wymaga jedynie zdefiniowania nowej klasy i dodania jej instancji do listy dostępnych konwersji
# Co spowodowałoby uczynienie ogniw łańcucha we wzorcu Chain of Responsibility obiektami przechowującymi stan żądania?
 
==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:41, 30 paź 2006

Ćwiczenie 10. Refaktoryzacja prostego programu w języku Java

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 artykułem nt. refaktoryzacji w Eclipse IDE] Celem ćwiczenia jest wykonanie przekształceń refaktoryzacyjnych wybranych fragmentów kodu znajdujących się w załączonym projekcie

Instalacja

Przygotowanie do ćwiczenia polega na zainstalowaniu JDK 5.0 [1] oraz środowiska Eclipse [2] w wersji 3.2 Po uruchomieniu środowiska należy zaimportować (menu File->Import->Existing projects into workspace) projekt Konwerter.

Zadanie 1

Oceń jakość programu Konwerter. Wskaż naruszenia zasad projektowych (tzw. przykre zapachy), które są w nim obecne. Zaproponuj przekształcenia, które pozwolą je usunąć.

Zadanie 2

Zaproponuj łańcuch przekształceń refaktoryzacyjnych pozwalający przekształcić program Konwerter do postaci, w której:

  • każda konwersja będzie niezależną klasą, implementującą wspólny interfejs, o nazwie np. Konwersja
  • każda konwersja jest dwukierunkowa
  • dla każdej rodziny wielkości (np. dotyczących długości, objętości lub powierzchni) istnieje jedna, wyróżniona wielkość, nazywana wielkością znormalizowaną. Każda konwersja umożliwia przeliczenie podanej wartości do wielkości znormalizowanej (np. jeżeli dla długości wielkością taką jest metr, wówczas klasa konwertująca jardy będzie przeliczała je na metry, a dopiero w dalszej kolejności na żądaną jednostkę wyjściową, np. cale).
  • dodanie nowej jednostki wymaga jedynie zdefiniowania nowej klasy i dodania jej instancji do listy dostępnych konwersji