50
April 2008. 1 Refaktorisanje Refaktorisanje Mentor: D Mentor: D r r agan Boji agan Boji ć ć Autor: Autor: Miloš Gligorić Miloš Gligorić

Refaktorisanje

Embed Size (px)

Citation preview

Page 1: Refaktorisanje

April 2008. 1

RefaktorisanjeRefaktorisanje

Mentor: DMentor: Drragan Bojiagan BojiććAutor:Autor:Miloš GligorićMiloš Gligorić

Page 2: Refaktorisanje

April 2008. 2

Sadržaj• Šta je refaktorisanje ?• Zašto treba refaktorisati ?• Kada treba vršiti refaktorisanje ?• Kako sprovesti refaktorisanje ?• Katalog refaktorisanja• Alati za refaktorisanje

Page 3: Refaktorisanje

April 2008. 3

Šta je refaktorisanje ?• Proces promene softverskog sistema

– Ne dovodi do promene spoljnog ponašanja koda– Poboljšava unutrašnju strukturu

• Neke od definicija:– [Fowler] Refaktorisanje je izmena interne strukture

softvera da bi bio lakši za razumevanje i jednostavniji za modifikovanje, a bez vidljivih promena njegovog ponašanja.

– [Beck] Promena sistema koja ne menja ponašanje sistema ali povećava neke ne funkcionalne kvalitete: jednostavnost, fleksibilnost, jasnoću ...

Page 4: Refaktorisanje

April 2008. 4

Motivacija• Stara inženjerska izreka: “dok radi ne diraj

ga.”• Postaje znatno teže ukoliko treba sprovesti

promene sistema

Page 5: Refaktorisanje

April 2008. 5

Motivacija• Estetsko pitanje nije jedini razlog

negodovanja neurednog koda• Kompajler ne mari da li je kod neuredan ili

ne• Kada je potrebno sprovesti promene

sistema u taj proces uključeni su i ljudi

Page 6: Refaktorisanje

April 2008. 6

Motivacija• Neuredan kod i loše dizajniran sistem otežavaju

promene– Teško je pronaći mesta koja je potrebno menjati– Teško je prepoznati šta treba menjati

• Kada je potrebno dodati nove odlike sistemu a kod nije strukturiran kako bi prihvatio nove promene– refaktorisati program kako bi se olakšalo dodavanje

novih odlika– zatim dodati nove odlike

Page 7: Refaktorisanje

April 2008. 7

Motivacija – Enkapsuliranje polja

• Transformacije koje se sprovode– Kreiranje javnog get metoda koji vraća vrednost polja– Kreiranje javnog set metoda koji postavlja vrednost

polja na vrednost prosledjenog parametra– Zamenjuje sva čitanja polja sa pozivom get metoda– Zamenjuje sve dodele vrednosti nekom polju sa set

metodom– Menja modifikator pristupa polju na private

Page 8: Refaktorisanje

April 2008. 8

Motivacija –Enkapsuliranje polja

// pre refaktorisanjaclass A {

public int f;void m(int i) { f = i * f;}

}

// nakon refaktorisanjaclass A {

private int f;void m(int i) { setF(i * getF());}

public int getF() { return this.f;}public void setF(int f) { this.f = f;}

}

Page 9: Refaktorisanje

April 2008. 9

Motivacija – katalog refaktorisanja

• Promena imena (Rename): promena imena metode, polja, klase

• Enkapsuliranje polja (Encapsulate Field): zamena svih referenci polja sa metodama za pristup

• Pomeranje polja na dole: pomeranje polja iz superklase u sve podklase

• Promena potpisa: promena potpisa metode promenom povratnog tipa, dodavanjem(Add Parameter) ili uklanjajem parametara(Remove Parameter)

• ...

Page 10: Refaktorisanje

April 2008. 10

Sadržaj• Šta je refaktorisanje ?• Zašto treba refaktorisati ?• Kada treba vršiti refaktorisanje ?• Kako sprovesti refaktorisanje ?• Katalog refaktorisanja• Alati za refaktorisanje

Page 11: Refaktorisanje

April 2008. 11

Zašto vršiti refaktorisanje ?• Popravlja dizajn softvera

– Kratkoročni ciljevi kvare dizajn– Eliminisanje dupliranog koda

• Čini softver razumljivijim– Naknadna promena koda– Razumevanje nepoznatog koda

Page 12: Refaktorisanje

April 2008. 12

Zašto vršiti refaktorisanje ?• Pomaže u nalaženju grešaka

– Razumevanje dovodi do pronalaženja grešaka• Omogućava brže pisanje koda

– Dobra dizajn omogućava brz razvoj softvera– Vreme je posvećeno novim funkcionalnostima

• Refaktorisanje nije svemoguće!

Page 13: Refaktorisanje

April 2008. 13

Sadržaj• Šta je refaktorisanje ?• Zašto treba refaktorisati ?• Kada treba vršiti refaktorisanje ?• Kako sprovesti refaktorisanje ?• Katalog refaktorisanja• Alati za refaktorisanje

Page 14: Refaktorisanje

April 2008. 14

Kada treba vršiti refaktorisanje ?• Ne treba definisati termine refaktorisanja• Prilikom dodavanja funkcionalnosti

– U cilju razumevanja koda koji se modifikuje– Promena dizajna za jednostavno dodavanje

funkcionalnosti

Page 15: Refaktorisanje

April 2008. 15

Kada treba vršiti refaktorisanje ?• Tokom otklanjanja grešaka

– Kod postaje razumljiviji– Greška može uputiti na potrebu za

refaktorisanjem• Tokom pregledanja koda

– Dobijanje konkretnijih rezultata

Page 16: Refaktorisanje

April 2008. 16

Kada NE treba vršiti refaktorisanje ?

• Kada je bolje početi od početka– Kod pun grešaka

• Kada ističe rok– Dobici bi stigli po isteku roka

Page 17: Refaktorisanje

April 2008. 17

Sadržaj• Šta je refaktorisanje ?• Zašto treba refaktorisati ?• Kada treba vršiti refaktorisanje ?• Kako sprovesti refaktorisanje ?• Katalog refaktorisanja• Alati za refaktorisanje

Page 18: Refaktorisanje

April 2008. 18

Kako započeti refaktorisanje ?• Kreiranje solidnog skupa testova za deo koda koji

se želi refaktorisati!• Kreiranje testova upotrebom xUnit alata

– Grupisanje testova– Regresivno testiranje– Automatska provera ishoda testiranja

• Pisanje testova je vredno truda– Daju samopouzdanju za sprovodjenje izmena

Page 19: Refaktorisanje

April 2008. 19

Sprovodjenje refaktorisanja• Refaktorisanje menja program malim koracima.

Ako načinite grešku, lako ćete je pronaći• Rimat refaktorisanja: testiranje, male izmene,

testiranje, male izmene, testiranje, male izmene. Ovaj ritam omogućava brzo i sigurno refaktorisanje

Page 20: Refaktorisanje

April 2008. 20

Šta treba refaktorisati ?• [Beck] Identifikovati “bed smells” u kodu• “konkretne strukture u kodu koje dozivaju

(ponekad zapomažu), pružajući mogućnost za refaktorisanje”

Page 21: Refaktorisanje

April 2008. 21

Šta treba refaktorisati ?• Ponovljeni kod

– Izdvajanje metoda, Povlačenje metoda naviše, Pravljenje šablonskog metoda, Zamena algoritma

• Dugačak metod– Izdvajanje metoda, Zamena primitivnih promenljivih

upitom, Uvodjenje parametarskog objekta, Očuvanje celovitosti objekta

Page 22: Refaktorisanje

April 2008. 22

Šta treba refaktorisati ?• Velika klasa

– Izdvajanje klase, Izdvajanje potklase• Dugačka lista parametara

– Zamena parametra metodom, Uvodjenje parametarskog objekta

• Lenja klasa– Rušenje hijerarhije, Umetanje klasa

• ...

Page 23: Refaktorisanje

April 2008. 23

Sadržaj• Šta je refaktorisanje ?• Zašto treba refaktorisati ?• Kada treba vršiti refaktorisanje ?• Kako sprovesti refaktorisanje ?• Katalog refaktorisanja• Alati za refaktorisanje

Page 24: Refaktorisanje

April 2008. 24

Katalog refaktorisanja• Format navodjenja refaktorisanja[Fowler]

– Ime refaktorisanja– Situacija u kojoj to refaktorisanje služi– Motivacija (zašto treba obaviti refaktorisanje)– Mehanizam (kako se refaktorisanje sprovodi)– Primer

• Koristiće se delovi gornjeg formata

Page 25: Refaktorisanje

April 2008. 25

Izdvajanje metoda• Izdvajanje metoda (Extract Method)• Postoji fragment koda koji se može

grupisati• Pretvoriti taj deo u metod čije ime

objašnjava namenu metoda (ne kako metod radi!)

Page 26: Refaktorisanje

April 2008. 26

Izdvajanje metodavoid printOwing(double amount) {

printBanner();//print detailsSystem.out.println ("name:" + _name);System.out.println ("amount" + amount);

}

void printOwing(double amount) {printBanner();printDetails(amount);

}void printDetails (double amount) {

System.out.println ("name:" + _name);System.out.println ("amount" + amount);

}

Page 27: Refaktorisanje

April 2008. 27

Izdvajanje metoda (mehanizam)• Kreirati novi metod i izvršiti imenovanje u skladu

sa akcijom koju metod sprovodi• Iskopirati izdvojeni kod iz izvornog metoda u

novokreirani metod• Potražiti u izvornom kodu reference na

promenljive koje su lokalne u izvornom kodu. To su lokalne promenljive i parametri

Page 28: Refaktorisanje

April 2008. 28

Izdvajanje metoda (mehanizam)• Ukoliko se neka privremena promenljiva

upotrebljava samo u izdvojenom kodu. Ako je tako, deklarisati je u odredišnom kodu

• Proveriti da li se u izdvojenom kodu vrši izmena lokalne promeljive polaznog metoda

Page 29: Refaktorisanje

April 2008. 29

Izdvajanje metoda (mehanizam)• Lokalne promenljive proslediti odredišnom

metodu u vidu parametara koji se čitaju iz izvornog koda

• Zameniti izdvojeni kod u izvornom metodu pozivom lokalnim promenljivim

• Prevesti i testirati

Page 30: Refaktorisanje

April 2008. 30

Zamena privremene promenljive upitom

• Zamena privremene promenljive upitom (Replace Temp With Query)

• Privremena promenljiva se koristi za čuvanje rezultata nekog izraza

• Izdvojiti izraz u metodu. Zameniti izrazom sve refenece na tu privremenu promenljivu

Page 31: Refaktorisanje

April 2008. 31

double basePrice = _quantity * _itemPrice;if (basePrice > 1000)

return basePrice * 0.95;else

return basePrice * 0.98;

if (basePrice() > 1000)return basePrice() * 0.95;

elsereturn basePrice() * 0.98;

...double basePrice() {

return _quantity * _itemPrice;}

Page 32: Refaktorisanje

April 2008. 32

Razdvajanje privremene promenljive

• Razdvajanje privremene promenljive (Split Temporary Variable)

• Postoji privremena promenljiva kojoj je vrednost dodeljena više puta, ali nije u petlji niti se koristi za skupljanje rezultata

• Kreirati posebnu privremenu promenljivu za svaku dodelu

Page 33: Refaktorisanje

April 2008. 33

double temp = 2 * (_height + _width);System.out.println (temp);temp = _height * _width;System.out.println (temp);

final double perimeter = 2 * (_height + _width);System.out.println (perimeter);final double area = _height * _width;System.out.println (area);

Page 34: Refaktorisanje

April 2008. 34

Zamena metoda objektom metoda

• Zamena metoda objektom metoda (Replace Method With Method Object)

• Uočava se dug metod koji koristi lokalne promenljive tako da ne možete da primenite Izdvajanje Metoda

• Pretvorite metod u zaseban objekat tako da sve lokalne promenljive postanu polja tog objekta. Onda metod možete razložiti na druge metode istog objekta

Page 35: Refaktorisanje

April 2008. 35

class Order...double price() {

double primaryBasePrice;double secondaryBasePrice;double tertiaryBasePrice;// long computation;...

}

Page 36: Refaktorisanje

April 2008. 36

Premeštanje metoda• Premeštanje metoda (Move Method)• Metod koristi više odlika neke klase u kojoj

nije definisan• Napraviti novi metod sa sličnim osnovnim

delom u klasi koju najviše koristi

Page 37: Refaktorisanje

April 2008. 37

Page 38: Refaktorisanje

April 2008. 38

Izdvajanje klase• Izdvajanje klase (Extract Class)• Imate klasu koja obavlja posao koji bi

trebalo da obavljaju dve klase• Napravite novu klasu i premestite

odgovarajuća polja i metode iz stare klase u novu

Page 39: Refaktorisanje

April 2008. 39

Page 40: Refaktorisanje

April 2008. 40

Zamena prostog podatka objektom

• Zamena prostog podatka objektom (Replace Data Value with Object)

• Imate stavku podatka kojoj su potrebni dodatni podaci ili ponašanje

• Pretvorite stavku podatka u objekat

Page 41: Refaktorisanje

April 2008. 41

Page 42: Refaktorisanje

April 2008. 42

Sadržaj• Šta je refaktorisanje ?• Zašto treba refaktorisati ?• Kada treba vršiti refaktorisanje ?• Kako sprovesti refaktorisanje ?• Katalog refaktorisanja• Alati za refaktorisanje

Page 43: Refaktorisanje

April 2008. 43

Alati za refaktorisanje• Postoje za većinu popularnih OO programskih jezika• Java

– Xrefactory, RefactorIT, jFactor, IntelliJ IDEA, Eclipse• C++

– CppRefactory, Xrefactory – C#– C# Refactoring Tool, C# Refactory

• Delphi – Modelmaker Tool, Castalia

• …

Page 44: Refaktorisanje

April 2008. 44

Alati za refaktorisanje• Postoje za većinu popularnih razvojnih okruženja

(IDE)• NetBeans (RefactorIT)• Eclipse (built-in)• Borland JBuilder (RefactorIT)• VisualStudio .NET (C# Refactory)• ...

Page 45: Refaktorisanje

April 2008. 45

Alati za refaktorisanjeEclipse

Page 46: Refaktorisanje

April 2008. 46

Alati za refaktorisanjeNetBeans

Page 47: Refaktorisanje

April 2008. 47

Alati za refaktorisanjeMS Visual 2005

Page 48: Refaktorisanje

April 2008. 48

Alati za refaktorisanjePouzdanost

• Koliko su alati za refaktorisanje zaista pouzdani ?

Page 49: Refaktorisanje

April 2008. 49

Alati za refaktorisanjePouzdanost

• Istraživanja na University of Illinois at Urbana-Champaign

• Tokom 2007 identifikovano 45 bagova• 21 bug-a u Eclipse-u• 24 bug-a u NetBeans-u

Page 50: Refaktorisanje

April 2008. 50

Bug u NetBeans-u// pre refaktorisanjaclass A {

int f;void m() { (new A().f) = 0;}

}

// nakon refaktorisanjaclass A {

private int f;void m() { (new A().f) = 0;}

… getF …… setF …

}