You are on page 1of 31

Bi tp ln Nhp mn Cng ngh Phn mm

ti: Refactoring

Sinh vin : L Ngc Minh


Lp

: Khoa hc my tnh

Kho

: 52

SHSV

: 20071946

Gio vin : L c Trung

H Ni, thng 03/2011

Mc lc
Chng 1. Gii thiu..........................................................................................................4
Chng 2. Cc nguyn l v refactoring............................................................................5
2.1. nh ngha refactoring............................................................................................5
2.2. Hai chic m............................................................................................................5
2.3. Ti sao cn refactor?...............................................................................................6
2.3.1. Refactoring gip ci thin thit k...................................................................6
2.3.2. Refactoring gip phn mm d hiu hn.........................................................6
2.3.3. Refactoring gip bn lp trnh nhanh hn........................................................6
2.4. Khi no nn refactor?..............................................................................................7
2.4.1. Nguyn tc 3 ln...............................................................................................7
2.4.2. Refactor khi thm chc nng...........................................................................7
2.4.3. Refactor khi sa li..........................................................................................7
2.4.4. Refactor khi xem li m ngun (code review).................................................7
2.5. Cc vn khi refactor............................................................................................7
2.5.1. C s d liu....................................................................................................7
2.5.2. Thay i giao din............................................................................................8
2.6. Refactoring vi thit k...........................................................................................8
2.7. Refactoring vi hiu nng.......................................................................................9
Chng 3. Nhn bit m ngun cn refactor...................................................................10
3.1. Trng lp m.........................................................................................................10
3.2. Phng thc di....................................................................................................10
3.3. Lp ln..................................................................................................................11
Chng 4. Xy dng b kim th....................................................................................12
4.1. Gi tr ca m kim th.........................................................................................12
Chng 5. Cc phng php refactor..............................................................................13
5.1. nh dng ca cc phng php refactor..............................................................13
5.2. Trch phng thc.................................................................................................13
5.2.1. Tm tt...........................................................................................................13
5.2.2. ng c..........................................................................................................14
5.2.3. V d: Khng c bin ni b..........................................................................14
5.2.4. V d: C s dng bin ni b.......................................................................15
5.2.5. V d: Gn li mt bin ni b.......................................................................16
5.3. Nhp phng thc (Inline method).......................................................................17
5.3.1. Tm tt...........................................................................................................17
5.3.2. ng c..........................................................................................................18
5.4. Nhp bin tm.......................................................................................................18
5.4.1. Tm tt...........................................................................................................18
5.4.2. ng c..........................................................................................................19
5.5. Di chuyn phng thc.........................................................................................19
5.5.1. Tm tt...........................................................................................................19
5.5.2. ng c..........................................................................................................19

5.5.3. V d...............................................................................................................19
Chng 6. Cc cng c refactor.......................................................................................21
6.1. Refactor bng cng c...........................................................................................21
6.2. Refactor m ngun Java bng Eclipse...................................................................21
6.2.1. Thc n refactor...........................................................................................21
6.2.2. i tn............................................................................................................22
6.2.3. Trch phng thc..........................................................................................23
6.2.4. Nhp phng thc..........................................................................................23
6.2.5. Nhp bin tm................................................................................................24
6.2.6. Di chuyn phng thc..................................................................................24
Ph lc A. Ti liu tham kho..........................................................................................26
Ph lc B. Danh sch bad smells in code.....................................................................27
Ph lc C. Danh sch cc phng php refactor..............................................................28
Ph lc D. Cc cng c refactor m ngun Java trong Eclipse Helios............................31

Chng 1. Gii thiu


Refactoring l qu trnh thay i mt h thng phn mm nhm ci tin cu trc bn
trong nhng khng lm bin i hnh vi bn ngoi ca n. Refactoring l vic dn dp
m ngun mt cch c t chc sao cho ti thiu ho kh nng gy ra li. V bn cht
refactoring l nng cp thit k ca m ngun sau khi n c vit ra.
Trong nhng hiu bit thng thng v cng ngh phn mm, chng ta thit k trc
sau mi ci t. Cn c thit k tt trc sau mi c ci t tt. Qua thi gian, m
ngun b sa i v s nht qun ca h thng, cu trc ca n theo thit k, dn dn m
nht. Qu trnh ci t chuyn dn t ch to sang chp v.
Refactoring l cch lm ngc li. Khi refactor bn c th ly mt thit k ti, thm ch
l hn lon, v lm li n tr thnh mt m ngun c thit k tt. Mi bc u
n gin, thm ch rt n gin. Bn ch chuyn mt trng t lp ny sang lp khc,
ly vi on m ra khi phng thc to ra phng thc ring v y vi on m ln
hay xung cy tha k. Tuy nhin tc ng tch lu ca nhng thay i nh c th ci
thin ng k thit k. l s o ngc ca khi nim software decay.
Khi refactor bn s nhn thy s phn phi cng vic thay i. Thit k thay v din ra
u tin, li din ra lin tc trong sut qu trnh pht trin. Bn hc c cch ci tin
thit k t vic xy dng h thng. Kt qu ca s tng tc ny dn n mt chng
trnh vi thit k lun tt khi qu trnh pht trin tip din.
Qua qu trnh pht trin ca cng
ngh phn mm, cng vi s pht
trin mnh m ca phn cng th yu
cu v hiu sut x l ngy cng t
quan trng thay vo , tnh d hiu
c cao. Do cc k thut
refactoring cng ngy cng c ch
nhm nng cao cht lng phn
mm.
Thc t hc tp ca sinh vin Vit
Nam cho thy cc phn mm c
vit trn gh nh trng thng khng
c c thit k tt ngay t ban u. Dn n tnh trng ny c rt nhiu nguyn nhn
ch quan ln khch quan nh thiu kinh nghim, thiu thi gian, cha ch trng n quy
trnh pht trin phn mm v.v... nhng phn mm ny vt ra khi phm vi ca
nhng bi tp ln, n mn hc, n tt nghip... tip tc pht trin thnh sn phm
thc t v thnh cng trong cuc sng th k nng refactoring l rt cn thit.

Chng 2. Cc nguyn l v refactoring


2.1.

nh ngha refactoring

Thut ng refactoring c pht minh bi Ward Cunningham v Kent Beck vo khong


nhng nm 1980 khi lm vic vi ngn ng Smalltalk. Trong cun sch Refactoring:
Improving the Design of Existing Code cung cp hai nh ngha nh sau:
Refactoring (danh t): mt s thay i cu trc bn trong ca phn mm gip n d
hiu v d sa i hn m khng lm thay i hnh vi bn ngoi.
Refactor (ng t): ti cu trc phn mm bng cch p dng mt lot thao tc
refactoring m khng lm thay i hnh vi bn ngoi.
Trong mt s ti liu ting Vit, refactoring c chuyn ng thnh ci tin m ngun
tuy nhin cch ni ny kh di dng v cng khng din t c ht ngha ca thut
ng. Ti liu ny s nguyn thut ng ting Anh vi hai dng nh trn, ngoi ra
refactoring cng c hiu l tng hp cc phng php v cng c tin hnh
refactor phn mm ni chung.
Nh vy, hiu theo ngha no refactor ch n gin l dn dp m ngun. Tuy nhin
bng cch p dng nhng phng php, cng c ca refactoring, vic dn dp m ngun
s hiu qu hn ng k.
Cn phn bit refactoring v ti u ho hiu nng (performance optimization). Mc ch
ca refactoring l lm cho phn mm d hiu v d sa cha hn. Ti u ho hiu nng
cng khng lm thay i hnh vi bn ngoi ca phn mm (tr tc ) m ch thay i
cu trc bn trong tuy nhin vic ti u ho thng dn n nhng on m ngun kh
hiu v kh sa cha.
Mt c tnh quan trng na ca refactoring l khng thay i hnh vi bn ngoi ca
phn mm. Phn mm vn phi thc hin nhng chc nng ging ht nhng g n lm
trc . Ngi dng, k c end user v lp trnh vin, khng th nhn ra rng c g
va thay i.
2.2.

Hai chic m

Kent Beck s dng hnh nh hai chic m ch qu trnh pht trin phn mm c
refactor. Bn chia thi gian ra thnh hai hot ng tch bit: thm chc nng v refactor.
Khi thm chc nng, bn khng nn thay i nhng on m c, bn ch thm vo
nhng kh nng mi. Bn c th o tin bng cch to ra cc b test v m bo n
chy. Khi refactor, bn khng thm chc nng no m ch ti cu trc m ngun. Bn
cng khng thm b test no (tr khi pht hin ra mt b test bn b l trc ) v
ch thay i mt b test khi thc s cn thit ph hp vi s thay i ca giao din.

2.3.
2.3.1.

Ti sao cn refactor?
Refactoring gip ci thin thit k

Khng c refactoring, thit k ca phn mm s phn r (software decay). Khi m


ngun c thay i hin thc ho nhng mc tiu ngn hn hoc thay i m khng
hiu y thit k, m ngun mt dn cu trc. Ngy cng kh nhn ra thit k bng
cch c m ngun. Refactoring ging nh sp xp li m ngun. Bn xp li nhng g
khng ng ch ca n. S mt cu trc ca m ngun c hiu ng tch lu. Cng kh
nhn ra thit k t m ngun th cng kh duy tr thit k . Refactoring thng xuyn
c th gip m ngun gi c hnh dng.
M ngun c thit k khng tt thng cha nhiu on m lm cng mt vic, thng
thng l do m ngun hay lm cng mt vic nhng ch khc nhau. V th mt kha
cnh quan trng ca ci tin thit k l xo b nhng on m trng lp. Tm quan trng
ca vic ny nm nhng thay i m ngun trong tng lai. Gim lng m khng
gip h thng chy nhanh hn cht no nhng li khin vic sa i d dng hn rt
nhiu. C t m cn phi hiu hn v ch cn sa mt ni s thay i s c p dng
trn ton b h thng.
2.3.2.

Refactoring gip phn mm d hiu hn

Lp trnh ging nh cuc tr chuyn vi my tnh. Bn vit m bo my tnh cn phi


lm g v n s tr li bng cch lm chnh xc iu bn bo. Bn cn xo b khong
cch gia iu bn mun my tnh lm vi iu bn ni vi n. Lp trnh theo cch hiu
ny ch n gin l ni chnh xc iu bn mun. Tuy nhin cn c nhng ngi khc
cn s dng m ngun ca bn. Ai s th c m ngun ca bn trong thi gian vi
thng c th sa i vi ch. Chng ta d qun mt ngi s dng b sung , trong
khi h thc ra li l nhng ngi quan trng nht. Ai bn tm nu my tnh mt thm vi
xung nhp dch? Nhng s khc bit s rt ln nu mt lp trnh vin mt mt tun
thc hin mt s sa i trong khi ng l mt vi gi nu anh ta hiu m ngun ca
bn.
Bn cng c th s dng refactoring nh mt cch hiu nhng on m ca ngi
khc. c mt vi dng m v c gng thay i n phn nh ng hn cch hiu ca
bn sau th chy li xem n cn lm vic hay khng. Vi cch lm ny dn dn bn
s c hiu bit chc chn v h thng v vic tr li nhng on m c refactoring
s d dng hn nhiu.
2.3.3.

Refactoring gip bn lp trnh nhanh hn

iu ny nghe nh mt nghch l. nng cao cht lng m ngun, chng ta cn u


t thi gian vo vic refactoring, chng phi vic s lm gim nng sut?
Thc t chng minh rng thit k tt l rt quan trng i vi tc pht trin phn
mm. Khng c mt thit k tt, bn c th tin nhanh mt lc nhng sau s sm

chm li. Bn phi dnh thi gian tm v sa li thay v thm chc nng mi. Vic sa
i lu hn v bn phi c hiu h thng v tm nhng on m trng lp.
Thit k tt l iu kin cn duy tr tc pht trin phn mm v refactoring gip
bn chng li s phn r (decay) ca thit k, thm ch cn ci thin thit k na.
2.4.
2.4.1.

Khi no nn refactor?
Nguyn tc 3 ln

Ln u tin bn lm g , hy lm. Ln th hai bn lm iu tng t, bn nhn ra s


lp li nhng vn lm. Ln th ba bn lm iu tng t, hy refactor.
2.4.2.

Refactor khi thm chc nng

Hoc mt phn on m cn vit c vit u hoc bn nhn thy vic thay i


cht t thit k c th gip ci t chc nng nhanh chng hn, hy refactor. ng ch
b qua nhng sai st trong thit k, hy refactor n cng vic tip theo c thun li
hn.
2.4.3.

Refactor khi sa li

Li c bo co l du hiu cho thy cn refactor. Refactoring gip bn hiu r m


ngun hn v tm v loi b li d dng hn.
2.4.4.

Refactor khi xem li m ngun (code review)

Xem li m ngun gip lan truyn kin thc trong nhm pht trin, to c hi cho cc
lp trnh vin c truyn kinh nghim cho nhng lp trnh vin mi hn. Refactor khin
ngi review khng ch tng tng ra m ngun trng ra sao vi nhng ngh ca
mnh m thc s nhn thy n. Qu trnh xem li c kt qu r rng hn, khng ch l
mt vi ngh m l nhng ngh c thc hin.
2.5.
2.5.1.

Cc vn khi refactor
C s d liu

Nhiu ng dng gn cht vi lc d liu h tr n, y l mt l do khin c s d


liu kh thay i. Mt l do khc l vic chuyn i d liu c th rt lu v nguy him.
Vi cc c s d liu phi i tng mt cch gii quyt l t mt tng phn mm gia
m hnh i tng v m hnh c s d liu. Bng cch bn c th tch ri cc thay
i gia hai m hnh. Bn cng khng cn thit phi to mt lp ring bit t u. Bn
c th xy dng lp ny khi nhn ra m hnh i tng khng cn n nh.
C s d liu hng i tng va h tr va cn tr. Mt vi c s d liu hng i
tng c kh nng chuyn i t ng t phin bn ny sang phin bn khc ca i

tng. Nu khng, bn phi rt cn thn khi chuyn i d liu bng tay. Bn c th


thoi mi di chuyn cc hnh vi nhng vi cc trng th phi cn thn. C th s dng
hm truy cp to ra cm gic l d liu c chuyn v khi chc chn v s thay
i bn c th thc s di chuyn trng.
2.5.2.

Thay i giao din

Khi lm vic vi i tng bn c th tu thay i ni dung bn trong min l giao


din vn gi nguyn. Nu cn thay i giao din v bn c th thay i tt c nhng ni
s dng n, bn ch vic sa tt c ng thi. Tuy nhin nu bn c mt giao din
c cng b, mi vic tr nn phc tp hn nhiu. Bn khng th sa nhng on m
do ngi khc vit s dng giao din ca bn. Bn cn mt quy trnh phc tp hn
nhiu.
Khi refactor mt giao din c cng b, bn cn gi li ton b giao din c, t nht
cho n khi ngi s dng c th phn ng vi s thay i. Nu bn i tn mt hm,
hy gi li hm c v cho n gi n hm mi. ng sao chp thn hm v bn s li
mt thi gian x l s trng lp m ngun. Bn cng nn s dng cng c deprecate ca
Java thng bo nhng ch b phn i.
Cng b giao din c ch li ca n nhng cng gy nhiu kh khn v vy nu c th,
ng cng b giao din. Tt nhin nu bn thit k th vin lp trnh, iu l khng
trnh khi. Nhng nu bn lm mt phn mm vi nhm lm vic gm ba ngi, ng
cng b giao din t ngi ny n ngi kia. n gin l hy m m ngun ra v sa
i.
2.6.

Refactoring vi thit k

Mt s ngi v thit k vi bn v ca k s v lp trnh vi cng vic ca th xy. Tuy


nhin phn mm khc vi nh ca ng x. Alistair Cockburn ni, Khi thit k ti c
th ngh rt nhanh nhng suy ngh ca ti y nhng l hng nh.
Mt s khc tranh lun rng refactoring l s thay th cho thit k. Trong cch tip cn
ny bn hon ton khng thit k cht no. Bn ch lp trnh theo cch u tin ngh ra,
lm cho n chy ng v sau refactor. Thc t cch lm ny c th thc hin c
nhng khng phi cch hiu qu nht.
Khi p dng refactoring, bn khng t p lc ln thit k ban u. Bn khng tm kim
gii php tt nht m chp nhn mt gii php hp l. Cng vi qu trnh pht trin v
hiu r hn bi ton bn pht hin ra nhng gii php hp l hn m a n vo h
thng.
Mt kt qu quan trng ca refactoring l s n gin trong thit k. Vi cch thit k
hon chnh t u, bn cn tm ra gii php tht mm do p ng s thay i ca
yu cu. Vn l thit k mm do th phc tp v tn km hn thit k n gin. Khi
tip cn vn vi refactoring, bn s t hi refactor thit k n gin ny thnh
thit k mm do c kh khng? Nu cu tr li l kh d, bn ch vic ci t gii

php n gin.
Nh vy refactoring dn n nhng thit k n gin hn m khng phi hy sinh s
mm do. Khi bn c mt nhn thc nht nh v nhng g c th refactor d dng,
bn thm ch khng ngh n thit k mm do na. Ch vic xy dng nhng g n
gin nht lm vic c. Hu ht thi gian bn s khng cn dng n nhng thit k
mm do v phc tp na.
2.7.

Refactoring vi hiu nng

Mi quan ngi ph bin vi refactoring l lm gim hiu nng ca chng trnh. Trong
hu ht trng hp refactoring thc s lm chng trnh chm i. Tuy nhin b mt ca
nhng chng trnh chy nhanh, tr nhng trng hp cc k nghim ngt, l trc tin
n c lm d dng tinh chnh, sau mi c tinh chnh t tc mong
mun.
Mt iu th v v hiu nng l cc chng trnh thng tn nhiu thi gian nht vo
mt phn nh ca m ngun. Do vy nu bn ti u ho ton b m ngun nh nhau th
bn s lng ph 90% cng sc vo vic ti u ho nhng on m khng c chy
nhiu.
p dng nhn xt ny bn s vit nhng chng trnh tt m khng nhiu n hiu
nng. n khi bt u bc ti u ho, thng kh mun trong qu trnh pht trin, bn
bt u s dng chng trnh profiler phn tch nhng on m tn thi gian v b
nh nhiu nht. Tp trung vo nhng im nng ny, bn sa i m ngun v kim tra
s tin b v hiu nng cho n khi t c mc tiu.
Refactoring gip s ti u ho d dng hn theo hai cch. Th nht, v ci t nhanh
hn, bn c nhiu thi gian hn ti u ho. Th hai, m ngun c chia nh hn
d dng pht hin nhng im nng v d hiu hn bn ti u ho d dng.

Chng 3. Nhn bit m ngun cn refactor


Hiu th no l refactoring khng c ngha l bn bit nn refactor lc no v u.
Mc ch ca chng ny l a ra nhng ch dn bn nhn bit nhng vn trong
m ngun v bit cch khc phc. Cc tc gi Martin Fowler v Kent Beck gi chng l
bad smells in code (tm dch: mi hi trong m ngun).
y khng phi l nhng thc o chun ni r on m no c vn v on m
no khng, nhng thc o nh th thm ch c th khng tn ti. Tuy nhin bn s xy
dng c cho mnh nhng cm nhn ring rng bao nhiu bin l qu nhiu, phng
thc bao nhiu dng l qu di...
Danh sch cc bad smells c xut bi Martin Fowler v Kent Beck tng i
di, y xin gii thiu mt s vn thng gp. Hy tham kho Ph lc B xem
danh sch y .
3.1.

Trng lp m

ng u trong nhng mi hi l m ngun trng lp. Nu bn thy cng mt cu


trc xut hin nhiu ni, bn c th chc chn rng s tt hn nu bn hp nht chng
li.
n gin nht l trng hp cng mt biu thc xut hin trong hai phng thc ca
cng mt lp. Khi bn ch vic Trch phng thc v gi n t c hai ni.
Mt vn thng gp khc l khi cng mt biu thc c s dng hai lp ch em.
Bn c th xo b s trng lp ny bng cch Trch phng thc c hai lp ri sau
Ko ln. Nu on m tng t nhng khng ging ht nhau, bn cn Trch phng
thc tch on ging v on khc nhau. Sau bn c th T chc phng thc
mu. Nu cc phng thc lm cng mt vic vi nhng gii thut khc nhau, bn c
th chn gii thut r rng hn v s dng Thay th gii thut.
Nu bn c nhng on m trng lp trong cc lp khng lin quan, hy xem xt n
vic s dng Trch lp t mt lp v s dng thnh phn mi lp cn li. Mt kh
nng khc l phng thc ng l ch thuc v mt lp v c gi bi lp cn li hoc
phng thc thuc v mt lp th ba v c s dng bi c hai lp. Bn cn quyt
nh xem phng thc c ngha u v m bo rng n phi m khng phi ni
no khc.
3.2.

Phng thc di

Chng trnh hng i tng tt nht v sng lu nht l chng trnh c cc phng
thc ngn. Mi ngi u nhn ra rng phng thc cng di th cng kh hiu. Cc
phng thc ngn vi tn gi c t hp l c th tit kim rt nhiu thi gian v bn
khng cn c thn hm.
Trong 99% trng hp, tt c nhng g cn lm rt ngn phng thc l Trch
phng thc. Hy tm nhng phn ca phng thc kt hp c vi nhau v to ra

phng thc mi.


Nu bn c mt phng thc vi rt nhiu tham s v bin tm, nhng thnh phn ny
c th cn tr vic trch phng thc. Bn s phi truyn qu nhiu tham s v bin tm
nh l tham s cho nhng phng thc c trch ra v kt qu cn kh c hn c lc
u. Bn c th s dng Thay bin tm bi truy vn loi b mt s bin tm. Danh
sch tham s di c th c tr thnh gn gng vi cc phng php To i tng
tham s v Gi i tng nguyn vn.
Nu bn thc hin nhng cch trn m vn c qu nhiu bin tm v tham s, n
lc dng n pho hng nng: Thay phng thc bng i tng phng thc.
Lm th no xc nh nhng on m c th trch ra? Cch kh tt l tm ch thch.
Mt on m vi ch thch ch ra rng n c th c thay bi mt phng thc c tn
da trn ni dung ch thch. Thm ch mt dng cng ng trch nu n cn phi
c gii thch.
Cc cu lnh iu kin v vng lp cng l du hiu cn trch phng thc. S dng
Phn ly iu kin x l cc biu thc iu kin. Vi vng lp, trch n v m ngun
bn trong thnh mt phng thc ring.
3.3.

Lp ln

Khi mt lp lm qu nhiu vic, n thng th hin ch c qu nhiu bin th hin


(instance variables). Khi mt lp c qu nhiu bin th hin, trng lp m ngun chc
chn khng xa.
Bn c th Trch lp nhm mt s bin. Chn nhng bin c th chung sng vi nhau
trong mt thnh phn. Chng hn depositAmount v depositCurrency c nhiu kh
nng cng thuc v mt thnh phn. Ni chung, chia s mt tin t hoc hu t trong
mt tp con ca cc bin trong mt lp gi cn mt thnh phn mi. Nu thnh phn
ny thch hp lm lp con, bn s thy Trch lp con d thc hin hn.
i khi mt lp khng s dng tt c cc bin th hin ca n trong tt c thi gian. Nu
th, bn c th p dng Trch lp v Trch lp con nhiu ln.
Cng nh lp c qu nhiu bin, mt lp c qu nhiu m l mnh t mu m cho s
trung lp m ngun, hn lon v s tht bi. Gii php n gin nht l gim s d tha
trong bn thn lp. Nu bn c nhng phng thc di 500 dng m vi rt nhiu phn
chung, bn c th bin n thnh nm phng thc mi dng vi mi phng thc hai
dng trch t phng thc ban u.
Gii php thng gp cho trng hp ny l Trch lp v Trch lp con. Mt mo hu
ch l s dng Trch giao din xc nh khch hng s dng lp nh th no. Cch
ny c th cho bn mt vi tng v cch chia nh thm lp.
Nu lp ln ca bn li l mt lp GUI, bn c th phi chuyn d liu v hnh vi sang
mt i tng nghip v khc. iu ny c th cn phi nhn bn d liu chuyn c hai
ni v gi d liu ng b. Nhn bn d liu gi cch thc hin vic ny.

Chng 4. Xy dng b kim th


Nu bn mun refactor, iu kin tin quyt l phi c b kim th chc chn. Ngay c
khi bn c nhng cng c c th t ng ho refactoring, bn vn cn kim th. S cn
rt lu na trc khi mi thao tc refactor u c th thc hin bng cng c.
4.1.

Gi tr ca m kim th

Nu bn quan st hu ht cc lp trnh vin s dng thi gian ca h, bn s nhn ra


rng vit m thc ra ch chim mt phn nh. Mt t thi gian tm hiu cn phi lm
g vit tip, mt t thit k, nhng hu ht thi gian c dng g li. Chc
chn bn s nh nhng ting ng h di g li, nhiu khi gia m khuya. Mi lp
trnh vin u c th k chuyn mt li khin anh ta mt c ngy (hoc nhiu hn)
tm ra. Sa li thng thng kh nhanh, nhng tm ra n l c mt cn c mng. V
khi bn sa mt li, lun lun c kh nng mt li khc s xut hin m bn khng bit
cho n rt lu sau. Bn s mt nhiu nm tm ra li .
M ngun t kim tra (self-testing code) l cch my tnh t ng kim tra li gip
bn. Cc cng c hin nay cho php bn vit nhng on m khi c chy s a ra
thng bo li nu nhng k vng khng c tho mn. Ngay khi vit mt hm no ,
hy vit ngay m kim tra s thc hin ca hm . Bn ch phi vit m ny mt ln,
mi khi refactor hay bt c thay i no khc vi m ngun, bn c th chy li n
m bo mi th vn hot ng chnh xc.
Theo Martin Fowler, mt b kim th l chic my pht hin li mnh m loi b thi
gian tn tm li. Trn thc t, dnh thi gian vit m kim th l mt cch tit
kim thi gian v pht trin phn mm nhanh hn.
Thm ch mt s phng php pht trin phn mm hin i yu cu vit m kim th
trc khi vit chng trnh. Bng vic vit ra cc trng hp c th xy ra, bn hiu r
mnh mong mun iu g tnh nng sp ci t. Vit test cng gip bn tp trung vo
giao din hn l ci t (lun lun l thi quen tt). N cng c ngha bn bit chc khi
no hon thnh vic vit m: khi test chy c.
nh ngha refactoring yu cu qu trnh ny khng lm thay i hnh vi bn ngoi ca
h thng. S dng m kim th l mt cch r rng t c mc ch ny. Mi khi
bn thc hin mt thao tc refactoring, hy nh chy li ton b test m bo n
khng gy ra li trc khi thc hin thao tc tip theo.

Chng 5. Cc phng php refactor


Martin Fowler trong cun sch ca ng dn ra mt danh sch di cc phng thc khc
nhau refactor. Trong gii hn ca ti liu ny ti khng c iu kin trnh by ht tt
c m ch chn ra vi gng mt tiu biu. Danh sch y cc phng php
refactor c Ph lc C.
5.1.

nh dng ca cc phng php refactor

Trong cc phn tip theo, cc phng php refactor c trnh by vi mt nh dng


thng nht nh sau:
Bt u bng tn ca phng php
Sau l tm tt v tnh hung bn cn s dng phng php v ni dung
phng php.
Phn ng c m t ti sao phng php nn c thc hin v nhng trng
hp khng nn dng.
Phn c ch trong sch c lc b do cc cng c hin ti h tr rt tt
nhng thao tc refactor thng dng.
Cc v d cho mt trng hp rt n gin m phng php c s dng
minh ho cch n lm vic.
5.2.

Trch phng thc

5.2.1.

Tm tt

Mt on m no c th c nhm li.
Chuyn on m thnh mt phng thc, t tn gii thch mc ch ca phng
thc .
void printOwing(double amount) {
printBanner();
//print details
System.out.println ("name:" + _name);
System.out.println ("amount" + amount);
}
Chuyn thnh:
void printOwing(double amount) {
printBanner();
printDetails(amount);

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

ng c

Trch phng thc t nhng phng thc di hoc nhng on m cn c ch thch l


mt cch hiu m tt hn.
Phng thc ngn v c t tn tt c nhiu ch li. Trc ht, n tng c hi c
cc phng thc khc s dng khi cc phng thc c tinh chnh. Th hai, n gip
cc phng thc cp cao hn trng ging nh mt dy cc ch thch. Vic override cng
d dng hn.
i khi mi ngi bn khon mt phng thc nn di bao nhiu. di ca phng
thc thc ra khng phi vn , iu quan trng l khong cch v ng ngha gia tn
phng thc v thn phng thc. Nu vic trch rt ci thin tnh r rng, hy lm iu
, k c khi tn phng thc cn di hn on m bn va trch.
5.2.3.

V d: Khng c bin ni b

void printOwing() {
Enumeration e = _orders.elements();
double outstanding = 0.0;
// print banner
System.out.println ("**************************");
System.out.println ("***** Customer Owes ******");
System.out.println ("**************************");
// calculate outstanding
while (e.hasMoreElements()) {
Order each = (Order) e.nextElement();
outstanding += each.getAmount();
}
//print details
System.out.println ("name:" + _name);
System.out.println ("amount" + outstanding);

}
Ta trch ra on m in banner:
void printOwing() {
Enumeration e = _orders.elements();
double outstanding = 0.0;
printBanner();
// calculate outstanding
while (e.hasMoreElements()) {
Order each = (Order) e.nextElement();
outstanding += each.getAmount();
}
//print details
System.out.println ("name:" + _name);
System.out.println ("amount" + outstanding);
}
void printBanner() {
// print banner
System.out.println ("**************************");
System.out.println ("***** Customer Owes ******");
System.out.println ("**************************");
}
5.2.4.

V d: C s dng bin ni b

Vi s tn ti ca bin ni b: cc tham s truyn vo hoc bin tm c nh ngha


trong thn phng thc, ta c vn cn gii quyt. Bn cn phi x l cc bin ny
hoc chp nhn khng th refactor c.
void printOwing() {
Enumeration e = _orders.elements();
double outstanding = 0.0;
printBanner();
// calculate outstanding
while (e.hasMoreElements()) {

Order each = (Order) e.nextElement();


outstanding += each.getAmount();
}
//print details
System.out.println ("name:" + _name);
System.out.println ("amount" + outstanding);
}
Chuyn thnh:
void printOwing() {
Enumeration e = _orders.elements();
double outstanding = 0.0;
printBanner();
// calculate outstanding
while (e.hasMoreElements()) {
Order each = (Order) e.nextElement();
outstanding += each.getAmount();
}
printDetails(outstanding);
}
void printDetails (double outstanding) {
System.out.println ("name:" + _name);
System.out.println ("amount" + outstanding);
}
5.2.5.

V d: Gn li mt bin ni b

Trong trng hp ny tnh hnh tr nn phc tp hn. Ta s ch cp n bin tm.


Nu c mt php gn vo tham s, bn nn ngay lp tc p dng phng php Xo php
gn vo tham s.
void printOwing() {
Enumeration e = _orders.elements();
double outstanding = 0.0;
printBanner();

// calculate outstanding
while (e.hasMoreElements()) {
Order each = (Order) e.nextElement();
outstanding += each.getAmount();
}
printDetails(outstanding);
}
Sau khi trch:
void printOwing() {
printBanner();
double outstanding = getOutstanding();
printDetails(outstanding);
}
double getOutstanding() {
Enumeration e = _orders.elements();
double outstanding = 0.0;
while (e.hasMoreElements()) {
Order each = (Order) e.nextElement();
outstanding += each.getAmount();
}
return outstanding;
}
5.3.

Nhp phng thc (Inline method)

5.3.1.

Tm tt

Thn mt hm cng r rng nh tn ca n.


t trc tip thn phng thc vo ni gi n v xo n i.
int getRating() {
return (moreThanFiveLateDeliveries()) ? 2 : 1;
}
boolean moreThanFiveLateDeliveries() {

return _numberOfLateDeliveries > 5;


}
c refactor thnh:
int getRating() {
return (_numberOfLateDeliveries > 5) ? 2 : 1;
}
5.3.2.

ng c

Mt nguyn tc lp trnh l s dng nhng phng thc ngn c t tn sao cho th


hin c mc ch ca n v nhng phng thc nh th gip m ngun r rng v d
c hn. Nhng i khi bn bt gp nhng phng thc m thn ca n cng r rng
nh ci tn ca n. Hoc bn refactor mt on m thnh mt phng thc cng r rng
nh tn ca n. Khi iu ny xy ra, bn nn loi b nhng phng thc . Ch dn c
th c ch, nhng ch dn khng cn thit ch gy bc mnh.
Trng hp khc m Nhp phng thc nn c p dng l khi bn c mt nhm cc
phng thc b phn chia khng ph hp. Bn c th nhp chng li thnh mt phng
thc ln sau trch li thnh cc phng thc khc. Bn nn lm ng tc ny trc
khi p dng Thay phng thc bng i tng phng thc. Bn nhp cc li gi t
phng thc c hnh ng bn mong mun trong i tng phng thc. Di chuyn
mt phng thc s d dng hn phng thc v nhng phng thc n s dng.
i khi ngi ta s dng qu nhiu ch dn v dng nh cc phng thc ch n gin
u quyn cho phng thc khc. Trong nhng trng hp , mt s ch dn l ng gi
nhng khng phi tt c. Bng cch Nhp phng thc, ta c th gi li nhng phng
thc hu ch v loi b nhng g cn li.
5.4.
5.4.1.

Nhp bin tm
Tm tt

Bn c mt bin tm c gn mt ln vi mt biu thc n gin v n gy cn tr cc


refactoring khc.
Thay th tt c tham chiu n bin tm bng mt biu thc.
double basePrice = anOrder.basePrice();
return (basePrice > 1000)
Tr thnh:
return (anOrder.basePrice() > 1000)

5.4.2.

ng c

Trong phn ln trng hp Nhp bin tm c s dng nh mt phn ca Thay bin


tm bng truy vn, l ng c chnh. Trng hp duy nht Nhp bin tm c s
dng mt mnh l khi bn thy mt bin tm c gn gi tr tr v ca mt phng
thc. Thng thng bin ny khng gy hi v bn c th mc k n mt cch an ton.
Nu bin ny gy c tr cc phng php refactoring, v d nh Trch phng thc, n
lc cn nhp n.
5.5.

Di chuyn phng thc

5.5.1.

Tm tt

Mt phng thc c s dng bi mt lp khc nhiu hn l lp m n c nh


ngha.
To mt phng thc mi vi thn tng t trong lp s dng n nhiu nht. Hoc
chuyn phng thc c thnh nhng s u quyn hoc xo hn n i.
5.5.2.

ng c

Di chuyn phng thc l phn khng th tch ri ca refactoring. Thng khi lp c


qu nhiu hnh vi hay cc lp tng tc qu nhiu, chng b gn vi nhau (coupled).
Bng cch di chuyn vi phng thc, bn c th lm cho cc lp n gin hn v hp
l hn.
Sau khi bn di chuyn mt trng no , hy nhn qua cc phng thc trong lp
tm ra nhng phng thc truy cp i tng khc nhiu hn chnh i tng m n
c t. Khi bn tm thy mt phng thc cn di chuyn, bn hy nhn vo cc
phng thc gi n, cc phng thc n gi n v cc phng thc np chng trong
cy tha k. nh gi c nn tip tc da trn i tng m phng thc c nhiu tng
tc hn.
5.5.3.

V d

Mt lp biu din ti khon minh ho cho k thut ny:


class Account...
double overdraftCharge() {
if (_type.isPremium()) {
double result = 10;
if (_daysOverdrawn > 7) result += (_daysOverdrawn - 7) * 0.85;
return result;
}

else return _daysOverdrawn * 1.75;


}
double bankCharge() {
double result = 4.5;
if (_daysOverdrawn > 0) result += overdraftCharge();
return result;
}
private AccountType _type;
private int _daysOverdrawn;
Gi s bn c mt vi loi ti khon, mi loi c quy tc ring tnh tin thu chi
(overdraft charge). Nn di chuyn hm overdraftCharge() n cc loi ti khon .

Chng 6. Cc cng c refactor


6.1.

Refactor bng cng c

Refactor s dng cng c hiu qu hn nhiu so vi refactor bng tay. Ngay c khi bn
c bo him bng b kim th, refactor bng tay vn tn thi gian hn rt nhiu.
Vi s h tr ngy cng cao ca cc cng c, refactoring ngy cng t tch ri khi lp
trnh. Chng ta s khng ni by gi ti ang lp trnh v by gi ti ang refactor
na m ch ni Trch phn ny ca phng thc, y n ln lp cha sau gi phng
thc mi va to trong lp con m ti ang lm vic. V bn khng kim th sau cc
thao tc refactor t ng ho nn vic chuyn i gia hai chic m tr nn t r rng
hn nhiu.
6.2.

Refactor m ngun Java bng Eclipse

Ngy nay cc cng c refactor cho cc ngn ng nh kiu tnh rt y . bn


nm c refactor p dng trong thc t nh th no, ti s s dng Eclipse vi ngn
ng Java minh ho. Di y trnh by mt s cng c thng dng, danh sch y
cc cng c c h tr bi Eclipse Helios c cho trong Ph lc D.
6.2.1.

Thc n refactor

Ti v tr ang son tho, nhn phi chut v chn refactor hoc s dng t hp phm
Alt-Shift-T, bn s nhn c mt thc n nhng thao tc refactor kh d. Danh sch
ny tu thuc vo ni bn t con tr nn n c th khng cho thy ht nhng kh nng
ca Eclipse.
6.2.2.

i tn

y l thao tc hay dng nht. Khi t con tr tn mt lp, bin hay phng thc v
nhn t hp phm Alt-Shift-R, tn c chn s c nh du tt c nhng ni n
xut hin trong ca s son tho hin thi. Khi bn hy nhp tn mi bn mong
mun v nhn enter. Tt c nhng tham chiu n i tng c trong v ngoi ca s
hin thi u c i theo.

Bn cng c th chn mt tp m ngun Java v nhn t hp phm Alt-Shift-R hoc


nhn phm F2 i tn lp bn trong v cng tn vi tp .

6.2.3.

Trch phng thc

La chn mt on m v nhn t hp phm Alt-Shift-M hoc kch hot thc n


refactor v chn mc Extract method.
Trong hp hi thoi, hy in tn phng thc mi, bn c th sp xp th t cc tham
s cng nh thay i tn, kiu ca tham s.

6.2.4.

Nhp phng thc

Trong khi con tr ang t tn mt phng thc, s dng t hp phm Alt-Shift-I hoc
kch hot thc n refactor v chn Inline.

6.2.5.

Nhp bin tm

Trong khi con tr t tn mt bin, nhn t hp phm Alt-Shift-I hoc kch hot thc
n refactor > Inline...

6.2.6.

Di chuyn phng thc

Trong khi con tr t tn m phng thc, nhn t hp phm Alt-Shift-V hoc kch
hot thc n refactor, chn Move...

Ph lc A. Ti liu tham kho


[1] Martin Fowler et al., Refactoring: Improving the Design of Existing Code, First
Edition, 1999
[2] B mn Cng ngh Phn mm i hc Bch Khoa H Ni, Slide bi ging Nhp
mn Cng ngh Phn mm, 2001
[3] Wikipedia contributors, "Code refactoring," Wikipedia, The Free Encyclopedia,
http://en.wikipedia.org/w/index.php?title=Code_refactoring&oldid=419442858
(accessed March 21, 2011).
[4] Nhng ngi ng gp vo Wikipedia, Ci tin m ngun, Wikipedia, Bch
khoa ton th m, http://vi.wikipedia.org/w/index.php?title=C%E1%BA%A3i_ti
%E1%BA%BFn_m%C3%A3_ngu%E1%BB%93n&oldid=4218952 (truy nhp
ngy 21 thng 3 nm 2011).

Ph lc B. Danh sch bad smells in code


1.

M ngun trng lp

2.

Phng thc di

3.

Lp ln

4.

Danh sch tham s di

5.

Thay i bt ng

6.

Shotgun surgery

7.

Feature envy

8.

Data clumps

9.

m nh d liu nguyn thu

10.

Cu lnh switch

11.

Phn cp tha k song song

12.

Lp li bing

13.

S tng qut dnh

14.

Trng tm

15.

Chui thng ip

16.

Trung gian

17.

Thn mt khng ng cch

18.

Lp thay th vi giao din khc nhau

19.

Lp th vin khng y

20.

Lp d liu

21.

Ca tha k b t chi

22.

Ch thch

Ph lc C. Danh sch cc phng php refactor


1.

Son tho phng thc

1.1.

Trch phng thc

1.2.

Nhp phng thc

1.3.

Nhp bin tm

1.4.

Thay bin tm bng truy vn

1.5.

To bin gii thch

1.6.

Tch bin tm

1.7.

B cc php gn tham s

1.8.

Thay phng thc bng i tng phng thc

1.9.

Thay th gii thut

2.

Di chuyn tnh nng gia cc i tng

2.1.

Di chuyn phng thc

2.2.

Di chuyn trng

2.3.

Trch lp

2.4.

B lp

2.5.

Giu delegate

2.6.

Xo lp trung gian

2.7.

To phng thc ngoi

2.8.

To phn m rng ni b

3.

T chc d liu

3.1.

ng gi trng ni b

3.2.

Thay gi tr bng i tng

3.3.

i gi tr thnh tham chiu

3.4.

i tham chiu thnh gi tr

3.5.

Thay mng bng i tng

3.6.

Nhn bn d liu

3.7.

i lin kt mt chiu thnh lin kt hai chiu

3.8.

i lin kt hai chiu thnh lin kt mt chiu

3.9.

Thay gi tr c bit bng hng t tn

3.10.

ng gi trng

3.11.

ng gi tp hp

3.12.

Thay th bn ghi bng lp d liu

3.13.

Thay th m kiu bng lp

3.14.

Thay th m kiu bng lp con

3.15.

Thay th m kiu bng trng thi, chin lc

3.16.

Thay th lp con bng trng

4.

n gin ho biu thc iu kin

4.1.

Phn ly iu kin

4.2.

Kt hp biu thc iu kin

4.3.

Kt hp on m iu kin

4.4.

Xo c iu khin

4.5.

Thay th iu kin lng bng biu thc canh

4.6.

Thay th iu kin bng a hnh

4.7.

To i tng null

4.8.

To s xc nhn (assertion)

5.

Khin li gi hm n gin hn

5.1.

i tn phng thc

5.2.

Thm tham s

5.3.

Xo tham s

5.4.

Tch truy vn khi thay i

5.5.

Tham s ho phng thc

5.6.

Thay tham s bng phng thc tng minh

5.7.

Gi i tng nguyn vn

5.8.

Thay tham s bng phng thc

5.9.

To i tng tham s

5.10.

Xo phng thc thit lp

5.11.

Giu phng thc

5.12.

Thay hm to bng factory method

5.13.

ng gi s p kiu xung

5.14.

Thay m li bng ngoi l

5.15.

Thay ngoi l bng kim tra

6.

ng u vi s tng qut ho

6.1.

Ko ln trng

6.2.

Ko ln phng thc

6.3.

Ko ln thn hm to

6.4.

y xung phng thc

6.5.

y xung trng

6.6.

Trch lp con

6.7.

Trch lp cha

6.8.

Trch giao din

6.9.

Thu gn cy k tha

6.10.

T chc phng thc mu

6.11.

Thay k tha bng u quyn

6.12.

Thay u quyn bng k tha

7.

Refactoring ln

7.1.

Tch i cy tha k

7.2.

Chuyn i thit k th tc thnh i tng

7.3.

Tch nghip v khi trnh by

7.4.

Trch cy tha k

Ph lc D. Cc cng c refactor m ngun Java trong Eclipse Helios


1.

Rename (i tn)

2.

Move (Di chuyn)

3.

Change method signature (i ch k ca phng thc)

4.

Extract Method (Trch phng thc)

5.

Extract Local Variable (Trch bin cc b)

6.

Extract Constant (Trch hng)

7.

Inline (Nhp phng thc, bin)

8.

Convert Anonymous Class to Nested (Chuyn lp v danh sang lp lng)

9.

Move Type to New File (Di chuyn kiu sang tp mi)

10.

Convert Local Variable to Field (Chuyn bin ni b thnh trng)

11.

Extract Superclass (Trch lp cha)

12.

Extract Interface (Trch giao din)

13.

Use Supertype Where Possible (S dng lp cha, giao din khi c th)

14.

Push Down (y xung)

15.

Pull Up (Ko ln)

16.

Extract Class (Trch lp)

17.

Introduce Parameter Object (To i tng tham s)

18.

Introduce Indirection

19.

Introduce Factory

20.

Introduce Parameter (To tham s)

21.

Encapsulate Field (Bao ng trng)

22.

Generalize Declared Type (Tng qut ho)

23.

Infer Generic Type Arguments

You might also like