Zaawansowane projektowanie obiektowe
Katalog przekształceń refaktoryzacyjnych cz. III
Prowadzący:
Bartosz Walter
Katalog przekształceń refaktoryzacyjnych cz. III
1
Bartosz Walter
Zaawansowane projektowanie obiektowe
Agenda
1. Przekształceniapólreprezentującychstanobiektu
2. Przekształceniawobrębiehierarchiidziedziczenia
3. Inneprzekształcenia
Katalog przekształceń refaktoryzacyjnych cz. III (2)
Wykład ten jest trzecim i ostatnim poświęconym przeglądowi
przekształceń refaktoryzacyjnych. Podczas niego zostaną omówione
następujące grupy przekształceń:
•przekształcenia pól reprezentujących stan obiektu
•przekształcenia hierarchii dziedziczenia
•pozostałe, nie ujęte w innych grupach przekształcenia
Katalog przekształceń refaktoryzacyjnych cz. III
2
Bartosz Walter
Zaawansowane projektowanie obiektowe
Agenda
1. Przekształceniapólreprezentującychstanobiektu
2. Przekształceniawobrębiehierarchiidziedziczenia
3. Inneprzekształcenia
Katalog przekształceń refaktoryzacyjnych cz. III (3)
Pierwsza część dotyczy refaktoryzacji pól reprezentujących stan obiektu.
Katalog przekształceń refaktoryzacyjnych cz. III
3
Bartosz Walter
Zaawansowane projektowanie obiektowe
Replace Type Code with Class
M. Fowler, 1999
Problem
Klasaposiadapoleoskończonejliczbiewartości,któregowartośćnie
wpływanazachowanie
Cel
Przekształceniepolawnowąklasę
Mechanika
• utwórznowąklasę
• dodajdoklasyźródłowejpoletyputejklasyizainicjujje
• dlakaŜdejmetodywklasieźródłowej,którakorzystazoryginalnego
polastanu,utwórzjejodpowiednikkorzystającyznowegopola
• zmieńmetodyklienckie,takabykorzystałyznowychmetod
• skompilujiprzetestuj
• usuństaremetody
Katalog przekształceń refaktoryzacyjnych cz. III (4)
Przechowywanie informacji o stanie obiektu w postaci pola typu
prymitywnego o zmiennej wartości jest bardzo powszechnym
rozwiązaniem. Jednak w zaleŜności od sposobu, w jaki pole
reprezentujące stan wpływa na zachowanie swojego właściciela, z
zagadnienia tego moŜna wyróŜnić kilka odrębnych problemów, i kaŜdy z
nich rozwiązywać za pomocą innego przekształcenia refaktoryzacyjnego.
Pierwsze z nich dotyczy sytuacji, gdy pole przyjmuje skończoną i dobrze
określoną liczbę wartości, raczej nie zmienia wartości w trakcie swojego
istnienia, oraz, co bardzo waŜne, wartość pola nie wpływa na zachowanie
obiektu. W związku z ostatnią cechą zmiana moŜe zostać zrealizowana
za pomocą jednej klasy, bez konieczności definiowania podklas czy
polimorficznego pokrywania metod.
Celem przekształcenia jest transformacja pola w nową klasę, której
wartości pól będą odzwierciedlały stan właściciela tego obiektu.
Pierwszym krokiem zmiany jest utworzenie nowej klasy oraz dodanie do
klasy oryginalnej referencji do obiektu nowoutworzonej klasy. Następnie
naleŜy dla kaŜdej metody korzystającej z dotychczasowego pola w klasie
źródłowej stworzyć jej odpowiednik korzystający z nowego pola i nowej
klasy. Warto zauwaŜyć, Ŝe w ten sposób klasa w dotychczasowej postaci
moŜe istnieć bez zmiany swojej funkcjonalności. Kolejnym krokiem jest
modyfikacja klientów, tak aby korzystały z nowych metod.
Po zakończeniu przekształcenia, które pozwala nam hermetyzować
proces zarządzania zmiennymi reprezentującymi stan, moŜna usunąć
stare, nieuŜywane metody.
Katalog przekształceń refaktoryzacyjnych cz. III
4
Bartosz Walter
Zaawansowane projektowanie obiektowe
Przykład
public class KartaCzytelnicza {
public static final int JUNIOR = 0;
public static final int STANDARD = 1;
public static final int SENIOR = 2;
private int typKarty;
public KartaCzytelnicza(int typKarty) {
this.typKarty = typKarty;
}
public void ustawTypKarty(int typKarty) {
this.typKarty = typKarty;
}
public int typKarty() {
return this.typKarty;
}
}
Katalog przekształceń refaktoryzacyjnych cz. III (5)
Jako przykład posłuŜy klasa KartaCzytelnicza, która przechowuje swój typ
w postaci pola
typKarty
. Przyjmuje ono trzy wartości, reprezentowane
przez stałe tej klasy: JUNIOR, STANDARD oraz SENIOR. Klasa
KartaCzytelnicza posiada takŜe metody pozwalające odczytać i zmienić
jej typ.
Katalog przekształceń refaktoryzacyjnych cz. III
5