Programowanie zwinne
Programowanie zwinne
Programowanie zwinne
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Programowanie</strong> <strong>zwinne</strong><br />
Marcin Młotkowski<br />
16 stycznia 2013
Plan wykładu<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
1 Kiedy refaktoryzować<br />
2 Refaktoryzacja powielonego kodu<br />
Wydzielenie metody<br />
Wydzielenie metody z parametrem zapisywalnym<br />
Przemieszczenie pola w górę<br />
Utworzenie metody szablonowej<br />
Wydzielenie klasy<br />
3 Długa metoda<br />
Wydzielenie metody<br />
Zastąpienie zmiennej tymczasowej przez zapytanie<br />
Klasa dla grupy parametrów<br />
Przekazanie obiektu<br />
Zastąpienie metody obiektem<br />
Podział wyrażenia warunkowego<br />
4 Duża klasa<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 2 / 62
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Kiedy refaktoryzować<br />
Brzydkie zapachy w kodzie<br />
powielony kod;<br />
długa metoda;<br />
duża klasa;<br />
długa lista paramterów;<br />
rozbieżna zmiana;<br />
poszatkowanie;<br />
zazdrość o kod;<br />
zbitki danych;<br />
obsesja typów podstawowych;<br />
instrukcje switch;<br />
...<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 3 / 62
Plan wykładu<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie metody<br />
Wydzielenie metody z parametrem zapisywalnym<br />
Przemieszczenie pola w górę<br />
Utworzenie metody szablonowej<br />
Wydzielenie klasy<br />
1 Kiedy refaktoryzować<br />
2 Refaktoryzacja powielonego kodu<br />
Wydzielenie metody<br />
Wydzielenie metody z parametrem zapisywalnym<br />
Przemieszczenie pola w górę<br />
Utworzenie metody szablonowej<br />
Wydzielenie klasy<br />
3 Długa metoda<br />
Wydzielenie metody<br />
Zastąpienie zmiennej tymczasowej przez zapytanie<br />
Klasa dla grupy parametrów<br />
Przekazanie obiektu<br />
Zastąpienie metody obiektem<br />
Podział wyrażenia warunkowego<br />
4 Duża klasa<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 4 / 62
Powielony kod<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie metody<br />
Wydzielenie metody z parametrem zapisywalnym<br />
Przemieszczenie pola w górę<br />
Utworzenie metody szablonowej<br />
Wydzielenie klasy<br />
Fragment kodu jest w kilku miejscach.<br />
Rodzaje powielenia<br />
wspólny fragment kodu w kilku metodach tej samej klasy;<br />
wspólny fragment kodu w metodach podklas;<br />
wspólny fragment kodu w różnych częściach programu.<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 5 / 62
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Schemat postępowania<br />
Wydzielenie metody<br />
Wydzielenie metody z parametrem zapisywalnym<br />
Przemieszczenie pola w górę<br />
Utworzenie metody szablonowej<br />
Wydzielenie klasy<br />
utworzenie nowej metody;<br />
skopiowanie kodu;<br />
analiza wykorzystania zmiennych lokalnych (deklaracje,<br />
parametry);<br />
kompilacja;<br />
zastąpienie starego kodu nową metodą;<br />
kompilacja i testowanie.<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 6 / 62
Prosty przykład<br />
void raport(DataList data)<br />
{<br />
Console.WriteLine(’***************************’);<br />
Console.WriteLine(’ Raport z dn. {0} ’, DateTime.Now);<br />
Console.WriteLine(’***************************’);<br />
}<br />
foreach(DataElement d in data)<br />
{<br />
Console.WriteLine(d.toString());<br />
}<br />
Console.WriteLine(’***********************’);<br />
Console.WriteLine(’******** Koniec *******’);<br />
Console.WriteLine(’***********************’);
Wydzielenie metody<br />
void naglowek() {<br />
Console.WriteLine(’****************************’);<br />
Console.WriteLine(’ Raport z dn. {0} ’, DateTime.Now);<br />
Console.WriteLine(’****************************’);<br />
}<br />
void stopka() {<br />
Console.WriteLine(’****************************’);<br />
Console.WriteLine(’*********** Koniec *********’);<br />
Console.WriteLine(’****************************’);<br />
}<br />
void raport(DataList data) {<br />
naglowek();<br />
foreach(DataElement d in data)<br />
{<br />
Console.WriteLine(d.toString());<br />
}
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie metody<br />
Wydzielenie metody z parametrem zapisywalnym<br />
Przemieszczenie pola w górę<br />
Utworzenie metody szablonowej<br />
Wydzielenie klasy<br />
Łatwe! Bo nie było zmiennych!<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 9 / 62
Wydzielenie metody ze zmiennymi do odczytu<br />
void raport(DataList data, string title)<br />
{<br />
Console.WriteLine(’***** {0} *****’, title);<br />
Console.WriteLine(’ Raport z dn. {0} ’, DateTime.Now);<br />
Console.WriteLine(’*************************’);<br />
}<br />
foreach(DataElement d in data)<br />
{<br />
Console.WriteLine(d.toString());<br />
}<br />
Console.WriteLine(’***************************’);<br />
Console.WriteLine(’********** Koniec *********’);<br />
Console.WriteLine(’***************************’);
Wydzielenie metody ze zmienną<br />
void naglowek(string title) {<br />
Console.WriteLine(’********* {0} *******’, title);<br />
Console.WriteLine(’ Raport z dn. {0} ’, DateTime.Now);<br />
Console.WriteLine(’************************’);<br />
}<br />
void stopka() {<br />
Console.WriteLine(’****************************’);<br />
Console.WriteLine(’*********** Koniec *********’);<br />
Console.WriteLine(’****************************’);<br />
}<br />
void raport(DataList data, string title) {<br />
naglowek(title);<br />
foreach(DataElement d in data)<br />
Console.WriteLine(d.toString());<br />
}
Przykład<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie metody<br />
Wydzielenie metody z parametrem zapisywalnym<br />
Przemieszczenie pola w górę<br />
Utworzenie metody szablonowej<br />
Wydzielenie klasy<br />
void należność(DataList data, string title)<br />
{<br />
double suma = 0;<br />
}<br />
nagłówek(title);<br />
foreach(DataElement d in data)<br />
{<br />
suma += d.kwota;<br />
}<br />
Console.WriteLine("Suma: {0}", suma);<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 12 / 62
Przykład po refaktoryzacji<br />
double podsumowanie(DataList data) {<br />
double suma<br />
foreach(DataElement d in data)<br />
{<br />
suma += d.kwota;<br />
}<br />
return suma;<br />
}<br />
void należność(DataList data, string title) {<br />
double suma = 0;<br />
nagłówek(title);<br />
suma = podsumowanie(data);<br />
Console.WriteLine("Suma: {0}", suma);<br />
}
Kłopoty<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie metody<br />
Wydzielenie metody z parametrem zapisywalnym<br />
Przemieszczenie pola w górę<br />
Utworzenie metody szablonowej<br />
Wydzielenie klasy<br />
misie mikołaje renifery<br />
styczeń 10 14 5<br />
luty 34 12 7<br />
... ... ... ...<br />
podsumowanie 1024 512 2048<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 14 / 62
Opis<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie metody<br />
Wydzielenie metody z parametrem zapisywalnym<br />
Przemieszczenie pola w górę<br />
Utworzenie metody szablonowej<br />
Wydzielenie klasy<br />
Kiedy stosujemy<br />
W podklasach występują pola obiektu o podobnym znaczeniu i<br />
takim samym typie.<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 15 / 62
Opis<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie metody<br />
Wydzielenie metody z parametrem zapisywalnym<br />
Przemieszczenie pola w górę<br />
Utworzenie metody szablonowej<br />
Wydzielenie klasy<br />
Kiedy stosujemy<br />
W podklasach występują pola obiektu o podobnym znaczeniu i<br />
takim samym typie.<br />
Przykład<br />
class Osoba { }<br />
class Pracownik : Osoba {<br />
private string nazw;<br />
}<br />
class Student : Osoba {<br />
protected string Name;<br />
}<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 15 / 62
Opis procedury<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie metody<br />
Wydzielenie metody z parametrem zapisywalnym<br />
Przemieszczenie pola w górę<br />
Utworzenie metody szablonowej<br />
Wydzielenie klasy<br />
1 analiza wszystkich odwołań do pól (kandydatów do referencji);<br />
2 ustalenie wspólnej nazwy dla obydwu zmiennych i zmiana<br />
nazw;<br />
3 kompilacja i testy;<br />
4 utworzenie nowego pola w nadklasie (o widoczności w<br />
podklasach);<br />
5 usunięcie pól z podklas;<br />
6 kompilacja i testowanie;<br />
7 rozważenie samoenkapsulacji pola.<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 16 / 62
Opis<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie metody<br />
Wydzielenie metody z parametrem zapisywalnym<br />
Przemieszczenie pola w górę<br />
Utworzenie metody szablonowej<br />
Wydzielenie klasy<br />
Metoda szablonowa przydaje się w sytuacji, gdy mamy podobny<br />
(ale nie identyczny) kod w dwóch metodach.<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 17 / 62
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Przykład (był na poprzednim wykładzie)<br />
Wydzielenie metody<br />
Wydzielenie metody z parametrem zapisywalnym<br />
Przemieszczenie pola w górę<br />
Utworzenie metody szablonowej<br />
Wydzielenie klasy<br />
Wypożyczalnia filmów<br />
class Klient {<br />
public String zestawienie() { ... }<br />
public String zestawienieHTML() { ... }<br />
}<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 18 / 62
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Sposób postępowania<br />
Wydzielenie metody<br />
Wydzielenie metody z parametrem zapisywalnym<br />
Przemieszczenie pola w górę<br />
Utworzenie metody szablonowej<br />
Wydzielenie klasy<br />
Krok 1. – podzielenie metod na mniejsze tak, aby były identyczne<br />
lub różne<br />
Wydzielenie obliczania należności<br />
class Klient {<br />
float suma();<br />
public String zestawienie() { ... }<br />
public String zestawienieHTML() { ... }<br />
}<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 19 / 62
Krok 2<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie metody<br />
Wydzielenie metody z parametrem zapisywalnym<br />
Przemieszczenie pola w górę<br />
Utworzenie metody szablonowej<br />
Wydzielenie klasy<br />
Przemieszczenie metody w górę.<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 20 / 62
Krok 2<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie metody<br />
Wydzielenie metody z parametrem zapisywalnym<br />
Przemieszczenie pola w górę<br />
Utworzenie metody szablonowej<br />
Wydzielenie klasy<br />
Przemieszczenie metody w górę.<br />
W naszym przykładzie nie jest to potrzebne.<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 20 / 62
Krok 3<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie metody<br />
Wydzielenie metody z parametrem zapisywalnym<br />
Przemieszczenie pola w górę<br />
Utworzenie metody szablonowej<br />
Wydzielenie klasy<br />
Ujednolicenie sygnatur metod.<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 21 / 62
Krok 3<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie metody<br />
Wydzielenie metody z parametrem zapisywalnym<br />
Przemieszczenie pola w górę<br />
Utworzenie metody szablonowej<br />
Wydzielenie klasy<br />
Ujednolicenie sygnatur metod.<br />
Krok 4<br />
Kompilacja i testowanie<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 21 / 62
Krok 5: tworzenie metody szablonowej<br />
class Klient {<br />
String raport(void -> string : nagłowek,<br />
void -> string : zestawienie) {<br />
String wynik = "";<br />
wynik += nagłówek();<br />
wynik += zestawienie();<br />
wynik += this.podsumowanie();<br />
return wynik;<br />
}<br />
public String zestawienie() {<br />
return raport(nagłowekTekst, zestawienieTekst);<br />
}<br />
public String zestawienieHTML() {<br />
return raport(nagłowekHTML, zestawienieHTML);<br />
}<br />
}
Wzorzec strategia<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie metody<br />
Wydzielenie metody z parametrem zapisywalnym<br />
Przemieszczenie pola w górę<br />
Utworzenie metody szablonowej<br />
Wydzielenie klasy<br />
Klient<br />
+ zestawienie() : string<br />
+ zestawienieHTML() : string<br />
1 Zestawienie<br />
+ raport(Klient) : int<br />
+ nagłówek(Klient) : string<br />
+ stopka(Klient) : string<br />
+ treść(Klient) : string<br />
ZestawienieTekst<br />
+ nagłówek(Klient) : string<br />
+ stopka(Klient) : string<br />
+ treść(Klient) : string<br />
ZestawienieHTML<br />
+ nagłówek(Klient) : string<br />
+ stopka(Klient) : string<br />
+ treść(Klient) : string<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 23 / 62
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Jak używać takiej implementacji<br />
Wydzielenie metody<br />
Wydzielenie metody z parametrem zapisywalnym<br />
Przemieszczenie pola w górę<br />
Utworzenie metody szablonowej<br />
Wydzielenie klasy<br />
class Klient {<br />
public String zestawienie()<br />
{<br />
return new ZestawienieTekst().raport(this);<br />
}<br />
}<br />
public String zestawienieHTML()<br />
{<br />
return new ZestawienieHTML().raport(this);<br />
}<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 24 / 62
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Kiedy wydzielić klasę<br />
Wydzielenie metody<br />
Wydzielenie metody z parametrem zapisywalnym<br />
Przemieszczenie pola w górę<br />
Utworzenie metody szablonowej<br />
Wydzielenie klasy<br />
Z klasy wydzielamy odrębną klasę aby skrócić klasę podstawową.<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 25 / 62
Przykład<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie metody<br />
Wydzielenie metody z parametrem zapisywalnym<br />
Przemieszczenie pola w górę<br />
Utworzenie metody szablonowej<br />
Wydzielenie klasy<br />
class Klient<br />
{<br />
String adres;<br />
}<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 26 / 62
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Rozwój oprogramowania<br />
Wydzielenie metody<br />
Wydzielenie metody z parametrem zapisywalnym<br />
Przemieszczenie pola w górę<br />
Utworzenie metody szablonowej<br />
Wydzielenie klasy<br />
class Klient<br />
{<br />
String kraj;<br />
String ulica;<br />
String miejscowość;<br />
String poczta;<br />
String kod_poczt;<br />
}<br />
String adresTekst() {<br />
return kraj + ulica + miejscowość +<br />
poczta + kod_poczt;<br />
}<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 27 / 62
Wydzielenie klasy<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie metody<br />
Wydzielenie metody z parametrem zapisywalnym<br />
Przemieszczenie pola w górę<br />
Utworzenie metody szablonowej<br />
Wydzielenie klasy<br />
class Adres {<br />
public String toString() { ... }<br />
}<br />
class Klient {<br />
Adres adres;<br />
}<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 28 / 62
Plan wykładu<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie metody<br />
Zastąpienie zmiennej tymczasowej przez zapytanie<br />
Klasa dla grupy parametrów<br />
Przekazanie obiektu<br />
Zastąpienie metody obiektem<br />
Podział wyrażenia warunkowego<br />
1 Kiedy refaktoryzować<br />
2 Refaktoryzacja powielonego kodu<br />
Wydzielenie metody<br />
Wydzielenie metody z parametrem zapisywalnym<br />
Przemieszczenie pola w górę<br />
Utworzenie metody szablonowej<br />
Wydzielenie klasy<br />
3 Długa metoda<br />
Wydzielenie metody<br />
Zastąpienie zmiennej tymczasowej przez zapytanie<br />
Klasa dla grupy parametrów<br />
Przekazanie obiektu<br />
Zastąpienie metody obiektem<br />
Podział wyrażenia warunkowego<br />
4 Duża klasa<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 29 / 62
Długa metoda<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie metody<br />
Zastąpienie zmiennej tymczasowej przez zapytanie<br />
Klasa dla grupy parametrów<br />
Przekazanie obiektu<br />
Zastąpienie metody obiektem<br />
Podział wyrażenia warunkowego<br />
Dobra metoda to zazwyczaj krótka metoda.<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 30 / 62
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Jak i kiedy wydzielić metodę<br />
Wydzielenie metody<br />
Zastąpienie zmiennej tymczasowej przez zapytanie<br />
Klasa dla grupy parametrów<br />
Przekazanie obiektu<br />
Zastąpienie metody obiektem<br />
Podział wyrażenia warunkowego<br />
To już było ;-)<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 31 / 62
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Kiedy wykonujemy tę operację<br />
Wydzielenie metody<br />
Zastąpienie zmiennej tymczasowej przez zapytanie<br />
Klasa dla grupy parametrów<br />
Przekazanie obiektu<br />
Zastąpienie metody obiektem<br />
Podział wyrażenia warunkowego<br />
Operację wykonujemy dla lokalnych zmiennych tymczasowych, np.<br />
...<br />
// obliczanie<br />
tmp = wyrażenie<br />
wynik = ... tmp ...<br />
...<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 32 / 62
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Kiedy wykonujemy tę operację<br />
Wydzielenie metody<br />
Zastąpienie zmiennej tymczasowej przez zapytanie<br />
Klasa dla grupy parametrów<br />
Przekazanie obiektu<br />
Zastąpienie metody obiektem<br />
Podział wyrażenia warunkowego<br />
Operację wykonujemy dla lokalnych zmiennych tymczasowych, np.<br />
...<br />
// obliczanie<br />
tmp = wyrażenie<br />
wynik = ... tmp ...<br />
...<br />
int wynik_pośredni() { ... }<br />
...<br />
wynik = ... wynik_pośredni() ...<br />
...<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 32 / 62
Jak to zrobić<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie metody<br />
Zastąpienie zmiennej tymczasowej przez zapytanie<br />
Klasa dla grupy parametrów<br />
Przekazanie obiektu<br />
Zastąpienie metody obiektem<br />
Podział wyrażenia warunkowego<br />
Sprawdzenie, że jest tylko jedno przypisanie<br />
Np. zadeklarowanej zmiennej jako final i skompilowanie programu.<br />
wydzielenie obliczenia zmiennej jako odrębną metodę i<br />
skompilowanie;<br />
wstawienie wywołania nowej metody zamiast zmiennej<br />
tymczasowej.<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 33 / 62
Warianty metody<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie metody<br />
Zastąpienie zmiennej tymczasowej przez zapytanie<br />
Klasa dla grupy parametrów<br />
Przekazanie obiektu<br />
Zastąpienie metody obiektem<br />
Podział wyrażenia warunkowego<br />
Zmiennej przypisywana jest wartość więcej niż dwa razy. I nie jest<br />
to zmienna wykorzystywana w pętli.<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 34 / 62
Warianty metody<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie metody<br />
Zastąpienie zmiennej tymczasowej przez zapytanie<br />
Klasa dla grupy parametrów<br />
Przekazanie obiektu<br />
Zastąpienie metody obiektem<br />
Podział wyrażenia warunkowego<br />
Zmiennej przypisywana jest wartość więcej niż dwa razy. I nie jest<br />
to zmienna wykorzystywana w pętli.<br />
Obserwacja<br />
Jeśli zmiennej przypisywana jest wartość więcej niż dwa razy to<br />
pewnie jest użyta w dwóch rolach.<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 34 / 62
Warianty metody<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie metody<br />
Zastąpienie zmiennej tymczasowej przez zapytanie<br />
Klasa dla grupy parametrów<br />
Przekazanie obiektu<br />
Zastąpienie metody obiektem<br />
Podział wyrażenia warunkowego<br />
Zmiennej przypisywana jest wartość więcej niż dwa razy. I nie jest<br />
to zmienna wykorzystywana w pętli.<br />
Obserwacja<br />
Jeśli zmiennej przypisywana jest wartość więcej niż dwa razy to<br />
pewnie jest użyta w dwóch rolach.<br />
Przykład<br />
int podsuma;<br />
...<br />
podsuma = ...<br />
...<br />
podsuma = ...<br />
...<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 34 / 62
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Rozdzielenie zmiennej tymczasowej<br />
Wydzielenie metody<br />
Zastąpienie zmiennej tymczasowej przez zapytanie<br />
Klasa dla grupy parametrów<br />
Przekazanie obiektu<br />
Zastąpienie metody obiektem<br />
Podział wyrażenia warunkowego<br />
Przykład<br />
int podsuma1;<br />
int podsuma2<br />
...<br />
podsuma1 = ...<br />
...<br />
podsuma2 = ...<br />
...<br />
Sprawdzeniem może być zadeklarowanie zmiennej jako final.<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 35 / 62
Przykład<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie metody<br />
Zastąpienie zmiennej tymczasowej przez zapytanie<br />
Klasa dla grupy parametrów<br />
Przekazanie obiektu<br />
Zastąpienie metody obiektem<br />
Podział wyrażenia warunkowego<br />
String raport(<br />
DataSource źródło,<br />
Data od, Data do,<br />
String nagłówek, String stopka,<br />
bool numerowanie_stron, bool posumowanie,<br />
String porządkowanie, bool filtr)<br />
{<br />
...<br />
}<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 36 / 62
Rozwiązanie<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie metody<br />
Zastąpienie zmiennej tymczasowej przez zapytanie<br />
Klasa dla grupy parametrów<br />
Przekazanie obiektu<br />
Zastąpienie metody obiektem<br />
Podział wyrażenia warunkowego<br />
Utworzenie kilku klas<br />
class CzasZakres {<br />
Data od;<br />
Data do;<br />
}<br />
class CechyRaportu {<br />
String nagłówek;<br />
String stopka;<br />
bool numerowanie_stron;<br />
bool podsumowanie;<br />
}<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 37 / 62
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie metody<br />
Zastąpienie zmiennej tymczasowej przez zapytanie<br />
Klasa dla grupy parametrów<br />
Przekazanie obiektu<br />
Zastąpienie metody obiektem<br />
Podział wyrażenia warunkowego<br />
Utworzenie jednej klasy<br />
class ParametryRaportu<br />
{<br />
Data od;<br />
Data do;<br />
String nagłowek;<br />
String stopka;<br />
bool numerowanie_stron;<br />
bool podsumowanie;<br />
}<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 38 / 62
Zalety rozwiązania<br />
krótsza liczba parametrów;<br />
kontrola poprawności parametrów na poziomie klasy;
Zalety rozwiązania<br />
krótsza liczba parametrów;<br />
kontrola poprawności parametrów na poziomie klasy;<br />
przeniesienie do klasy pewnych operacji<br />
Kod z wnętrza raportu<br />
if (dana.data >= od and dana.data
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Obiekt jest parametrem metody<br />
Wydzielenie metody<br />
Zastąpienie zmiennej tymczasowej przez zapytanie<br />
Klasa dla grupy parametrów<br />
Przekazanie obiektu<br />
Zastąpienie metody obiektem<br />
Podział wyrażenia warunkowego<br />
Jest to w pewnym sensie metoda odwrotna do poprzedniej.<br />
Przykład<br />
public String raport(Finanse dane) { ... }<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 40 / 62
Komentarz<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie metody<br />
Zastąpienie zmiennej tymczasowej przez zapytanie<br />
Klasa dla grupy parametrów<br />
Przekazanie obiektu<br />
Zastąpienie metody obiektem<br />
Podział wyrażenia warunkowego<br />
tę faktoryzację można stosować również gdy przekazujemy<br />
tylko jeden argument;<br />
taka operacja uodparnia na zmiany, np. potrzebę nowego<br />
argumentu do wykonania metody.<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 41 / 62
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Zastosowanie refaktoryzacji<br />
Wydzielenie metody<br />
Zastąpienie zmiennej tymczasowej przez zapytanie<br />
Klasa dla grupy parametrów<br />
Przekazanie obiektu<br />
Zastąpienie metody obiektem<br />
Podział wyrażenia warunkowego<br />
mamy (zbyt) długą metodę;<br />
w metodzie jest mnóstwo zmiennych lokalnych, które<br />
występują w różnych miejscach w procedurze;<br />
podział metody na mniejsze jest kłopotliwe, bo: wymaga<br />
przekazywania mnóstwa parametrów do mniejszych metod; w<br />
wielu językach programowania przekazywanie argumentów jest<br />
przez wartość.<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 42 / 62
Przykład<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie metody<br />
Zastąpienie zmiennej tymczasowej przez zapytanie<br />
Klasa dla grupy parametrów<br />
Przekazanie obiektu<br />
Zastąpienie metody obiektem<br />
Podział wyrażenia warunkowego<br />
Metoda float sumowanie(), klasa Numeryka<br />
sumaCałkowita = 0.0;<br />
for(int i = 0; i < wiersze; i++)<br />
{<br />
podsuma = 0.0;<br />
for(int j = 0; j < kolumny; j++)<br />
{<br />
sumaCałkowita += M[i,j];<br />
podsuma += M[i,j];<br />
}<br />
wydruk(podsuma);<br />
}<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 43 / 62
float podsuma(Macierz M, wiersz, sumaCałkowita)<br />
{<br />
podsuma = 0.0;<br />
for(int j = 0; j < kolumny; j++)<br />
{<br />
sumaCałkowita += M[wiersz,j];<br />
podsuma += M[wiersz,j];<br />
}<br />
wydruk(podsuma);<br />
return sumaCałkowita;<br />
}<br />
...<br />
sumaCałkowita = 0.0;<br />
for(int i = 0; i < wiersze; i++)<br />
{<br />
sumaCałkowita = podsuma(M, i, sumaCałkowita)<br />
}
float podsuma(Macierz M, wiersz, sumaCałkowita)<br />
{<br />
podsuma = 0.0;<br />
for(int j = 0; j < kolumny; j++)<br />
{<br />
sumaCałkowita += M[wiersz,j];<br />
podsuma += M[wiersz,j];<br />
}<br />
wydruk(podsuma);<br />
return sumaCałkowita;<br />
}<br />
...<br />
sumaCałkowita = 0.0;<br />
for(int i = 0; i < wiersze; i++)<br />
{<br />
sumaCałkowita = podsuma(M, i, sumaCałkowita)<br />
}<br />
Co będzie, gdy musimy zwrócić więcej niż jeden parametr?
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Zastąpienie metody obiektem<br />
Wydzielenie metody<br />
Zastąpienie zmiennej tymczasowej przez zapytanie<br />
Klasa dla grupy parametrów<br />
Przekazanie obiektu<br />
Zastąpienie metody obiektem<br />
Podział wyrażenia warunkowego<br />
Procedura<br />
utworzenie klasy o nazwie takiej jak metoda;<br />
utworzenie w nowej klasie pola na obiekt z którego pochodzi<br />
metoda;<br />
utworzenie w nowej klasie pól odpowiadających zmiennym<br />
lokalnym ze starej metody;<br />
utworzenie w nowej klasie metody oblicz o kodzie takim<br />
samym jak stara metoda;<br />
zastąpienie ciała starej metody wywołaniem metody oblicz<br />
starej metody.<br />
Oczywiście w międzyczasie kompilujemy i testujemy.<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 45 / 62
class Sumowanie {<br />
Numeryka obiekt; Macierz M;<br />
float sumaCałkowita = 0; float podsuma = 0;<br />
int i;<br />
public Sumowanie(Numeryka obj, .... ) { M = obj.M }<br />
}<br />
private void podsuma() {<br />
this.podsuma = 0.0;<br />
for(int j = 0; j < kolumny; j++) {<br />
this.sumaCałkowita += M[i,j];<br />
this.podsuma += M[i,j];<br />
}<br />
obj.wydruk(this.podsuma);<br />
}<br />
public void oblicz() {<br />
this.sumaCałkowita = 0.0;<br />
for(int i = 0; i < wiersze; i++)<br />
this.podsuma()<br />
}
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Złe wyrażenie warunkowe: przykład<br />
Wydzielenie metody<br />
Zastąpienie zmiennej tymczasowej przez zapytanie<br />
Klasa dla grupy parametrów<br />
Przekazanie obiektu<br />
Zastąpienie metody obiektem<br />
Podział wyrażenia warunkowego<br />
if (DateTime.Now < DateTime("20-02-2011") and<br />
DateTime("02-10-2010") < DateTime.Now)<br />
conn = new Connection("..")<br />
conn.query("SELECT * FROM Tabela<br />
WHERE czas < ’20-02-2011’ AND ’02-10-2010’")<br />
else<br />
...<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 47 / 62
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Propozycja rozwiązania<br />
Wydzielenie metody<br />
Zastąpienie zmiennej tymczasowej przez zapytanie<br />
Klasa dla grupy parametrów<br />
Przekazanie obiektu<br />
Zastąpienie metody obiektem<br />
Podział wyrażenia warunkowego<br />
Wydzielenie wyrażenia w postaci metody<br />
bool semestrZimowy(int rok) { ... }<br />
Wydzielenie gałęzi if<br />
void ofertaZima(int rok) { ... }<br />
Zastąpienie wyrażenia metodą<br />
if semestrZimowy(2010)<br />
ofertaZima(2010);<br />
else<br />
ofertaLato(2010);<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 48 / 62
Plan wykładu<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie klasy<br />
Wydzielenie podklasy<br />
Powielenie widocznych danych<br />
1 Kiedy refaktoryzować<br />
2 Refaktoryzacja powielonego kodu<br />
Wydzielenie metody<br />
Wydzielenie metody z parametrem zapisywalnym<br />
Przemieszczenie pola w górę<br />
Utworzenie metody szablonowej<br />
Wydzielenie klasy<br />
3 Długa metoda<br />
Wydzielenie metody<br />
Zastąpienie zmiennej tymczasowej przez zapytanie<br />
Klasa dla grupy parametrów<br />
Przekazanie obiektu<br />
Zastąpienie metody obiektem<br />
Podział wyrażenia warunkowego<br />
4 Duża klasa<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 49 / 62
Wydzielenie klasy<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie klasy<br />
Wydzielenie podklasy<br />
Powielenie widocznych danych<br />
Już było przy okazji refakoryzacji powielonego kodu.<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 50 / 62
Kiedy stosujemy<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie klasy<br />
Wydzielenie podklasy<br />
Powielenie widocznych danych<br />
Stosujemy, gdy z pewnych metod korzystają tylko niektóre obiekty.<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 51 / 62
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Schemat postępowania<br />
Wydzielenie klasy<br />
Wydzielenie podklasy<br />
Powielenie widocznych danych<br />
dodanie nowej podklasy z identycznym konstruktorem;<br />
przeniesienie wybranych pól i metod do podklasy;<br />
zastąpienie wystąpień typu obiektu przez polimorfizm.<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 52 / 62
Zastosowanie<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie klasy<br />
Wydzielenie podklasy<br />
Powielenie widocznych danych<br />
Sytuacja, w której w jednej klasie jest zarówno logika biznesowa<br />
jak i obsługa interfejsu graficznego.<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 53 / 62
Podejście 1.<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie klasy<br />
Wydzielenie podklasy<br />
Powielenie widocznych danych<br />
Rozdzielenie kodu na dwie klasy<br />
Model<br />
Zawiera dane dziedzinowe oraz zawiera implementację logiki<br />
biznesowej.<br />
Klasa implementująca interfejs graficzny<br />
Implementacja obsługi przez GUI (np. edycja w AWT).<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 54 / 62
Podejście 1.<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie klasy<br />
Wydzielenie podklasy<br />
Powielenie widocznych danych<br />
Rozdzielenie kodu na dwie klasy<br />
Model<br />
Zawiera dane dziedzinowe oraz zawiera implementację logiki<br />
biznesowej.<br />
Klasa implementująca interfejs graficzny<br />
Implementacja obsługi przez GUI (np. edycja w AWT).<br />
Problem: rozdzielamy dane, które są w dwóch miejscach: w<br />
edytorze i w modelu. Trzeba je synchronizować.<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 54 / 62
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie klasy<br />
Wydzielenie podklasy<br />
Powielenie widocznych danych<br />
Krok pierwszy<br />
Wydzielenie klasy modelu<br />
Tworzymy odrębną klasę zawierającą dane i logikę biznesową.<br />
W starej klasie<br />
Tworzymy referencję do obiektu nowej klasy.<br />
Kompilacja i testowanie<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 55 / 62
Krok 2.<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie klasy<br />
Wydzielenie podklasy<br />
Powielenie widocznych danych<br />
Dodajemy do edytora metodę<br />
aktualizacja(Model m, Object dane) { ... }<br />
która zaktualizuje dane w modelu<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 56 / 62
Krok 3.<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie klasy<br />
Wydzielenie podklasy<br />
Powielenie widocznych danych<br />
Podłączenie aktualizacji do zdarzeń AWT.<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 57 / 62
Krok 4.<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Wydzielenie klasy<br />
Wydzielenie podklasy<br />
Powielenie widocznych danych<br />
Zamiana odwołań do danych lokalnych na odwołania do pól<br />
modelu.<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 58 / 62
Plan wykładu<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Zastąpienie parametrów przez metodę<br />
Przekazanie całego obiektu<br />
Utworzenie klasy dla grupy parametrów<br />
1 Kiedy refaktoryzować<br />
2 Refaktoryzacja powielonego kodu<br />
Wydzielenie metody<br />
Wydzielenie metody z parametrem zapisywalnym<br />
Przemieszczenie pola w górę<br />
Utworzenie metody szablonowej<br />
Wydzielenie klasy<br />
3 Długa metoda<br />
Wydzielenie metody<br />
Zastąpienie zmiennej tymczasowej przez zapytanie<br />
Klasa dla grupy parametrów<br />
Przekazanie obiektu<br />
Zastąpienie metody obiektem<br />
Podział wyrażenia warunkowego<br />
4 Duża klasa<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 59 / 62
Przykład<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Zastąpienie parametrów przez metodę<br />
Przekazanie całego obiektu<br />
Utworzenie klasy dla grupy parametrów<br />
void metoda(param1, param2) {<br />
zmienna = funkcja(param2);<br />
}<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 60 / 62
Przykład<br />
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Zastąpienie parametrów przez metodę<br />
Przekazanie całego obiektu<br />
Utworzenie klasy dla grupy parametrów<br />
void metoda(param1, param2) {<br />
zmienna = funkcja(param2);<br />
}<br />
funkcja() {<br />
p1 = pobierzParam2();<br />
return p1;<br />
}<br />
void metoda(param1) {<br />
zmienna = funkcja();<br />
}<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 60 / 62
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Przekazanie całego obiektu<br />
Zastąpienie parametrów przez metodę<br />
Przekazanie całego obiektu<br />
Utworzenie klasy dla grupy parametrów<br />
Już było ;-)<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 61 / 62
Kiedy refaktoryzować<br />
Refaktoryzacja powielonego kodu<br />
Długa metoda<br />
Duża klasa<br />
Długa lista parametrów<br />
Zastąpienie parametrów przez metodę<br />
Przekazanie całego obiektu<br />
Utworzenie klasy dla grupy parametrów<br />
Utworzenie klasy dla grupy parametrów<br />
Już było ;-)<br />
Marcin Młotkowski <strong>Programowanie</strong> <strong>zwinne</strong> 62 / 62