SlideShare a Scribd company logo
1 of 50
April 2008. 1
RefaktorisanjeRefaktorisanje
Mentor: DMentor: Drragan Bojiagan Bojićć
Autor:Autor:Miloš GligorićMiloš Gligorić
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
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 ...
April 2008. 4
Motivacija
• Stara inženjerska izreka: “dok radi ne diraj
ga.”
• Postaje znatno teže ukoliko treba sprovesti
promene sistema
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
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
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
April 2008. 8
Motivacija –
Enkapsuliranje polja
// pre refaktorisanja
class A {
public int f;
void m(int i) {
f = i * f;
}
}
// nakon refaktorisanja
class 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;
}
}
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)
• ...
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
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
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!
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
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
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
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
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
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
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
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”
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
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
• ...
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
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
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!)
April 2008. 26
Izdvajanje metoda
void printOwing(double amount) {
printBanner();
//print details
System.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);
}
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
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
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
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
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;
else
return basePrice() * 0.98;
...
double basePrice() {
return _quantity * _itemPrice;
}
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
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);
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
April 2008. 35
class Order...
double price() {
double primaryBasePrice;
double secondaryBasePrice;
double tertiaryBasePrice;
// long computation;
...
}
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
April 2008. 37
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
April 2008. 39
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
April 2008. 41
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
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
• …
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)
• ...
April 2008. 45
Alati za refaktorisanje
Eclipse
April 2008. 46
Alati za refaktorisanje
NetBeans
April 2008. 47
Alati za refaktorisanje
MS Visual 2005
April 2008. 48
Alati za refaktorisanje
Pouzdanost
• Koliko su alati za refaktorisanje zaista
pouzdani ?
April 2008. 49
Alati za refaktorisanje
Pouzdanost
• 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
April 2008. 50
Bug u NetBeans-u
// pre refaktorisanja
class A {
int f;
void m() {
(new A().f) = 0;
}
}
// nakon refaktorisanja
class A {
private int f;
void m() {
(new A().f) = 0;
}
… getF …
… setF …
}

More Related Content

Viewers also liked

MOBA - A tool you need to fix your neighborhood
MOBA - A tool you need to fix your neighborhoodMOBA - A tool you need to fix your neighborhood
MOBA - A tool you need to fix your neighborhoodDejan Restak
 
Misljenje prezentacija
Misljenje prezentacijaMisljenje prezentacija
Misljenje prezentacijaA. D.
 
Teoría electromagnética 7ma edición
Teoría electromagnética   7ma edición Teoría electromagnética   7ma edición
Teoría electromagnética 7ma edición Osvaldo Silva Alvarado
 
Oracle 数据库一体机ODA X5-2 产品介绍.PDF
Oracle 数据库一体机ODA X5-2 产品介绍.PDFOracle 数据库一体机ODA X5-2 产品介绍.PDF
Oracle 数据库一体机ODA X5-2 产品介绍.PDFEthan M. Liu
 
Wordpress - Sistem za upravljanje sadržajem na webu
Wordpress - Sistem za upravljanje sadržajem na webuWordpress - Sistem za upravljanje sadržajem na webu
Wordpress - Sistem za upravljanje sadržajem na webuMilan Stošić
 
May The Nodejs Be With You
May The Nodejs Be With YouMay The Nodejs Be With You
May The Nodejs Be With YouDalibor Gogic
 
Javascript #4 - Startit Centar Indjija
Javascript #4 - Startit Centar IndjijaJavascript #4 - Startit Centar Indjija
Javascript #4 - Startit Centar IndjijaDušan Stanković
 
Javascript #3 - StartIt centar Indjija
Javascript #3 - StartIt centar IndjijaJavascript #3 - StartIt centar Indjija
Javascript #3 - StartIt centar IndjijaDušan Stanković
 
Javascript #2 - StartIt centar Indjija
Javascript #2 - StartIt centar IndjijaJavascript #2 - StartIt centar Indjija
Javascript #2 - StartIt centar IndjijaDušan Stanković
 
Responsive Web Design tehnike u WordPress-u
Responsive Web Design tehnike u WordPress-uResponsive Web Design tehnike u WordPress-u
Responsive Web Design tehnike u WordPress-uIgor Benić
 

Viewers also liked (14)

MOBA - A tool you need to fix your neighborhood
MOBA - A tool you need to fix your neighborhoodMOBA - A tool you need to fix your neighborhood
MOBA - A tool you need to fix your neighborhood
 
Misljenje prezentacija
Misljenje prezentacijaMisljenje prezentacija
Misljenje prezentacija
 
Guia#1 cristian infante
Guia#1 cristian infanteGuia#1 cristian infante
Guia#1 cristian infante
 
REWIND SESSION
REWIND SESSIONREWIND SESSION
REWIND SESSION
 
¿Què es un blog?
¿Què es un blog?¿Què es un blog?
¿Què es un blog?
 
Teoría electromagnética 7ma edición
Teoría electromagnética   7ma edición Teoría electromagnética   7ma edición
Teoría electromagnética 7ma edición
 
300PaperOG32784
300PaperOG32784300PaperOG32784
300PaperOG32784
 
Oracle 数据库一体机ODA X5-2 产品介绍.PDF
Oracle 数据库一体机ODA X5-2 产品介绍.PDFOracle 数据库一体机ODA X5-2 产品介绍.PDF
Oracle 数据库一体机ODA X5-2 产品介绍.PDF
 
Wordpress - Sistem za upravljanje sadržajem na webu
Wordpress - Sistem za upravljanje sadržajem na webuWordpress - Sistem za upravljanje sadržajem na webu
Wordpress - Sistem za upravljanje sadržajem na webu
 
May The Nodejs Be With You
May The Nodejs Be With YouMay The Nodejs Be With You
May The Nodejs Be With You
 
Javascript #4 - Startit Centar Indjija
Javascript #4 - Startit Centar IndjijaJavascript #4 - Startit Centar Indjija
Javascript #4 - Startit Centar Indjija
 
Javascript #3 - StartIt centar Indjija
Javascript #3 - StartIt centar IndjijaJavascript #3 - StartIt centar Indjija
Javascript #3 - StartIt centar Indjija
 
Javascript #2 - StartIt centar Indjija
Javascript #2 - StartIt centar IndjijaJavascript #2 - StartIt centar Indjija
Javascript #2 - StartIt centar Indjija
 
Responsive Web Design tehnike u WordPress-u
Responsive Web Design tehnike u WordPress-uResponsive Web Design tehnike u WordPress-u
Responsive Web Design tehnike u WordPress-u
 

Refaktorisanje

  • 1. April 2008. 1 RefaktorisanjeRefaktorisanje Mentor: DMentor: Drragan Bojiagan Bojićć Autor:Autor:Miloš GligorićMiloš Gligorić
  • 2. 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
  • 3. 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 ...
  • 4. April 2008. 4 Motivacija • Stara inženjerska izreka: “dok radi ne diraj ga.” • Postaje znatno teže ukoliko treba sprovesti promene sistema
  • 5. 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
  • 6. 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
  • 7. 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
  • 8. April 2008. 8 Motivacija – Enkapsuliranje polja // pre refaktorisanja class A { public int f; void m(int i) { f = i * f; } } // nakon refaktorisanja class 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; } }
  • 9. 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) • ...
  • 10. 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
  • 11. 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
  • 12. 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!
  • 13. 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
  • 14. 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
  • 15. 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
  • 16. 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
  • 17. 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
  • 18. 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
  • 19. 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
  • 20. 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”
  • 21. 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
  • 22. 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 • ...
  • 23. 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
  • 24. 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
  • 25. 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!)
  • 26. April 2008. 26 Izdvajanje metoda void printOwing(double amount) { printBanner(); //print details System.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); }
  • 27. 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
  • 28. 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
  • 29. 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
  • 30. 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
  • 31. 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; else return basePrice() * 0.98; ... double basePrice() { return _quantity * _itemPrice; }
  • 32. 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
  • 33. 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);
  • 34. 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
  • 35. April 2008. 35 class Order... double price() { double primaryBasePrice; double secondaryBasePrice; double tertiaryBasePrice; // long computation; ... }
  • 36. 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
  • 38. 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
  • 40. 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
  • 42. 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
  • 43. 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 • …
  • 44. 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) • ...
  • 45. April 2008. 45 Alati za refaktorisanje Eclipse
  • 46. April 2008. 46 Alati za refaktorisanje NetBeans
  • 47. April 2008. 47 Alati za refaktorisanje MS Visual 2005
  • 48. April 2008. 48 Alati za refaktorisanje Pouzdanost • Koliko su alati za refaktorisanje zaista pouzdani ?
  • 49. April 2008. 49 Alati za refaktorisanje Pouzdanost • 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
  • 50. April 2008. 50 Bug u NetBeans-u // pre refaktorisanja class A { int f; void m() { (new A().f) = 0; } } // nakon refaktorisanja class A { private int f; void m() { (new A().f) = 0; } … getF … … setF … }

Editor's Notes

  1. Ukoliko je teško prepoznati šta treba menjati onda postoji velika verovatnoća da programer napravi grešku
  2. Popravljanje dizajna softvera: Zbog postizanja kratkoročnih ciljeva kvari se dizajn koda Često kod sadrži duplikate. Cilj eliminisanj eponovljenog koda Čini softver razumljivijim: Neko će pokušati da pročita kod kroz nekoliko meseci Često se ne razmišlja o budućim izmenama softvera Prilikom razumevanja nepoznatog koda vršim namerna refaktorisanja (pranje prozora za dalje razumevanje)
  3. Pomaže u nalaženju grešaka: Možda zvuči suptorno od očekivanog Omogućava brže pisanje koda: U nepreglednom dizajnu vreme odlazi na ispravljanje grešaka ne na dodavanje funkcionalnosti Refaktorisanje sprečava raspadanje dizajna Previše loše napisan (isprojektovan) kod ne može biti popravljen upotrebom refaktorisanja.
  4. Refaktorisanje se ne sprovodi u unared definisanim vremenskim intervalima. Ono se obavlja stalno u kraćim naletima. Refaktorisanje se primenjuje jer postoji potreba da se u kodu učini nešto drugo Prilikom dodavanja funkcionalnosti: Kada je cilj da refaktorisanje pomogne u razumevanju koda U cilju promene dizajna
  5. Tokom otklanjanja grešaka: Moguće da kod nije dovoljno jasan da bi se uočila greška, stoga treba sprovesti refaktorisanje Tokom pregledanja koda: Refaktorisanje pomaže i da pregledanje da konkretnije rezultate. Pored predloga Postoji i nesto konkretno uradjeno
  6. Od koda se očekuje da uglavnom ispravno radi pre refaktorisanja
  7. Tokom refaktorisanja oslanjamo se na testove. Testove treba izvrsavati dovoljno cesto (nakon svakog sprovedenog koraka refaktorisanja) Vredi utrošiti vreme jer testovi daju samopouzdanje da se načine izmene programa
  8. Lenja klasa: ne izvršava dovoljno toga. Bila isplativa ali je pri refaktorisanju njena uloga smanjena.
  9. Kod je ostao neizmenjen. Problem moze nastati kada je u get I set metode ubacena dodatna logika koja u ovom slucaju nece biti izvrsena.