


下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、重構一、何謂重構視上下文不同,重構這個詞語有兩個不同的含義,第一個定義是名詞形 式:對軟件內部結構的一種調整,目的是在不改變軟件可觀察行為的前提下, 提升其可理解性,降低其修改本錢;第二種定義是動詞形式:使用一系列重 構手法,在不改變其可觀察行為的前提下,調整其結構.曾經有人問我:重構只是整理代碼嗎?從某種角度上說,是的.但我認 為重構不止于此,由于它提供了一系列高效且受控的代碼整理技術,自行運 用重構技術后,我發現自己對代碼的整理比以前更有效率.這是由于我知道 該使用哪些重構手法,也知道以怎樣的方式才能使用他們將錯誤降到最少, 而且在每一個可能出錯的地方,我都加以重構.我們的定義還需要向兩方
2、面擴展,首先重構的目的是使軟件更容易理解 和修改,你可以在軟件的內部做很多修改,但是必須對軟件可觀察的外部行 為只造成很小的變化,甚至不造成變化,與之相對應的是性能優化,和重構 一樣,性能優化通常不改變組件的行為除了執行速度,只會改變其內部 結構,但是出發點不同,性能優化往往使代碼更加難理解,但為了得到所需 要的性能,你不得不這樣做.二、為何重構1、重構改良軟件設計,如果沒有重構,程序的設計會逐漸腐爛變質, 程序將逐漸失去自己的結構,程序員愈來愈難通過閱讀代碼理解原來的設計, 經常性的重構可以幫助代碼位置自己該有的狀態.完成同一樣事情,設計不良的程序往往需要修改更多的代碼,這常常是 由于在不同
3、的地方,使用完全相同的語句做同樣的事情,因此改良設計的一 個重要方向就是消除重復代碼.代碼越多正確的修改越困難,你在這里做點 修改,系統卻沒有像預期那樣工作,由于你沒有修改另一處一一那的代碼做 著幾乎完全一樣的事情.如果消除重復代碼,你就可以確定所有的事物和行 為在代碼中只表述一次,這是優秀設計的根本.2、重構是代碼更容易理解,一開始重構時,你得代碼可以正常運行, 但結構不理想,在重構上花一點點時間,就可以讓代碼更好的表達自己的用 途,這種編程模式的核心是準確的說出我想要的.3、重構幫助找到Bug.4、重構幫助提升編程速度.聽起來優點違反直覺,當我們談到重構, 人們很容易能夠看出它能提升質量,
4、改善設計,提升可讀性,減少錯誤,這 都能提升質量,但這難道不會降低開發速度嗎?我絕對相信:良好的設計使快速開發的根本,事實上,有良好的設計, 才可能做到快速開發,如果沒有良好的設計,或許某一段時間你得進展迅速, 但惡略的設計很快就會使你慢下來.你會把時間花在調試上面,無法添加新 功能,修改時間越來越長,由于你必須花越來越多的時間理解系統,尋找重 復代碼.真是一個惡性循環.三、何時重構幾乎在任何情況下,我都反對專門撥出時間進行重構,重構應該隨時隨 地進行,你不應該為重構而重構,你之所以重構,是由于你想做別的事情, 而重構能幫你做的更好,下邊來看重構的三次法那么.三次法那么:第一次做某件事時,只管
5、去做,第二次做類似的事情,你會 產生反感,但無論如何還是可以去做,第三次再做類似的事情,你就應該重 構.簡言之,事不過三,三那么重構.1、添加功能時重構:最常見的重構時機就是在添加新特性時,你會問 問自己,是否能對這段代碼進行重構,使你更快的理解它,如果在前進的過 程中,能夠把代碼的結構理清,這就不失為一個好時機;重構的另一個原動 力是代碼的設計無法幫助我輕松的添加我所需要的特性,我看著設計,然后 對自己說,如果這樣這樣設計,添加特性就會簡單許多,這種情況下,你就 可以拿起重構這把工具了.2、修補錯誤時重構:調試過程中運用重構,多半是為了讓代碼更具可 讀性,當我看著代碼并努力理解它的時候,我用
6、重構加深我的理解.3、代碼復審時重構:好多公司都會做代碼復審,由于這種活動可以改 善開發狀況,重構可以幫助我復審別人的代碼,重構還可以幫助代碼復審工 作得到更具體的結果.過去的經驗告訴我:1:難以閱讀的程序,難以修改.2:邏輯重復的程序,難以修改.3:添加新行為時需要修改已有代碼的程序,難以修改.4:帶復雜條件邏輯的程序難以修改.因此,我們希望程序 1、容易閱讀.2、所有邏輯都在唯一地點指定.3、新的改動不會危及現有行為.4、盡可能簡單的表達條件邏輯.四、該怎么跟經理說重構的事兒如果這位經理懂技術,那么向他介紹重構,應該不會很困難,如果這位 經理只對質量感興趣,那么問題就集中到了質量上邊,在復
7、審過程中使用重 構就是一個不錯的方法.當然很多經理嘴巴上說是質量驅動,其實更多是進度驅動,這種情況下, 我會給他們一個比擬有爭議的建議:不要告訴經理.這是在搞破壞嗎?我不這樣想,軟件開發者都是專業人士.我們的工作 就是盡可能快速創造出高效軟件.我的經驗告訴我,對于快速創造軟件,重 構可帶來巨大幫助.如果需要添加新功能,而原本設計又使我無法方便的修 改,我發現先重構再添加新功能會更快些.如果要修補錯誤,就得先理解軟 件的工作方式,而我發現重構是理解軟件的最快方式.受進度驅使的經理要 我盡可能快速完事兒,至于怎么完成,那就是我的事兒了.我認為最快的方 式就是重構,所以我就重構.五、重構的難題學習一
8、種大幅提升生產力的新技術時,你總是難以發覺其不適用的場合, 通常你在一個特定場景中學習它,這個場景往往是個工程,這種情況下你很 難看出什么會造成這種新技術成效不彰或形成危害.所以重構的同時,你應 該監控其過程,注意尋找重構引入的問題,隨著對重構的了解日益增多,我 們將找出更多解決方法,并清楚知道哪些問題是真正難以解決的.六、何時不該重構有時候你根本不該重構,例如當你重新編寫所有代碼時,有時候既然代 碼寫的太混亂,重構它還不如重新寫一個來的簡單,作這種決定很困難,我 成認我也沒有什么好準那么可以判斷何時該放棄重構.重寫的一個清楚訊號是現有代碼根本不能正常運行,你可能只是試著做 點測試,然后就發現
9、代碼中滿是錯誤,根本無法穩定運行,記住,重構之前, 代碼必須能夠在大多數情況下正常運行.如何重構一、重復代碼如果你在一個以上的地點看到相同的程序結構,那么可以肯定,設法把 它們合二為一,程序會變得更好.最單純的就是同一個類的兩個函數含有相同的表達式,這時你需要做的 的是提煉出重復的代碼,然后讓這兩個地點都調用被提煉出來的那一段代碼.另一種情況就是“兩個互為兄弟的子類中含有相同的表達式,要防止 這種情況,只需要對兩個類提煉出重復的代碼然后推到父類中去.如果代碼 只是類似,并非完全相同,那么就用提煉函數的方法把相似局部和差異局部 隔離開,構成單獨函數,然后你可以運用模板方法的設計模式來實現其結構.
10、如果兩個毫不相關的類出現重復代碼,你應該考慮提煉一個新類,將重 復代碼放到這個新類中去,然后在別的類里使用這個新類.二、過長函數擁有短函數的對象會活的比擬好,比擬長,不熟悉面向對象技術的人, 常常覺得對象程序中只有無窮無盡的委托,根本沒有進行任何計算.和此類 程序共同生活數年之后,你才會知道這些小小函數有多大價值.間接層所能 帶來的全部利益-解釋水平,共享水平,選擇水平,都是由小函數支持的.很早以前程序員就熟悉到,程序越長越難理解,所以應該積極的分解函 數,我們可以遵循這樣一條準那么:每當我們覺得需要注釋來說明點什么的時 候,我們就可以把需要說明的東西寫到一個獨立的函數中去,并以其用途命 名,
11、我們可以對一組甚至短短一行代碼做這樣的事情,哪怕函數替換后的調 用動作比函數自身還長,只要函數名稱能解釋其用途,我們也該毫不猶豫的 這麼做.百分之九十九的場合里,我們只需要把函數變小,然后提煉出新的函數 就行了,如果函數中含有大量的參數和臨時變量,它們會對你的函數提煉形 成阻礙,如果我們把參數和臨時變量當成參數,傳遞給新提煉出來的函數, 導致可讀性幾乎沒有任何提升,這時我們要想方法消除這些臨時元素,讓過 長的參數列變得簡潔一些.三、過大的類如果想用單個類做太多的事情,其內往往就會出現太多實例變量,一旦 如此,你得代碼就需要重構了.你可以把幾個彼此相關的變量一起提煉到一個新類中,和太多“實例變
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 財務會計學財務報表分析知識考點
- 酒店與旅游服務合作協議
- ××超市經理崗位辦法
- 表達對家鄉的思念之情的抒情作文10篇
- 我的家鄉美景寫真實感人作文4篇
- 農村畜牧養殖防疫保障協議
- 2025年石英纖維及制品項目提案報告
- 社團組織參與及職務證明(8篇)
- 2025年小學教師資格考試《綜合素質》教育資源整合與教育研究試題試卷
- 分析當前酒店業面臨的環保挑戰
- 國開(山東)地域文化(本)形成性考核1-3答案
- 厚皮甜瓜設施栽培技術規程
- 駐足思考瞬間整理思路并有力表達完整版
- 成都市青羊區2023年數學四下期末教學質量檢測試題含解析
- TSGR0003-2023年《簡單壓力容器安全技術監察規程》
- 2023年山東濟南市婦幼保健院招考聘用勞務派遣人員筆試題庫含答案解析
- 2023年考研英語大綱樣題
- 廣州市預拌混凝土企業名單及分布圖
- 駕照體檢表通用
- 【企業薪酬管理研究國內外文獻綜述4400字】
- 2023年新改版蘇教版五年級下冊科學全冊精編知識點(附問答題總結)
評論
0/150
提交評論