24.01.2014 Views

Programowanie zwinne

Programowanie zwinne

Programowanie zwinne

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!