24.01.2014 Views

Programowanie zwinne

Programowanie zwinne

Programowanie zwinne

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<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!