重構(gòu)三部曲(一):思想準(zhǔn)備篇

一、概述

重構(gòu)三部曲為:思想準(zhǔn)備,單元測試,重構(gòu)

  • 思想準(zhǔn)備的目的是明確:為什么要重構(gòu),重構(gòu)的理論支撐是什么
  • 單元測試:重構(gòu)依托于良好的測試,單元測試是保證重構(gòu)順利進(jìn)行的神兵利器
  • 重構(gòu):依照《重構(gòu)》中的重構(gòu)技巧進(jìn)行實戰(zhàn)

本文主要是摘錄自《重構(gòu) 改善既有代碼設(shè)計》的原話,有一部分是個人對原文的個人理解。

重構(gòu)的思想并不是只適用于重構(gòu),也適用于開發(fā)過程中的代碼編寫,兩者的目的都是寫出良好的代碼。

光知道還不夠,還必須付諸應(yīng)用;光有決心還不夠,還必須行動

二、代碼需要意圖明顯

  • 重構(gòu)的定義:在不改變軟件可觀察行為的前提下改善其內(nèi)部結(jié)構(gòu)。
  • 重構(gòu)的意義在于:你永遠(yuǎn)不必說對不起--只要把出問題的地方修補好就行了。(“封裝”不可能永遠(yuǎn)都是適用的,可能過一段時間之前很完美的封裝就會顯得很“臃腫”了)
  • 你的代碼首先是為人寫的,其次才是為計算機寫的,寫出人類容易理解的代碼
  • “封裝”意味著每個對象都應(yīng)該盡可能少了解系統(tǒng)的其他部分
  • 關(guān)鍵不在于函數(shù)的長度,而在于函數(shù)“做什么”和“如何做”之間的語義距離
    • 代碼用途和實現(xiàn)手法之間的語義距離
    • 意圖要明確,明確說出我所需要的。
    • 提高代碼的可理解性,降低其修改成本
    • 避免“代碼傳達(dá)的信息與你的意圖南轅北轍”
  • 需要為代碼編寫文檔意味著代碼本身寫的不好
  • 函數(shù)的名稱應(yīng)該準(zhǔn)確表達(dá)它的用途
  • 好的代碼,更有利于性能的優(yōu)化(不要因為性能而犧牲代碼的清晰性)

三、重構(gòu)要小步前進(jìn)

  • 重構(gòu)依托于良好的單元測試。
    • “重構(gòu)需要一組可靠的測試環(huán)境”
    • 測試應(yīng)該是一種風(fēng)險驅(qū)動行為
  • 一定要快速前進(jìn),快速失敗并更正,然后再重復(fù)
    • 重構(gòu)應(yīng)該小步前進(jìn),比如修改一個局部變量或者提煉一個函數(shù)
    • 每一步出現(xiàn)異常都應(yīng)該回滾上個版本,保證輸出不變
  • 設(shè)計模式為重構(gòu)提供了目標(biāo)
  • 你之所以進(jìn)行重構(gòu),必定是為了達(dá)到某個目的,而不僅僅是為了看起來有所動作
  • 大型重構(gòu)耗費是假長,在這個過程中,你應(yīng)該根據(jù)需要安排自己的工作,只在需要添加新功能或修補錯誤時擦進(jìn)行重構(gòu)。重構(gòu)程度只要能滿足其他任務(wù)的需要就行了
  • 應(yīng)對并處理變化,是軟件開發(fā)的根本復(fù)雜性之一
  • 重構(gòu)時不應(yīng)該有任何添加功能的操作,重構(gòu)是對已有功能的操作,必須保證軟件可觀察方式(輸出)是不變的。
  • 哪怕你完全了解系統(tǒng),也請實際度量它的性能,不要臆測。臆測會讓你學(xué)到一些東西,但十有八九你是錯的。
  • 你必須培養(yǎng)出自己的判斷力。
  • 問題發(fā)現(xiàn)的越早,為修復(fù)而付出的代價越低。

四、重構(gòu)方法的一些摘錄

  • 一個類應(yīng)該是一個清楚的抽象,處理一些明確的責(zé)任
    • 決定把責(zé)任放在哪兒
    • 分解類所負(fù)的責(zé)任,分解出新類的舊類如果責(zé)任與名稱不符,進(jìn)行更名
  • 間接性可能帶來幫助,但非必要的間接性總是讓人不舒服
  • 觀察類應(yīng)該做的所有事情,然后針對任何一項功能的任何一種可能失敗情況
  • 增加子類的目的,是為了增加新特性或變化其行為
  • 如果某個類在不同環(huán)境下扮演截然不同的角色,使用接口就是個好主意
  • 絕大多數(shù)情況下,函數(shù)應(yīng)該放在它所使用的數(shù)據(jù)的所屬對象內(nèi)
  • 將復(fù)雜的處理過程分解成小函數(shù)
    • 先搬離低層函數(shù),再搬離高層函數(shù)
    • 將查詢函數(shù)和修改函數(shù)分離
  • 所謂重構(gòu)繼承體系,往往是將函數(shù)和字段在體系上下移動
  • 如果你手上沒有所需的東西,總可以叫另一個對象給你
  • 在分布式軟件中,函數(shù)的往返必須被減至最低限度
  • 任何有返回值的函數(shù),都不應(yīng)該有看得到的副作用
  • 所有的數(shù)據(jù)都應(yīng)該隱藏起來
    • 數(shù)據(jù)隱藏,你絕不應(yīng)該將數(shù)據(jù)聲明為public
    • 啞數(shù)據(jù)對象--除數(shù)據(jù)訪問函數(shù)外,沒有其它任何函數(shù)
  • 程序當(dāng)中,復(fù)雜的條件邏輯是最常導(dǎo)致復(fù)雜度上升的地點之一
    • ”分支邏輯“和”操作細(xì)節(jié)“分開
  • 加入斷言,永遠(yuǎn)不會影響程序的行為。
    • 不要濫用斷言
    • 更多的時候,斷言的價值在于:幫助程序員理解代碼正確運行的必要條件
  • 過長的參數(shù)列總是難以理解的
    • 如果有必要,將參數(shù)的計算過程提煉到一個獨立函數(shù)中
    • 應(yīng)該只在必要關(guān)頭才添加參數(shù),預(yù)先添加的參數(shù)很可能并不是你所需要的。
  • 重復(fù)代碼是系統(tǒng)中最糟糕的東西之一
    • 避免行為重復(fù),因為這容易導(dǎo)致 ”修改一個卻未能修改另一個“的風(fēng)險
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 多少人向往云南 因為云南的真實 不去大理麗江 才是真正的到過云南 云南的云是實質(zhì)的 可以摸得到 軟軟涼涼的 就像穿...
    貓身人面獸心閱讀 398評論 0 3
  • 我現(xiàn)在深深懷疑自己到底讀研正不正確,連著幾天被老爸說的,沒忍住,掛了電話哭了一會,好久沒有哭過了。最近做課題的壓力...
    delmemory閱讀 174評論 0 0
  • 在我們留意的那個人離去之后,一切都放松了,有那么一瞬間,我好像看到了你,我知道那只是錯覺,發(fā)著傷感的說說,講著唯美...
    mangsan閱讀 486評論 0 0
  • 當(dāng)我發(fā)現(xiàn)自己沒有辦法在走路的時候,把所有的注意力都只集中在身上,我感到很沮喪。我只能把眼睛閉上,雙手捂住耳朵,比之...
    漫步的咖啡閱讀 389評論 0 0
  • 今天在開車回家的路上 想到了彈幕。這真是一個很好的創(chuàng)造!當(dāng)我們看電影看電視劇看綜藝節(jié)目時 都可以打開彈幕 用眼鏡的...
    我是忙碌的小叮當(dāng)閱讀 378評論 0 3

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