一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Refresh 重構(gòu)(Refactor)

 行者花雕 2022-01-23

最近在閑暇之余重(第)溫(一..次)此書, 首先能感受到的, 無論你是新程序員還是老程序員, 這本書都已經(jīng)不具備太多的可讀性了.

由于本書成書年代久遠(yuǎn), 那個時候軟件行業(yè)還不夠發(fā)達(dá), 面向?qū)ο筮€沒有被大數(shù)人理解, 加之編譯器也非常落后, 設(shè)計模式也不深入人心, 所以文中提供的所謂重構(gòu)的心法, 在當(dāng)時或許有一些意義. 而今看來, 整書400多頁的文字, 主要的思想就是「抽」, 無論是類, 接口, 方法, 邏輯, 還是參數(shù). 但是為什么會有這么大的篇幅, 其中一半的內(nèi)容是教你如何在一個IDE功能匱乏的年代, 以一個出錯率更低的順序, 來進(jìn)行上面所說的多種抽象操作.

當(dāng)然我去除了大量書中已經(jīng)沒有任何價值的點(diǎn)后, 總結(jié)了如下的一些內(nèi)容, 應(yīng)該大多數(shù)大家已經(jīng)在工作實踐中已有體會, 主要還是總結(jié)一下, 溫故知新吧.

  • 思想方面
    • 如果發(fā)現(xiàn)加特性很難, 就需要重構(gòu)
    • 重構(gòu)前需要想想有沒有可靠的測試機(jī)制
    • 重構(gòu)要微小步伐, 容易發(fā)現(xiàn)錯誤
    • Extract method是最簡單的重構(gòu)
    • 寫出機(jī)器認(rèn)識的代碼容易, 寫出人類容易理解的才是應(yīng)該的, 最大的影響就是命名
    • 做移動重構(gòu)時, 最好先復(fù)制粘貼, 測后再刪除舊的代碼
    • 對于另外對象的switch往往可以通過繼承, 多態(tài)來取代
    • 三次遇到不合理的, 可能就是重構(gòu)的時候了
    • 重構(gòu)往往通過加隔離層進(jìn)行
    • 不要過早發(fā)布接口
    • 性能優(yōu)化應(yīng)該基于良好的代碼結(jié)構(gòu), 性能瓶頸往往只會在很小的代碼片段里
    • 每次遇到一個bug, 盡量寫個單元測試覆蓋
    • 測試集中覆蓋邊緣case
  • 代碼壞味道與手段
    • 重復(fù)代碼
      • 抽方法
    • 大函數(shù)
      • 抽方法, 抽類
    • 大類
      • 抽類, 抽子類
    • 太多參數(shù)
      • 參數(shù)變方法, 抽參數(shù)對象
    • 加新功能修改多個函數(shù)
      • 抽子類
    • 加新功能需要改很多類
      • 挪方法, 挪成員
    • 函數(shù)過度依賴其他類
      • 挪方法, 抽方法
    • 同樣的幾個參數(shù)到處出現(xiàn)
      • 抽參數(shù)對象
    • 大量同樣的基本類型做參數(shù)
      • 抽類, 不同表達(dá)式可抽進(jìn)子類
    • 很多switch
      • 考慮用多態(tài)取代
    • 子類需平行同時添加
      • 先持有對方, 再挪方法, 再挪變量, 再合并
    • 沒人用的類
      • 做內(nèi)部類
    • 沒太大用處的抽象, 參數(shù), 命名
      • 刪除, 重命名, 內(nèi)聯(lián)
    • 臨時變量命名模糊
      • 抽方法, 抽類
    • 消息鏈過長, 對象轉(zhuǎn)換過多
      • 對同一對象的使用抽方法, 推入消息鏈消除對象
    • 過度代理
      • 內(nèi)聯(lián)代理
    • 注釋太多
      • 可能代碼寫的太難懂, 需要重構(gòu)
  • 數(shù)據(jù)
    • 臨時變量被賦值多次, 則可以抽成方法
    • 有時候需要提取多個臨時變量對邏輯進(jìn)行解釋, 當(dāng)然更好的可以再抽成方法
    • Java按值傳遞, 本質(zhì)上是對象的引用按值傳遞
    • 移除中間人與隱藏委托是相輔相成的
    • 如果類無法更改, 就寫個函數(shù)包裝他, 類似于工廠方法?
    • 如果不能修改, Adapter模式常常用于擴(kuò)展方法功能
    • 子類修改某些變量的獲取可以通過自封裝, 把變量抽象成函數(shù)
    • 成員如果不用改變, 就由引用變?yōu)橹祵ο? 即immutable對象
    • 當(dāng)業(yè)務(wù)復(fù)雜度變高需要將類之間單向關(guān)系改為雙向綁定關(guān)系, 甚至一對多與多對一的關(guān)系
    • 雙向綁定可能會造成很多僵尸對象, 增加復(fù)雜度與空間占用, 所以只有真正需要的時候用, 刪除可以通過將內(nèi)部綁定查詢轉(zhuǎn)移為傳參, 再在調(diào)用的位置進(jìn)行判斷是否為僵尸對象
    • 不要使用Magic Number, 常量即可以優(yōu)化儲存, 又可讀性高
    • 封裝字段可以控制字段的讀寫, 稱之為數(shù)據(jù)隱藏
    • 對于返回集合的函數(shù)需要返回只讀副本, 如果需要修改, 則可另行提供修改方法
    • 原始類型替換成類, 有類型字段的類轉(zhuǎn)換為多個子類, 或者抽象成策略模式, 從而合理改變數(shù)據(jù)結(jié)構(gòu)
    • 如果子類只有常量, 可以抽成變量放父類, 再添加工廠方法創(chuàng)建, 降低復(fù)雜度
  • 條件表達(dá)式
    • 條件表達(dá)式很復(fù)雜的時候, 可以將條件, 執(zhí)行代碼進(jìn)行封裝, 更表意
    • 嵌套很深的條件表達(dá)式的每個結(jié)果都作為返回值的話, 可以簡化為多個if+return, 類似于swift里面的guard, 或者kotlin里面的?:return, 書里叫衛(wèi)語句(Guard Clauses)
    • 嵌套很深的條件表達(dá)式可以將范圍大的if反向, 實現(xiàn)提前return
    • switch表達(dá)式有時候可以通過多態(tài)來取代
  • 函數(shù)調(diào)用
    • 函數(shù)最好讀寫分離
    • 抽象重復(fù)性的函數(shù)用以復(fù)用
    • switch構(gòu)造可以替換成工廠方法
    • 從對象內(nèi)拿出參數(shù)再傳遞給某函數(shù)不如直接將對象傳入函數(shù)
    • 當(dāng)函數(shù)的參數(shù)來自另外一個函數(shù)時, 也可以刪掉參數(shù), 把函數(shù)調(diào)用挪進(jìn)去
    • 函數(shù)參數(shù)過多可以同對象替代
    • 如果不需要設(shè)置就不要提供set方法, 變量都需要為final
    • 有時候用拋異常替代返回錯誤碼, 如果程序無法繼續(xù)進(jìn)行的話
    • 如果可以條件邏輯避免Runtime異常, 應(yīng)不要無腦try/catch
  • 繼承關(guān)系
    • 子類同樣的方法應(yīng)該向上提, 并將不同的地方抽象為抽象方法分別繼承
    • 子類構(gòu)造復(fù)制父類字段應(yīng)該通過父類構(gòu)造, super
    • 超類與子類差不多, 就合并
    • 邏輯相同, 類型不同可以通過模板函數(shù), 模板類解決
    • 不能濫用繼承, 組合代理好過繼承, 但也有特殊, 如果需要使用委托函數(shù)所有函數(shù)或者大量, 則就需要繼承, 不過這一點(diǎn)在kotlin里面也可以通過by來代理
  • 復(fù)雜的重構(gòu)
    • 整理復(fù)雜的繼承關(guān)系, 該抽接口抽接口, 摘出更多深層子類
    • 領(lǐng)域與表述分離, 就是UI與邏輯分離
    • 過程抽象為對象
    • 提煉繼承體系

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产成人人人97超碰熟女| 美国欧洲日本韩国二本道| 久久久免费精品人妻一区二区三区| 午夜精品一区二区三区国产| 五月情婷婷综合激情综合狠狠 | 日韩欧美综合在线播放| 亚洲高清亚洲欧美一区二区| 亚洲高清中文字幕一区二区三区| 东京热一二三区在线免| 亚洲精选91福利在线观看| 精品久久久一区二区三| 国产精品第一香蕉视频| 久久久免费精品人妻一区二区三区 | 欧美一区二区三区性视频 | 福利新区一区二区人口| 欧美av人人妻av人人爽蜜桃| 欧美激情区一区二区三区| 亚洲欧美日韩网友自拍| 日韩av亚洲一区二区三区| 日韩欧美一区二区久久婷婷| 亚洲中文字幕综合网在线| 午夜小视频成人免费看| 亚洲国产成人爱av在线播放下载| 欧美日韩在线第一页日韩| 久久精品福利在线观看| 国产一二三区不卡视频| 空之色水之色在线播放| 亚洲精品国产美女久久久99| 成人午夜视频精品一区| 国产精品白丝久久av| 亚洲欧美日韩网友自拍| 亚洲成人精品免费在线观看| 91麻豆视频国产一区二区| 丰满少妇被粗大猛烈进出视频| 欧美成人一区二区三区在线 | 亚洲欧美日韩网友自拍| 欧美成人黄色一区二区三区| 高清欧美大片免费在线观看| 精品推荐久久久国产av| 午夜视频免费观看成人| 国产在线观看不卡一区二区 |