《重構(gòu):改善代碼的既有設(shè)計(jì)》讀書筆記

第1章 重構(gòu),第一個(gè)案例

  1. 代碼塊俞小,代碼的功能就俞容易管理,代碼的處理和移動(dòng)也就俞輕松。(功能也就越單一)
  2. 任何不會(huì)被修改的變量都可以被當(dāng)成參數(shù)傳入新的函數(shù),至于會(huì)被修改的變量需要慎重。如果只有一個(gè)變量會(huì)被修改,可以把它當(dāng)做返回值。
  3. 絕大多數(shù)情況下,函數(shù)應(yīng)該放在它所使用的數(shù)據(jù)的所屬對(duì)象內(nèi)。
  4. 最好不要在另一個(gè)對(duì)象的屬性基礎(chǔ)上運(yùn)用switch語句。如果不得不使用,也應(yīng)該在對(duì)象自己的數(shù)據(jù)上使用,而不是在別人的數(shù)據(jù)上使用。
  5. 使用繼承來適當(dāng)組織類關(guān)系后,可以用多態(tài)取代switch語句。
  6. 一部影片可以在生命周期內(nèi)修改自己的分類,一個(gè)對(duì)象卻不能在生命周期內(nèi)修改自己所屬的類。

第2章 重構(gòu)原則

  1. 三次法則:第一次做某件事時(shí)只管去做;第二次做類似的事會(huì)產(chǎn)生反感,但無論如何還是可以去做;第三次在做類似的是,你就應(yīng)該重構(gòu)。事不過三,三則重構(gòu)。
  2. 在重構(gòu)中引入間接層的某些價(jià)值:
    • 允許邏輯共享
    • 分開解釋意圖和實(shí)現(xiàn)
    • 隔離變化
    • 封裝條件邏輯
  3. 封裝條件邏輯。對(duì)象有一種奇妙的機(jī)制:多態(tài)消息,可以靈活而清晰地表達(dá)條件邏輯。將條件邏輯轉(zhuǎn)化為消息形式,往往能降低代碼的重復(fù)、增加清晰度并提高彈性。

第3章 代碼的壞味道

  1. 重復(fù)代碼:設(shè)法合二為一
    • 同一個(gè)類的兩個(gè)函數(shù)還有相同的表達(dá)式,這時(shí)需要提煉出重復(fù)代碼。
    • 兩個(gè)互為兄弟的子類內(nèi)含有相同的表達(dá)式,可以提煉相同代碼,并放到父類中。如果只是代碼間相似,并非完全相同,那么可以將相似部分和差異部分拆開,構(gòu)成單獨(dú)的函數(shù)。然后你可以使用模板方法的設(shè)計(jì)模式。
    • 如果兩個(gè)毫不相關(guān)的類中出現(xiàn)重復(fù)代碼,則可以將重復(fù)代碼提煉成一個(gè)函數(shù)放到一個(gè)獨(dú)立類中或者只放在某一個(gè)類中(總之要放在合適的地方),然后其他類都去調(diào)用這個(gè)函數(shù)。
  2. 過長(zhǎng)函數(shù)
    一條原則:每當(dāng)感覺需要以注釋來說明點(diǎn)什么的時(shí)候,我們就把需要說明的東西寫進(jìn)一個(gè)獨(dú)立函數(shù)中,并以其用途(而非實(shí)現(xiàn)手法)命名。哪怕替換后的函數(shù)調(diào)用動(dòng)作比函數(shù)自身還長(zhǎng),只要函數(shù)名稱能夠解釋其用途,我們也該毫不猶豫的那么做。關(guān)鍵不在于函數(shù)的長(zhǎng)度,而在于函數(shù)“做什么”和“如何做”之間的語義距離。
  3. 過大的類
    類內(nèi)如果有太多代碼,也是代碼重復(fù)、混亂并最終走向死亡的源頭。最簡(jiǎn)單的解決方案是把多余的東西消弭于類內(nèi)部。如果有五個(gè)“百行函數(shù)”,它們之間很多代碼都相同,那么或許你可以把它們編程五個(gè)“十行函數(shù)”和十個(gè)提煉出來的“雙行函數(shù)”。
  4. 過長(zhǎng)參數(shù)列:用對(duì)象做參數(shù)來減少參數(shù)個(gè)數(shù)
    • 有了對(duì)象,就不必把函數(shù)需要的所有東西都以參數(shù)傳遞給它了,只需傳給它足夠的、讓函數(shù)能從中獲得自己需要的東西就行了。函數(shù)需要的東西多半可以在函數(shù)宿主類中找到。如果將對(duì)象傳遞給函數(shù),大多數(shù)修改都將沒有必要,因?yàn)槟愫芸赡苤恍瑁ㄔ诤瘮?shù)內(nèi))增加一兩條請(qǐng)求,就能得到更多的數(shù)據(jù)。
    • 這里有一個(gè)重要的例外:有時(shí)候你明顯不希望造成“被調(diào)用對(duì)象”與“較大對(duì)象”間的某種依賴關(guān)系。這時(shí)候?qū)?shù)據(jù)從對(duì)象中拆解出來單獨(dú)作為參數(shù),也很合情合理。
  5. 發(fā)散式變化:一個(gè)類受多種變化的影響
    如果某個(gè)類經(jīng)常因?yàn)椴煌脑蛟诓煌姆较蛏习l(fā)生變化,發(fā)散式變化的壞味道就出現(xiàn)了。針對(duì)某一外界變化的所有相應(yīng)修改,都只應(yīng)該發(fā)生在單一類中,而這個(gè)新類內(nèi)的所有內(nèi)容都應(yīng)該反應(yīng)次變化。
  6. 霰彈式修改:一種變化引發(fā)多個(gè)類相應(yīng)修改
    如果每遇到某種變化,你都必須在許多不同的類內(nèi)做出許多小修改,你所面臨的壞味道就是霰彈式修改。這種情況下,可以把所有需要修改的代碼放進(jìn)同一個(gè)類,如果沒有合適的類可放,就創(chuàng)造一個(gè)。
  7. 依戀情節(jié)
    • 對(duì)象技術(shù)的全部要點(diǎn)在于:這是一種“將數(shù)據(jù)和對(duì)數(shù)據(jù)的操作行為包裝在一起”的技術(shù)。
    • 有一種經(jīng)典的氣味是:函數(shù)對(duì)某個(gè)類的興趣高過對(duì)自己所處類的興趣。這種孺慕之情最通常的焦點(diǎn)便是數(shù)據(jù)。
    • 處理這種壞味道的原則是:判斷哪個(gè)類擁有最多被此函數(shù)實(shí)用的數(shù)據(jù),然后就把這個(gè)函數(shù)和那些數(shù)據(jù)擺在一起。
    • 最根本的原則是:將總是一起變化的東西放在一塊。
  8. 數(shù)據(jù)泥團(tuán):總是綁在一起的數(shù)據(jù)應(yīng)該擁有屬于它們自己的對(duì)象
    一個(gè)好的評(píng)判辦法是:刪掉眾多數(shù)據(jù)中的一項(xiàng),其他數(shù)據(jù)有沒有因此而失去意義?如果他們不再有意義,這就是一個(gè)明確信號(hào):你應(yīng)該為它們產(chǎn)生一個(gè)新對(duì)象。
  9. 基本類型偏執(zhí):將數(shù)據(jù)組織成有意義的形式,不偏執(zhí)于基本類型
    • 對(duì)象技術(shù)的新手通常不愿意在小任務(wù)上運(yùn)用小對(duì)象。
    • 如果你有一組應(yīng)該總是被放在一起的字段(基本類型的數(shù)據(jù)),那么可以嘗試將這組數(shù)據(jù)放到一個(gè)單獨(dú)類中變成結(jié)構(gòu)類型的數(shù)據(jù)
  10. switch語句
    面向?qū)ο蟪绦虻囊粋€(gè)最明顯特征就是:少用switch(或case)語句。從本質(zhì)上說,switch語句的問題在于重復(fù)。面向?qū)ο笾械亩鄳B(tài)概念可為此帶來優(yōu)雅的解決辦法。
  11. 平行繼承體系
    • 如果你發(fā)現(xiàn)某個(gè)繼承體系的類名稱前綴和另一個(gè)繼承體系的類名稱前綴完全相同,便是問到了這種壞味道。
    • 消除這種重復(fù)性的一般策略是:讓一個(gè)繼承體系的實(shí)例引用另一個(gè)繼承體系的實(shí)例。
  12. 冗贅類
  13. 夸夸其談未來性
    當(dāng)有人說“噢, 我想我們總有一天需要做這件事”,并因而企圖以各式各樣的鉤子和特殊情況來處理一些非必要的事情,這種壞味道就出現(xiàn)了。
  14. 令人迷惑的臨時(shí)字段
  15. 過度耦合的消息鏈
  16. 中間人
  17. 狎昵關(guān)系
  18. 異曲同工的類
  19. 不完美的類庫
  20. 純稚的數(shù)據(jù)類
    • 純稚的數(shù)據(jù)類是指:它們擁有一些字段,以及用于訪問(讀寫)這些字段的函數(shù),除此之外一無長(zhǎng)物。
    • 這種類如果get/set方法均是public的,則需要引起注意,應(yīng)該進(jìn)行適當(dāng)?shù)姆庋b,而不是全部公有化。
  21. 被拒絕的遺贈(zèng)
    子類應(yīng)該繼承超類的函數(shù)和數(shù)據(jù)。但如果他們不想或不需要繼承所有的函數(shù)和數(shù)據(jù),則應(yīng)該為這個(gè)子類新建一個(gè)兄弟類,把所有用不到的函數(shù)和數(shù)據(jù)放到兄弟類中,他們共享的數(shù)據(jù)和函數(shù)則放到共同的超類中。
  22. 過多的注釋
    • 當(dāng)你感覺需要撰寫注釋時(shí),請(qǐng)先嘗試重構(gòu),試著讓所有注釋都變得多余
    • 如果你不知道該做什么的,這才是注釋的良好運(yùn)用時(shí)機(jī)。

第4章 構(gòu)筑測(cè)試體系

確保所有測(cè)試都完全自動(dòng)化,讓他們檢查自己的測(cè)試結(jié)果。

第5章 重構(gòu)列表

第6章 重新組織函數(shù)

  1. 提煉函數(shù)
    • 動(dòng)機(jī):首先,如果每個(gè)函數(shù)的粒度都很小,那么函數(shù)被服用的機(jī)會(huì)就更大;其次,這回是高層函數(shù)讀起來就像一系列注釋;再次,如果函數(shù)都是細(xì)粒度,那么函數(shù)的覆寫也會(huì)更容易些。函數(shù)的長(zhǎng)度不是問題,關(guān)鍵在于函數(shù)名稱和函數(shù)本體之間的語義距離。如果提煉可以強(qiáng)化代碼的清晰度,那么就去做,就算函數(shù)名稱比提煉出來的代碼還長(zhǎng)也無所謂。
    • 做法:創(chuàng)造一個(gè)新函數(shù),根據(jù)這個(gè)函數(shù)的意圖來對(duì)它命名(以它“做什么”來命名,而不是以它“怎樣做”命名)。
  2. 內(nèi)聯(lián)函數(shù)
  3. 內(nèi)聯(lián)臨時(shí)變量
  4. 引入解釋性變量
    將復(fù)雜表達(dá)式(或其中一部分)的結(jié)果放進(jìn)一個(gè)臨時(shí)變量,以此變量名稱來解釋表達(dá)式用途。
  5. 分解臨時(shí)變量
  6. 移除對(duì)參數(shù)的賦值
  7. 以函數(shù)對(duì)象取代函數(shù)
  8. 替換算法

第7章 在對(duì)象之間搬移特性

  1. 在對(duì)象的設(shè)計(jì)過程中,“決定把責(zé)任放在哪兒”即使不是最重要的事,也是最重要的事之一。
  2. 搬移函數(shù)
  3. 搬移字段
  4. 提煉類
  5. 將類內(nèi)聯(lián)化
  6. 隱藏委托關(guān)系
  7. 移除中間人
  8. 引入外加函數(shù)
  9. 引入本地?cái)U(kuò)展

第8章 重新組織數(shù)據(jù)

  1. 自封裝字段
  2. 以對(duì)象取代數(shù)據(jù)值
  3. 將值對(duì)象改為引用對(duì)象
  4. 將引用對(duì)象改為值對(duì)象
    • 值對(duì)象有一個(gè)非常重要的特性:它們應(yīng)該是不可變的。
    • 定義了equals(),就必須同時(shí)定義hashCode()。實(shí)現(xiàn)hashCode()有個(gè)簡(jiǎn)單的辦法:讀取equals()使用的所有字段的hash碼,然后對(duì)它們進(jìn)行按位異或(^)操作。
  5. 以對(duì)象取代數(shù)組

    小結(jié):用對(duì)象替代數(shù)組的好處就是就對(duì)數(shù)組的各種操作都可以封裝起來。因此,對(duì)于那些需要各種操作的數(shù)組,最好封裝起來。

  6. 復(fù)制“被監(jiān)視數(shù)據(jù)”
  7. 將單向關(guān)聯(lián)改為雙向關(guān)聯(lián)
  8. 將雙向關(guān)聯(lián)改為單向關(guān)聯(lián)
  9. 以字面常量取代魔法數(shù)
  10. 封裝字段
  11. 封裝集合
  12. 以數(shù)據(jù)類取代記錄
  13. 以類取代類型碼
  14. 以子類取代類型碼
  15. 以State/Strategy取代類型碼
  16. 以字段取代子類

第9章 簡(jiǎn)化條件表達(dá)式

  1. 分解條件表達(dá)式

    如果條件表達(dá)式中的條件太多太長(zhǎng),則可以把條件抽取成一個(gè)函數(shù),增加代碼可讀性。

  2. 合并條件表達(dá)式
    • 如果檢查條件各不相同,最終行為卻一致,就應(yīng)該使用“邏輯或”和“邏輯與”將他們合并為一個(gè)條件表達(dá)式。
    • 如果你認(rèn)為這些檢查的確彼此獨(dú)立,的確不應(yīng)該被視為同一次檢查,那么就不要使用本項(xiàng)重構(gòu)。
  3. 合并重復(fù)的條件片段
  4. 移除控制標(biāo)記
    適當(dāng)?shù)倪\(yùn)用break語句和continue語句可以取代標(biāo)志位的使用
  5. 以衛(wèi)語句取代嵌套條件表達(dá)式
    • 衛(wèi)語句,是指在方法最終返回語句前,加入其它返回語句(return語句)
    • 拆分條件,然后加入適當(dāng)?shù)男l(wèi)語句,以減少條件的嵌套層數(shù)
    • 將條件反轉(zhuǎn),然后加入適當(dāng)?shù)男l(wèi)語句,以減少條件的嵌套層數(shù)
  6. 以多態(tài)取代條件表達(dá)式
  7. 引入Null對(duì)象
  8. 引入斷言

第10章 簡(jiǎn)化函數(shù)調(diào)用

  1. 函數(shù)改名
  2. 添加參數(shù)
  3. 移除參數(shù)
  4. 將查詢函數(shù)和修改函數(shù)分離
  5. 令函數(shù)攜帶參數(shù)
  6. 以明確函數(shù)取代參數(shù)
  7. 保持對(duì)象完整
    • 有時(shí)候,你會(huì)將來自同一對(duì)象的若干項(xiàng)數(shù)據(jù)作為參數(shù),傳遞給某個(gè)函數(shù)。這樣做的問題在于:萬一將來被調(diào)用的函數(shù)需要新的數(shù)據(jù)項(xiàng),你就必須查找并修改對(duì)此函數(shù)的所有調(diào)用。如果你把這些數(shù)據(jù)所屬的整個(gè)對(duì)象傳給函數(shù),可以避免這種尷尬的處境,因?yàn)楸徽{(diào)用函數(shù)可以向那個(gè)參數(shù)對(duì)象請(qǐng)求任何它想要的信息。
    • 如果被調(diào)用函數(shù)使用了來自另一個(gè)對(duì)象的很多項(xiàng)數(shù)據(jù),這可能意味該函數(shù)實(shí)際上應(yīng)該被定義在那些數(shù)據(jù)所屬的對(duì)象中。
  8. 以函數(shù)取代參數(shù)
    • 如果函數(shù)可以通過其他途徑獲得參數(shù)值,那么它就不應(yīng)該通過參數(shù)取得該值。
    • 過長(zhǎng)的參數(shù)列會(huì)增加程序閱讀者的理解難度,因此我們應(yīng)該盡可能縮短參數(shù)列的長(zhǎng)度。
  9. 引入?yún)?shù)對(duì)象
    某些參數(shù)總是很自然地同時(shí)出現(xiàn),這時(shí),可以用一個(gè)對(duì)象取代這些參數(shù)。
  10. 移除設(shè)值函數(shù)
    • 類中的某個(gè)字段應(yīng)該在對(duì)象創(chuàng)建時(shí)被設(shè)值,然后就不再改變。這樣的字段應(yīng)該去掉其對(duì)應(yīng)的設(shè)值函數(shù)。
    • 如果你為某個(gè)字段提供了設(shè)值函數(shù),這就暗示這個(gè)字段值可以被改變。如果你不希望在對(duì)象創(chuàng)建之后此字段還有機(jī)會(huì)被改變,那就不要為它提供設(shè)值函數(shù)(同時(shí)該字段設(shè)為final)。這樣你的意圖會(huì)更加清晰,并且可以排除其值被修改的可能性——這種可能性往往是非常大的。
  11. 隱藏函數(shù)
    • 不會(huì)被其他任何類用到的函數(shù)的訪問類型應(yīng)該為private。
    • 盡可能降低所有函數(shù)的可見度。
  12. 以工廠函數(shù)取代構(gòu)造函數(shù)
    • 在派生子類的過程中以工廠函數(shù)取代類型碼。
    • 如果要根據(jù)類型來創(chuàng)建不同的對(duì)象,這些對(duì)象有共同的父類,則可以在父類中添加一個(gè)工廠函數(shù)來創(chuàng)建不同的對(duì)象。
  13. 封裝向下轉(zhuǎn)型
    如果某個(gè)函數(shù)返回的對(duì)象,需要由函數(shù)調(diào)用者執(zhí)行向下轉(zhuǎn)型,則可以將向下轉(zhuǎn)型動(dòng)作移到函數(shù)中。
  14. 以異常取代錯(cuò)誤碼
  15. 以測(cè)試取代異常

第11章 處理概括關(guān)系

  1. 字段上移

    • 如果兩個(gè)子類擁有相同的字段,則將該字段移至超類。
    • 如果這些字段是private的,你必須將超類的字段聲明為protected,這樣子類才能引用它。
  2. 將函數(shù)上移

    • 有些函數(shù)在各個(gè)子類中產(chǎn)生完全相同的結(jié)果,則將該函數(shù)移至超類。
    • 如果你使用的是一種強(qiáng)類型語言,而待提升函數(shù)又調(diào)用了一個(gè)只出現(xiàn)于子類而未出現(xiàn)于超類的函數(shù),你可以在超類中為被調(diào)用函數(shù)聲明一個(gè)抽象函數(shù)。
  3. 構(gòu)造函數(shù)本體上移
    如果在各個(gè)子類中擁有一些構(gòu)造函數(shù),并且它們的本體幾乎完全一致。那么可以在超類中新建一個(gè)構(gòu)造函數(shù),并在子類構(gòu)造函數(shù)中調(diào)用它。

  4. 函數(shù)下移
    如果超類中的某個(gè)函數(shù)只與部分(而非全部)子類有關(guān),則將這個(gè)函數(shù)移到相關(guān)的那些子類中去。

  5. 字段下移
    超類中的某個(gè)字段只被部分(而非全部)子類用到,則將這個(gè)字段移到需要它的那些子類去。

  6. 提煉子類
    如果類中的某些特性只被某些(而非全部)實(shí)例用到,則新建一個(gè)子類,將上面所說的那一部分特性移到子類中。

  7. 提煉超類
    如果兩個(gè)類有相似特性,則為這兩個(gè)類建立一個(gè)超類,將相同特性移至超類。

  8. 提煉接口
    如果某各類在不同環(huán)境下扮演截然不同的角色,使用接口就是個(gè)好主意。

  9. 折疊繼承體系
    如果超類和子類之間無太大區(qū)別,則將它們合為一體。

  10. 塑造模板函數(shù)
    你有一些子類,其中相應(yīng)的某些函數(shù)以相同的順序執(zhí)行類似的操作,但各個(gè)操作的細(xì)節(jié)上有所不同。將這些操作分別放進(jìn)獨(dú)立函數(shù)中,并保持它們都有相同的簽名,于是原函數(shù)也就變得相同了。然后將原函數(shù)上移至超類。

  11. 以委托取代繼承

  12. 以繼承取代委托

第12章 大型重構(gòu)

  1. 梳理并分解繼承體系
    • 如果某個(gè)繼承體系同時(shí)承擔(dān)兩項(xiàng)責(zé)任,則可以建立兩個(gè)繼承體系,并通過委托關(guān)系讓其中一個(gè)可以調(diào)用另一個(gè)。
    • 要指出繼承體系是否承擔(dān)了兩項(xiàng)不同的責(zé)任并不困難:如果繼承體系中的某一特定層級(jí)上的所有類,其子類名稱都以相同的形容詞開始,那么這個(gè)體系可能就是承擔(dān)著兩項(xiàng)不同的責(zé)任。
  2. 將過程化設(shè)計(jì)轉(zhuǎn)化為對(duì)象設(shè)計(jì)
  3. 將領(lǐng)域和表述/顯示分離
    某些GUI類之中包含了領(lǐng)域邏輯,將領(lǐng)域邏輯分離出來,為它們建立獨(dú)立的領(lǐng)域類。
  4. 提煉繼承體系
    如果你有某個(gè)類做了太多工作,其中一部分工作是以大量條件表達(dá)式完成的,那么可以建立繼承體系,以一個(gè)子類表示一種特殊情況。

第13章 重構(gòu),復(fù)用與現(xiàn)實(shí)

  1. 現(xiàn)實(shí)的檢驗(yàn)
  2. 為什么開發(fā)者不愿意重構(gòu)他們的程序
  3. 再論現(xiàn)實(shí)檢驗(yàn)
  4. 重構(gòu)的資源和參考資料
  5. 從重構(gòu)聯(lián)想到軟件復(fù)用和技術(shù)傳播

第14章 重構(gòu)工具

  1. 使用工具進(jìn)行重構(gòu)
  2. 重構(gòu)工具的技術(shù)標(biāo)準(zhǔn)
  3. 重構(gòu)工具的實(shí)用標(biāo)準(zhǔn)

第15章 總結(jié)

要點(diǎn)列表

  1. 如果你發(fā)現(xiàn)自己需要為程序添加一個(gè)特性,而代碼結(jié)構(gòu)使你無法很方便地達(dá)成目的,那就先重構(gòu)那個(gè)程序,使特性的添加比較容易進(jìn)行,然后再添加新特性。
  2. 重構(gòu)前,先檢查自己是否有一套可靠的測(cè)試機(jī)制。這些測(cè)試必須有自我檢驗(yàn)?zāi)芰Α?/li>
  3. 重構(gòu)技術(shù)就是以微小的步伐修改程序。如果你犯下錯(cuò)誤,很容易便可發(fā)現(xiàn)它。
  4. 任何一個(gè)傻瓜都能寫出計(jì)算機(jī)可以理解的代碼。唯有寫出人類容易理解的代碼,才是優(yōu)秀程序員。
  5. 重構(gòu)(名詞):對(duì)軟件內(nèi)部結(jié)構(gòu)的一種調(diào)整,目的是在不改變軟件可觀察行為的前提下,提高其可理解性,降低其修改成本。
  6. 重構(gòu)(動(dòng)詞):使用一系列重構(gòu)手法,在不改變軟件可觀察行為的前提下,調(diào)整其結(jié)構(gòu)。
  7. 事不過三,三則重構(gòu)
  8. 不要過早發(fā)布接口。請(qǐng)修改你的代碼所有權(quán)政策,使重構(gòu)更順暢。
  9. 當(dāng)你感覺需要撰寫注釋時(shí),請(qǐng)先嘗試重構(gòu),試著讓所有注釋都變得多余。
  10. 確保所有測(cè)試都完全自動(dòng)化,讓它們檢查自己的測(cè)試結(jié)果。
  11. 一套測(cè)試就是一個(gè)強(qiáng)大的bug偵測(cè)器,能夠大大縮減查找bug所需要的時(shí)間。
  12. 頻繁地運(yùn)行測(cè)試。每次編譯請(qǐng)把測(cè)試也考慮進(jìn)去——每天至少執(zhí)行每個(gè)測(cè)試一次。
  13. 每當(dāng)你收到bug報(bào)告,請(qǐng)先寫一個(gè)單元測(cè)試來暴露這只bug。
  14. 編寫未臻完善的測(cè)試并實(shí)際運(yùn)行,好過對(duì)完美測(cè)試的無盡等待。
  15. 考慮可能出錯(cuò)的邊界條件,把測(cè)試火力集中在那兒。
  16. 當(dāng)事情被大家認(rèn)為應(yīng)該會(huì)出錯(cuò)時(shí),別忘了檢查是否拋出了預(yù)期的異常。
  17. 不要因?yàn)闇y(cè)試無法捕捉所有bug就不寫測(cè)試,因?yàn)闇y(cè)試的確可以捕捉到大多數(shù)bug。

對(duì)于比較簡(jiǎn)單或者筆者暫時(shí)還沒有很好理解的部分,只是一筆帶過;而對(duì)于筆者在工作中遇到過相似問題的地方,則摘錄地比較詳細(xì)?!吨貥?gòu):改善代碼的既有設(shè)計(jì)》一書非常經(jīng)典,需要閱讀、實(shí)踐、再閱讀、再實(shí)踐。如果你也是一個(gè)注重代碼簡(jiǎn)潔、美觀和高效的程序員,那么這本書一定不能錯(cuò)過,深入閱讀一定能提升代碼的質(zhì)量。本文會(huì)在后續(xù)繼續(xù)更新完善,剔除簡(jiǎn)單和不常用的部分,完善和保留實(shí)用的部分。


本文作者: Sheh偉偉
本文鏈接: http://davidsheh.github.io/2016/03/03/「重構(gòu):改善代碼的既有設(shè)計(jì)」讀書筆記/
版權(quán)聲明: 本博客所有文章除特別聲明外,均采用 CC BY-NC-SA 3.0 許可協(xié)議。轉(zhuǎn)載請(qǐng)注明出處!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容