《重構(gòu) 改善既有代碼的設(shè)計(jì)》讀書筆記【更新中百拓。。晰甚⊙么】

讀這本書的初衷是想對(duì)自己的代碼以旁觀者的角度進(jìn)行一番審查,所以選擇了這本網(wǎng)上大家都推薦的書籍——《重構(gòu) 改善既有代碼的設(shè)計(jì)》厕九。這本書上提供了很多重構(gòu)代碼的技巧方法蓖捶。個(gè)人認(rèn)為重構(gòu)最直觀的感受是“提高代碼的閱讀效率”,什么意思扁远?就是當(dāng)接手你代碼的同事能夠很快的理解這段代碼的意思以及編寫上的思維角度俊鱼,就是能夠讀懂你當(dāng)時(shí)處理數(shù)據(jù)的邏輯方式。另一方面就是“提高代碼的質(zhì)量”畅买,接手工作的同事在閱讀的同時(shí)能夠擱在心里連連稱贊這段代碼編寫方式并闲,說明你的重構(gòu)是有效。

一谷羞、重新組織函數(shù)

1帝火、Extract Method(提煉函數(shù))(P110)

“你有一段代碼可以被組織在一起并獨(dú)立出來”

Extract Method個(gè)人感覺是重構(gòu)代碼最常用的一個(gè)方法,在code review或者自我檢查代碼的時(shí)候,應(yīng)該都會(huì)用到這個(gè)方法犀填。

動(dòng)機(jī):

過長(zhǎng)的函數(shù)或者需要注釋才能讓人理解用途的代碼蠢壹,這個(gè)時(shí)候就需要考慮將這段代碼放進(jìn)一個(gè)獨(dú)立的函數(shù)。

當(dāng)你發(fā)現(xiàn)代碼中有大量的注釋來解釋這段代碼的用途的時(shí)候九巡,你就需要著手對(duì)這段代碼進(jìn)行重構(gòu)提煉了图贸,這也是新手重構(gòu)代碼的入口。

做法:

(1)創(chuàng)造一個(gè)新函數(shù)冕广,根據(jù)這個(gè)函數(shù)的意圖對(duì)它來命名(命名也是重構(gòu)的一種方法)求妹,命名要做到“見名之意”,讓別人看到名字就知道這段代碼的用途

(2)將提煉出的代碼從源函數(shù)復(fù)制到新建的目標(biāo)函數(shù)中

(3)檢查變量(局部變量和源函數(shù)參數(shù))佳窑,當(dāng)被提煉代碼段中需要讀取局部變量時(shí)制恍,這是就需要將局部變量當(dāng)作參數(shù)傳給目標(biāo)函數(shù);當(dāng)有臨時(shí)變量?jī)H作用于被提煉代碼段時(shí)神凑,在目標(biāo)函數(shù)中將它們聲明為臨時(shí)變量净神。這部分是整個(gè)Extract Method的精髓所在,需要處理好

(4)處理完所有局部變量之后溉委,進(jìn)行編譯

(5)在源函數(shù)中鹃唯,將被提煉斷碼段替換為對(duì)目標(biāo)函數(shù)的調(diào)用

(6)編譯,測(cè)試

提煉函數(shù)這種方式瓣喊,可以直接使用IDE工具中的快捷鍵坡慌,可以很方便的幫你處理第三個(gè)步驟中的變量,自動(dòng)的檢測(cè)被提煉代碼段所需要的一些參數(shù)

2藻三、Replace Temp with Query(以查詢?nèi)〈R時(shí)變量)

將這個(gè)表達(dá)式提煉到一個(gè)獨(dú)立函數(shù)中洪橘。將這個(gè)臨時(shí)變量的所有引用點(diǎn)替換為對(duì)新函數(shù)的調(diào)用。此后棵帽,新函數(shù)就可能被其他函數(shù)使用熄求。

看到這中重構(gòu)方式之后,自己也經(jīng)常在代碼中運(yùn)用這中手段逗概。去掉一些臨時(shí)變量的運(yùn)用弟晚,簡(jiǎn)化一些代碼。

動(dòng)機(jī):

臨時(shí)變量是暫時(shí)的逾苫,只能在所屬函數(shù)內(nèi)使用卿城。由于臨時(shí)變量只在所屬函數(shù)內(nèi)可見,所以會(huì)驅(qū)使寫出更長(zhǎng)的函數(shù)铅搓。如果把臨時(shí)變量替換為一個(gè)查詢瑟押,那么同一個(gè)類中的所有函數(shù)都將可以獲得這份信息。

這種重構(gòu)的最簡(jiǎn)單情況就是:臨時(shí)變量只被賦值一次狸吞,或者賦值給臨時(shí)變量的表達(dá)式不受其他條件影響

做法:

(1)找出只被賦值一次的臨時(shí)變量

(2)將該臨時(shí)變量聲明為final

(3)編譯(確保該臨時(shí)變量的確只被賦值一次)

(4)將“對(duì)該臨時(shí)變量賦值”的語(yǔ)句的等號(hào)右側(cè)部分提煉到一個(gè)獨(dú)立函數(shù)中

(5)編譯勉耀,測(cè)試

(6)在該臨時(shí)變量身上實(shí)施Inline Temp(P119)

范例:

示例函數(shù)

double getPrice(){
    int basePrice=_quantity*_itemPrice;
    double discountFactor;
    if(basePrice>1000) 
        discountFactor=0.95;
    else 
        discountFactor=0.98;
    return basePrice*discountFactor;
}

聲明為final

double getPrice(){
    final int basePrice=_quantity*_itemPrice;
    final double discountFactor;
    if(basePrice>1000) 
            discountFactor=0.95;
        else 
            discountFactor=0.98;
    return basePrice*discountFactor;
}

替換臨時(shí)變量

double getPrice(){
    final int basePrice=basePrice();
    final double discountFactor;
    if(basePrice>1000) 
            discountFactor=0.95;
        else 
            discountFactor=0.98;
    return basePrice*discountFactor;
}

private int basePrice(){
    return _quantity*_itemPrice;
}

使用Inline Temp

    double getPrice(){
    final int basePrice=basePrice();
    final double discountFactor;
    if(basePrice()>1000) 
            discountFactor=0.95;
        else 
            discountFactor=0.98;
    return basePrice*discountFactor;
}

private int basePrice(){
    return _quantity*_itemPrice;
}

替換其他臨時(shí)變量,刪掉臨時(shí)變量

    double getPrice(){
    //final int basePrice=basePrice();
    final double discountFactor;
    if(basePrice()>1000) 
            discountFactor=0.95;
        else 
            discountFactor=0.98;
    return basePrice()*discountFactor;
}

private int basePrice(){
    return _quantity*_itemPrice;
}

提煉discountFactor()

double getPrice(){
    final double discountFactor=discountFactory();
    return basePrice()*discountFactor;
}

private int basePrice(){
    return _quantity*_itemPrice;
}

private double discountFactor(){
    if(basePrice()>1000)
        reurn 0.95;
    else 
        return 0.98;
}

最終重構(gòu)函數(shù)getPrice()

double getPrice(){
    return basePrice()*discountFactor();
}

private int basePrice(){
    return _quantity*_itemPrice;
}

private double discountFactor(){
    if(basePrice()>1000)
        reurn 0.95;
    else 
        return 0.98;
}

在實(shí)際的開發(fā)過程中蹋偏,如果能一眼就能發(fā)現(xiàn)的簡(jiǎn)單的可替換的臨時(shí)變量便斥,不妨動(dòng)手試試!

重構(gòu)之后威始,發(fā)現(xiàn)代碼行數(shù)變多了枢纠,方法增加了,但是整體看上去黎棠,發(fā)現(xiàn)邏輯清楚了晋渺。

3、Remove Assignments to Parameters(移除對(duì)參數(shù)的賦值)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末脓斩,一起剝皮案震驚了整個(gè)濱河市木西,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌随静,老刑警劉巖八千,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異燎猛,居然都是意外死亡恋捆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門重绷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沸停,“玉大人,你說我怎么就攤上這事昭卓》呒兀” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵候醒,是天一觀的道長(zhǎng)绰垂。 經(jīng)常有香客問我,道長(zhǎng)火焰,這世上最難降的妖魔是什么劲装? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮昌简,結(jié)果婚禮上占业,老公的妹妹穿的比我還像新娘。我一直安慰自己纯赎,他們只是感情好谦疾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著犬金,像睡著了一般念恍。 火紅的嫁衣襯著肌膚如雪六剥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天峰伙,我揣著相機(jī)與錄音疗疟,去河邊找鬼。 笑死瞳氓,一個(gè)胖子當(dāng)著我的面吹牛策彤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播匣摘,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼店诗,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了音榜?” 一聲冷哼從身側(cè)響起庞瘸,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赠叼,沒想到半個(gè)月后恕洲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡梅割,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年霜第,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片户辞。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡泌类,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出底燎,到底是詐尸還是另有隱情刃榨,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布双仍,位于F島的核電站枢希,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏朱沃。R本人自食惡果不足惜苞轿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逗物。 院中可真熱鬧搬卒,春花似錦、人聲如沸翎卓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)失暴。三九已至坯门,卻和暖如春微饥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背古戴。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工欠橘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人允瞧。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蛮拔,于是被迫代替她去往敵國(guó)和親述暂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容