Professional Documents
Culture Documents
Refaktorisanje
Refaktorisanje
Sadraj
ta je refaktorisanje ?
Zato treba refaktorisati ?
Kada treba vriti refaktorisanje ?
Kako sprovesti refaktorisanje ?
Katalog refaktorisanja
Alati za refaktorisanje
April 2008.
ta je refaktorisanje ?
Proces promene softverskog sistema
Neke od definicija:
April 2008.
Motivacija
Stara inenjerska izreka: dok radi
ne diraj ga.
Postaje znatno tee ukoliko treba
sprovesti promene sistema
April 2008.
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
ukljueni su i ljudi
April 2008.
Motivacija
Neuredan kod i loe dizajniran sistem
oteavaju promene
Teko je pronai mesta koja je potrebno menjati
Teko je prepoznati ta treba menjati
April 2008.
Motivacija
Enkapsuliranje polja
Transformacije koje se sprovode
Kreiranje javnog get metoda koji vraa 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.
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.
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.
Sadraj
ta je refaktorisanje ?
Zato treba refaktorisati ?
Kada treba vriti refaktorisanje ?
Kako sprovesti refaktorisanje ?
Katalog refaktorisanja
Alati za refaktorisanje
April 2008.
10
April 2008.
11
April 2008.
12
Sadraj
ta je refaktorisanje ?
Zato treba refaktorisati ?
Kada treba vriti refaktorisanje ?
Kako sprovesti refaktorisanje ?
Katalog refaktorisanja
Alati za refaktorisanje
April 2008.
13
April 2008.
14
April 2008.
15
April 2008.
16
Sadraj
ta je refaktorisanje ?
Zato treba refaktorisati ?
Kada treba vriti refaktorisanje ?
Kako sprovesti refaktorisanje ?
Katalog refaktorisanja
Alati za refaktorisanje
April 2008.
17
April 2008.
18
Sprovodjenje refaktorisanja
Refaktorisanje menja program malim
koracima. Ako nainite greku, lako ete
je pronai
Rimat refaktorisanja: testiranje, male
izmene, testiranje, male izmene,
testiranje, male izmene. Ovaj ritam
omoguava brzo i sigurno refaktorisanje
April 2008.
19
ta treba refaktorisati ?
[Beck] Identifikovati bed smells
u kodu
konkretne strukture u kodu koje
dozivaju (ponekad zapomau),
pruajui mogunost za
refaktorisanje
April 2008.
20
ta treba refaktorisati ?
Ponovljeni kod
Izdvajanje metoda, Povlaenje metoda
navie, Pravljenje ablonskog metoda,
Zamena algoritma
Dugaak metod
Izdvajanje metoda, Zamena primitivnih
promenljivih upitom, Uvodjenje
parametarskog objekta, Ouvanje celovitosti
objekta
April 2008.
21
ta treba refaktorisati ?
Velika klasa
Izdvajanje klase, Izdvajanje potklase
Lenja klasa
Ruenje hijerarhije, Umetanje klasa
...
April 2008.
22
Sadraj
ta je refaktorisanje ?
Zato treba refaktorisati ?
Kada treba vriti refaktorisanje ?
Kako sprovesti refaktorisanje ?
Katalog refaktorisanja
Alati za refaktorisanje
April 2008.
23
Katalog refaktorisanja
Format navodjenja refaktorisanja[Fowler]
Ime refaktorisanja
Situacija u kojoj to refaktorisanje slui
Motivacija (zato treba obaviti refaktorisanje)
Mehanizam (kako se refaktorisanje sprovodi)
Primer
April 2008.
24
Izdvajanje metoda
Izdvajanje metoda (Extract
Method)
Postoji fragment koda koji se moe
grupisati
Pretvoriti taj deo u metod ije ime
objanjava namenu metoda (ne
kako metod radi!)
April 2008.
25
Izdvajanje metoda
void printOwing(double amount) {
printBanner();
//print details
System.out.println ("name:" + _name);
System.out.println ("amount" + amount);
}
April 2008.
26
April 2008.
27
28
April 2008.
29
April 2008.
30
April 2008.
31
Razdvajanje privremene
promenljive
Razdvajanje privremene promenljive
(Split Temporary Variable)
Postoji privremena promenljiva kojoj je
vrednost dodeljena vie puta, ali nije u
petlji niti se koristi za skupljanje
rezultata
Kreirati posebnu privremenu promenljivu
za svaku dodelu
April 2008.
32
April 2008.
33
April 2008.
34
class Order...
double price() {
double primaryBasePrice;
double secondaryBasePrice;
double tertiaryBasePrice;
// long computation;
...
}
April 2008.
35
Premetanje metoda
Premetanje metoda (Move
Method)
Metod koristi vie odlika neke klase
u kojoj nije definisan
Napraviti novi metod sa slinim
osnovnim delom u klasi koju
najvie koristi
April 2008.
36
April 2008.
37
Izdvajanje klase
Izdvajanje klase (Extract Class)
Imate klasu koja obavlja posao koji
bi trebalo da obavljaju dve klase
Napravite novu klasu i premestite
odgovarajua polja i metode iz
stare klase u novu
April 2008.
38
April 2008.
39
April 2008.
40
April 2008.
41
Sadraj
ta je refaktorisanje ?
Zato treba refaktorisati ?
Kada treba vriti refaktorisanje ?
Kako sprovesti refaktorisanje ?
Katalog refaktorisanja
Alati za refaktorisanje
April 2008.
42
Alati za refaktorisanje
Postoje za veinu popularnih OO programskih
jezika
Java
Xrefactory, RefactorIT, jFactor, IntelliJ IDEA, Eclipse
C++
CppRefactory, Xrefactory C#
C# Refactoring Tool, C# Refactory
Delphi
April 2008.
43
Alati za refaktorisanje
Postoje za veinu popularnih razvojnih
okruenja (IDE)
NetBeans (RefactorIT)
Eclipse (built-in)
Borland JBuilder (RefactorIT)
VisualStudio .NET (C# Refactory)
...
April 2008.
44
Alati za refaktorisanje
Eclipse
April 2008.
45
Alati za refaktorisanje
NetBeans
April 2008.
46
Alati za refaktorisanje
MS Visual 2005
April 2008.
47
Alati za refaktorisanje
Pouzdanost
Koliko su alati za refaktorisanje
zaista pouzdani ?
April 2008.
48
Alati za refaktorisanje
Pouzdanost
Istraivanja 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.
49
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
}
April 2008.
50