以前看過一點(diǎn)這本書的英文版本,感覺相當(dāng)不錯(cuò),但是由于英文水平有限,總是感覺里面有些說法對(duì)我來說比較生澀,特別還有一些理論性的東西,如果只看英文,基本上是無從查起的.好在這本書有了中文版(也許早就有了,我可是才剛剛找到),高興之余,細(xì)細(xì)品讀,寫寫筆記,潦記于此.
先看看書中有關(guān)重構(gòu)的定義:
重構(gòu)的定義:在
不改變代碼
外在行為的前提下,對(duì)代碼做出修改,以
改進(jìn)程序的
內(nèi)部結(jié)構(gòu)。本質(zhì)上說,重構(gòu)就是在代碼寫好之后改進(jìn)它的設(shè)計(jì)。
這個(gè)定義說得很清楚了,基本上不需要進(jìn)行任何的說明。我們只要將它當(dāng)作原則去遵照就好了。
然后書中講了:
快速而隨性(quick and dirty)的設(shè)計(jì)一個(gè)簡(jiǎn)單的程序并沒有錯(cuò)。
于是我就有這樣的問題了:
什么規(guī)模的程序才值得重構(gòu)?
然后書中給了我這樣一個(gè)回答:
如果你發(fā)現(xiàn)自己需要為程序添加一個(gè)特性,而代碼結(jié)構(gòu)使你
無法很方便的那么做,那就先重構(gòu)那個(gè)程序,使特性的添加比較容易進(jìn)行,然后添加特性。
重構(gòu)之前要做這樣一些準(zhǔn)備:
重構(gòu)的第一步--為代碼建立測(cè)試環(huán)境。
重構(gòu)之前,首先檢查自己是否有一套可靠的測(cè)試機(jī)制。這些測(cè)試必須有自我檢查能力。
下面是一些摘錄:
首先在代碼中找出函數(shù)內(nèi)的局部變量和參數(shù)。任何不會(huì)修改的變量都可以被當(dāng)成參數(shù)傳入新的函數(shù),至于會(huì)被修改的變量就需要格外小心。如果只有一個(gè)變量會(huì)被修改,可以把它當(dāng)作返回值。
在找出一個(gè)函數(shù)的邏輯泥潭并將之提練到另外一個(gè)函數(shù)中的時(shí)候,要格外注意返回值。如果你經(jīng)常犯這樣的錯(cuò)誤,那么一定確保在修改前后函數(shù)的調(diào)用結(jié)果相一致。
代碼應(yīng)該表現(xiàn)自己的目的,這一點(diǎn)非常重要。
閱讀代碼的時(shí)候,我經(jīng)常進(jìn)行重構(gòu)。這樣,隨著對(duì)程序的理解逐漸加深,我也就不斷地把這些理解嵌入代碼中,這么一來才不會(huì)遺忘我曾經(jīng)理解的東西。
幾個(gè)重構(gòu)的方法(下面的偽碼是我自己寫的):
1、Extract Method (提取方法)
2、appending assignment ,operator+=( 附添賦值動(dòng)作)
這兩種重構(gòu)方法結(jié)合的形式為:
重構(gòu)前:
A=0;
A++;
if(expression)
A++;
重構(gòu)后:
A=0;
A+=function1();
TypeOfA function1()
{
if(expression)
return 2;
else
return 1;
}
3、Replace Temp with Query(字面上用查詢?nèi)〈R時(shí)變量)
利用所謂的query method來取代臨時(shí)變量。由于class內(nèi)的任何函數(shù)都可以取用(調(diào)用)所謂query methods,所以它能夠促進(jìn)比較干凈的設(shè)計(jì),而非冗長(zhǎng)復(fù)雜的函數(shù)。
Replace Temp with Query的偽碼例子:
A=0;
while(expression)
{
A++;
}
return "The Result is "+A;
上面A是一個(gè)臨時(shí)變量.所以可以用一個(gè)querymethod來取代:
TypeA function1()
{
A=0;
while(expression)
{
A++;
}
return A;
}
這樣主程序可以這樣寫:
return "The Result is "+function1();
繼續(xù)摘抄:
重構(gòu)可能會(huì)存在另外一個(gè)問題,就是性能。原本代碼只執(zhí)行一次循環(huán),在重構(gòu)以后可能要執(zhí)行三次。如果循環(huán)中的語句耗時(shí)很多,就可能大大降低程序的性能。單單為了這個(gè)原因,許多程序員就不愿進(jìn)行這個(gè)重構(gòu)動(dòng)作。但是請(qǐng)注意這里只是“可能”。除非進(jìn)行評(píng)測(cè),否則無法確定循環(huán)的執(zhí)行時(shí)間,也無法知道這個(gè)循環(huán)是否經(jīng)常使用以至于影響系統(tǒng)的整體性能。重構(gòu)時(shí)程序人員不必?fù)?dān)心這些,優(yōu)化時(shí)才去擔(dān)心它們,但那時(shí)候你已經(jīng)處于一個(gè)比較有利的位置,有更多選擇可以進(jìn)行有效優(yōu)化。
使用Form Template Method(字面上建立模板方法)可以進(jìn)一步減少重復(fù)代碼。這會(huì)在書后面的章節(jié)講到。
posted on 2007-06-15 22:53
littlegai 閱讀(369)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
我的讀書筆記