You are on page 1of 50

Refaktorisanje

Mentor: Dragan Boji


Autor:Milo Gligori
April 2008.

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

Ne dovodi do promene spoljnog ponaanja


koda
Poboljava unutranju strukturu

Neke od definicija:

[Fowler] Refaktorisanje je izmena interne


strukture softvera da bi bio laki za
razumevanje i jednostavniji za modifikovanje, a
bez vidljivih promena njegovog ponaanja.
[Beck] Promena sistema koja ne menja
ponaanje sistema ali poveava neke ne
funkcionalne kvalitete: jednostavnost,
fleksibilnost, jasnou ...

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

Kada je potrebno dodati nove odlike


sistemu a kod nije strukturiran kako bi
prihvatio nove promene
refaktorisati program kako bi se olakalo
dodavanje novih odlika
zatim dodati nove odlike

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

Zato vriti refaktorisanje ?


Popravlja dizajn softvera
Kratkoroni ciljevi kvare dizajn
Eliminisanje dupliranog koda

ini softver razumljivijim


Naknadna promena koda
Razumevanje nepoznatog koda

April 2008.

11

Zato vriti refaktorisanje ?


Pomae u nalaenju greaka
Razumevanje dovodi do pronalaenja
greaka

Omoguava bre pisanje koda


Dobra dizajn omoguava brz razvoj softvera
Vreme je posveeno novim
funkcionalnostima

Refaktorisanje nije svemogue!

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

Kada treba vriti refaktorisanje ?


Ne treba definisati termine
refaktorisanja
Prilikom dodavanja funkcionalnosti
U cilju razumevanja koda koji se
modifikuje
Promena dizajna za jednostavno
dodavanje funkcionalnosti

April 2008.

14

Kada treba vriti refaktorisanje ?


Tokom otklanjanja greaka
Kod postaje razumljiviji
Greka moe uputiti na potrebu za
refaktorisanjem

Tokom pregledanja koda


Dobijanje konkretnijih rezultata

April 2008.

15

Kada NE treba vriti


refaktorisanje ?
Kada je bolje poeti od poetka
Kod pun greaka

Kada istie rok


Dobici bi stigli po isteku roka

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

Kako zapoeti 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.

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

Dugaka lista parametara


Zamena parametra metodom, Uvodjenje
parametarskog objekta

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

Koristie se delovi gornjeg formata

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);
}

void printOwing(double amount) {


printBanner();
printDetails(amount);
}
void printDetails (double amount) {
System.out.println ("name:" + _name);
System.out.println ("amount" + amount);
}

April 2008.

26

Izdvajanje metoda (mehanizam)


Kreirati novi metod i izvriti imenovanje
u skladu sa akcijom koju metod sprovodi
Iskopirati izdvojeni kod iz izvornog
metoda u novokreirani metod
Potraiti u izvornom kodu reference na
promenljive koje su lokalne u izvornom
kodu. To su lokalne promenljive i
parametri

April 2008.

27

Izdvajanje metoda (mehanizam)


Ukoliko se neka privremena
promenljiva upotrebljava samo u
izdvojenom kodu. Ako je tako,
deklarisati je u odredinom kodu
Proveriti da li se u izdvojenom
kodu vri izmena lokalne
promeljive polaznog metoda
April 2008.

28

Izdvajanje metoda (mehanizam)


Lokalne promenljive proslediti
odredinom metodu u vidu parametara
koji se itaju iz izvornog koda
Zameniti izdvojeni kod u izvornom
metodu pozivom lokalnim promenljivim
Prevesti i testirati

April 2008.

29

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.

30

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.

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

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.

33

Zamena metoda objektom


metoda
Zamena metoda objektom metoda
(Replace Method With Method Object)
Uoava se dug metod koji koristi lokalne
promenljive tako da ne moete da
primenite Izdvajanje Metoda
Pretvorite metod u zaseban objekat tako
da sve lokalne promenljive postanu polja
tog objekta. Onda metod moete
razloiti na druge metode istog objekta

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

Zamena prostog podatka


objektom
Zamena prostog podatka objektom
(Replace Data Value with Object)
Imate stavku podatka kojoj su
potrebni dodatni podaci ili ponaanje
Pretvorite stavku podatka u objekat

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

Modelmaker Tool, Castalia

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

You might also like