版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、 重構(gòu)重構(gòu)-改善既有代碼的設(shè)計(jì)-羅書赟2011年3月10日目錄目錄u重構(gòu)是對軟件內(nèi)部結(jié)構(gòu)的一種調(diào)整,目的是在不改變外部行為的前提下,提高可理解性,降低修改成本。u重構(gòu)是嚴(yán)謹(jǐn)、有序地對完成的代碼進(jìn)行整理從而減少出錯的一種方法。什么是重構(gòu)?重構(gòu)概述重構(gòu)概述重構(gòu)概述重構(gòu)概述 利用重構(gòu)技術(shù)開發(fā)軟件時會把時間分配給兩種行為: 重重 構(gòu)構(gòu)與與添加新功能添加新功能u 添加新功能時,不應(yīng)該修改既有代碼,只管添加 新功能。 u 重構(gòu)時你就不能再添加功能,只管改進(jìn)程序結(jié)構(gòu)。u 兩頂“帽子”可交替進(jìn)行,一會重構(gòu),一會添加 新功能。 兩頂帽子重構(gòu)概述重構(gòu)概述u 改進(jìn)程序設(shè)計(jì)改進(jìn)程序設(shè)計(jì) 程序員為了快速完成任務(wù),在沒有
2、完全理解整體 架構(gòu)之前就修改代碼,導(dǎo)致程序逐漸失去自己的結(jié)構(gòu)。重構(gòu)則幫助重新組織代碼,重新清晰的體現(xiàn)程序結(jié)構(gòu)和進(jìn)一步改進(jìn)設(shè)計(jì)。u 提高程序可讀性提高程序可讀性 容易理解的代碼很容易維護(hù)和增加新功能。代碼首先是寫給人看的,然后才是計(jì)算機(jī)看的。 為何重構(gòu)?重構(gòu)概述重構(gòu)概述u 助你找到程序錯誤助你找到程序錯誤 重構(gòu)是一個Code Review 和反饋的過程。在另 一個時段重新審視代碼,會容易發(fā)現(xiàn)問題和加深對代碼的理解。u 助你提高編程速度助你提高編程速度 設(shè)計(jì)和代碼的改進(jìn)都可以提高開發(fā)效率,好的設(shè)計(jì)和代碼都提高開發(fā)效率的根本。u 提高設(shè)計(jì)和編碼水平提高設(shè)計(jì)和編碼水平 對代碼的重構(gòu),是快速提高設(shè)計(jì)和編
3、碼水平的方法。 為何重構(gòu)?重構(gòu)概述重構(gòu)概述u 增加新功能時一并重構(gòu)增加新功能時一并重構(gòu) 增加功能前需要理解修改的代碼,如果發(fā)現(xiàn)代碼不易理解且無法輕松增加功能,此時就需要對代碼進(jìn)行重構(gòu)。u 修補(bǔ)錯誤時一并重構(gòu)修補(bǔ)錯誤時一并重構(gòu) 通過重構(gòu)改善代碼結(jié)構(gòu),能夠幫助你找出BUG原因。u Review 代碼時一并重構(gòu)代碼時一并重構(gòu) 有經(jīng)驗(yàn)的開發(fā)人員Review代碼時能夠提出一些代碼重構(gòu)的建議。 何時重構(gòu)?重構(gòu)概述重構(gòu)概述u 代碼實(shí)在太混亂,重構(gòu)還不如重寫代碼實(shí)在太混亂,重構(gòu)還不如重寫u 項(xiàng)目即將結(jié)束時避免重構(gòu)項(xiàng)目即將結(jié)束時避免重構(gòu) 此時已經(jīng)沒有時間進(jìn)行重構(gòu)了,應(yīng)該在早些時候進(jìn)行重構(gòu)。如果程序有必要重構(gòu),說
4、明該項(xiàng)目已經(jīng)欠下“債務(wù)”,需要項(xiàng)目完成后進(jìn)行償還。 何時不該重構(gòu)?重構(gòu)概述重構(gòu)概述u 重構(gòu)與設(shè)計(jì)彼此互補(bǔ)重構(gòu)與設(shè)計(jì)彼此互補(bǔ) 良好的設(shè)計(jì)是重構(gòu)的目標(biāo),重構(gòu)彌補(bǔ)設(shè)計(jì)的不足。u 重構(gòu)使得設(shè)計(jì)方案更簡單重構(gòu)使得設(shè)計(jì)方案更簡單 如果選擇重構(gòu),預(yù)先設(shè)計(jì)時候只需找出足夠合理的解決方案,實(shí)現(xiàn)的時候?qū)栴}會進(jìn)一步加深,此時可以重構(gòu)成最佳的解決方案。u 重構(gòu)能夠避免過度設(shè)計(jì)重構(gòu)能夠避免過度設(shè)計(jì) 設(shè)計(jì)人員需要考慮將簡單方案重構(gòu)成靈活方案的難度。如果容易,只需實(shí)現(xiàn)簡單方案。 重構(gòu)與設(shè)計(jì)重復(fù)的代碼重復(fù)的代碼 (Duplicated Code) 重復(fù)代碼是最常見的異味,往往是由于Copy & Paste 造成的。 重構(gòu)方
5、法重構(gòu)方法:u 重復(fù)代碼在同一個類中的不同方法中,則直接提煉為一個方法u 如果重復(fù)代碼在兩個互為兄弟的子類中,則將重復(fù)的代碼提到父類中u 如果代碼類似,則將相同部分構(gòu)成單獨(dú)函數(shù),或者用 Template Method 設(shè)計(jì)模式 代碼的壞味道代碼的壞味道表示壞味道指數(shù)代碼的壞味道代碼的壞味道u 重復(fù)代碼出現(xiàn)在不相干的類中,則將代碼提煉成函數(shù)或者放在獨(dú)立的類中 代碼的壞味道代碼的壞味道 過長的函數(shù)過長的函數(shù)(Long Method) 是面向結(jié)構(gòu)程序開發(fā)帶來的 “后遺癥”,過長的函數(shù)降低可讀性。 重構(gòu)方法重構(gòu)方法:u 將獨(dú)立的功能提煉成新函數(shù)3. 過大類過大類(Large Class) 過大的類使得
6、責(zé)任不清晰。 重構(gòu)方法u 將過大類的功能拆分成多個功能單一的小類 代碼的壞味道代碼的壞味道4. 過長的參數(shù)列過長的參數(shù)列(Long Parameter List) 過過長的參數(shù)列難以理解,而且容易傳錯參數(shù)。 重構(gòu)方法重構(gòu)方法:u 將參數(shù)列表用參數(shù)對象替換代碼的壞味道代碼的壞味道5. 發(fā)散式變化發(fā)散式變化(Divergent Change) 一個類由于不同的原因而被修改。 重構(gòu)方法重構(gòu)方法:u 將類拆分成多個,每個類只因?yàn)橐环N變化而修改 發(fā)散式變化實(shí)例發(fā)散式變化實(shí)例代碼的壞味道代碼的壞味道包含多種證券的業(yè)務(wù)邏輯將業(yè)務(wù)邏輯放到證券類中代碼的壞味道代碼的壞味道6. 霰彈式修改霰彈式修改(Shotgu
7、n Surgery) 與發(fā)散式變化相反,遇到變化時需要修改許多不同的類。 重構(gòu)方法重構(gòu)方法:u 將類似的功能放到一個類中 霰彈式修改實(shí)例霰彈式修改實(shí)例代碼的壞味道代碼的壞味道計(jì)算邏輯分散在各個類中計(jì)算邏輯放到股指期貨類中代碼的壞味道代碼的壞味道7. 依戀情結(jié)依戀情結(jié)(Feature Envy) 函數(shù)對某個類的興趣高過對自己所處的類,通常是為了取其他類中的數(shù)據(jù)。 重構(gòu)方法重構(gòu)方法:u 將函數(shù)部分功能移到它感興趣的類中8. 數(shù)據(jù)泥團(tuán)數(shù)據(jù)泥團(tuán)(Data Clumps) 在多個地方看到相同的數(shù)據(jù)項(xiàng)。例如: 多個類中相同的變量,多個函數(shù)中相同的參數(shù)列表,并且這些數(shù)據(jù)總是一起出現(xiàn)。 重構(gòu)方法重構(gòu)方法:u
8、將這些數(shù)據(jù)項(xiàng)放到獨(dú)立的類中 代碼的壞味道代碼的壞味道9. 分支語句分支語句(Swtich Statements) 大量的分支、條件語句導(dǎo)致過長的函數(shù),并且可讀性差。 重構(gòu)方法重構(gòu)方法:u 應(yīng)將它變成子類或者使用 State和 Strategy模式 分支語句實(shí)例分支語句實(shí)例代碼的壞味道代碼的壞味道抽象接口,只與接口交互if語句太多,結(jié)構(gòu)不清晰代碼的壞味道代碼的壞味道10. 過度耦合的消息鏈過度耦合的消息鏈(Message Chains) 一個對象請求另一個對象,后者又請求另外的對象,然后繼續(xù)。,形成耦合的消息鏈。 重構(gòu)方法:重構(gòu)方法:u 公布委托對象供調(diào)用 代碼的壞味道代碼的壞味道11. 過多的
9、注釋過多的注釋(Comments) 代碼有著長長的注釋,但注釋之所以多是因?yàn)榇a很糟糕。 重構(gòu)方法:重構(gòu)方法:u 先重構(gòu)代碼,再寫上必要的注釋12. 夸夸其談未來性夸夸其談未來性(Speculative Generality) 現(xiàn)在用不到,覺得未來可以用到的代碼,要警惕。 重構(gòu)方法:重構(gòu)方法:u 將用不上的代碼去掉 代碼的壞味道代碼的壞味道13. 純粹的數(shù)據(jù)類純粹的數(shù)據(jù)類(Data Class) 將數(shù)據(jù)類中數(shù)據(jù)以Public方式公布,沒對數(shù)據(jù)訪問進(jìn)行保護(hù)。 重構(gòu)方法:重構(gòu)方法:u 將數(shù)據(jù)封裝起來,提供Get/Set方法 以上是代碼開發(fā)和程序維護(hù)過程中經(jīng)常遇到的問題,并不是壞味道的全部。在開發(fā)中
10、應(yīng)避免出現(xiàn)壞味道。 重構(gòu)名錄重構(gòu)名錄 在 Martin Fowler 著的重構(gòu)重構(gòu) 改善既有代碼改善既有代碼的設(shè)計(jì)的設(shè)計(jì)中列出了長達(dá)70條的重構(gòu)名錄,提供了具體重構(gòu)的方法和重構(gòu)的技巧。將幫助開發(fā)人員一次一小步地修改代碼,減少了開發(fā)過程中的風(fēng)險。 1、提煉函數(shù)提煉函數(shù) (Extract Methods)重構(gòu)名錄重構(gòu)名錄String name = request.getParameter(Name);if( name != null & name.length() 0 ).String age = request.getParameter(Age);if( age != null & age.le
11、ngth() 0 ).String name = request.getParameter(Name);if( !isNullOrEmpty( name ) ).String age = request.getParameter(Age);if( !isNullOrEmpty( age ) ).private boolean isNullOrEmpty( final String string )if( string != null & string.length() 0 )return true;elsereturn false;重構(gòu)名錄實(shí)例重構(gòu)名錄實(shí)例 將代碼段放入函數(shù)中,讓函數(shù)名稱解釋該
12、函數(shù)的用途 2、將函數(shù)內(nèi)聯(lián)化將函數(shù)內(nèi)聯(lián)化 (Inline Method)重構(gòu)名錄重構(gòu)名錄 如果函數(shù)的邏輯太簡單,則把其移到調(diào)用它的代碼中,取消這個函數(shù) 3、將臨時變量內(nèi)聯(lián)化(將臨時變量內(nèi)聯(lián)化(Inline Temp )重構(gòu)名錄重構(gòu)名錄 變量被一個簡單的表達(dá)式賦值一次,則將變量替換成那個表達(dá)式 4、以查詢?nèi)〈R時變量(以查詢?nèi)〈R時變量(Replace Temp with Query )重構(gòu)名錄重構(gòu)名錄double basePrice = _quantity * _itemPrice;if (basePrice 1000)return basePrice * 0.95;elsereturn ba
13、sePrice * 0.98;if (basePrice() 1000)return basePrice() * 0.95;elsereturn basePrice() * 0.98;.double basePrice() return _quantity * _itemPrice; 臨時變量保存表達(dá)式的結(jié)果,將這個表達(dá)式提煉到獨(dú)立的函數(shù)中。 5、引入解釋性變量(引入解釋性變量( Introduce Explaining Variable )重構(gòu)名錄重構(gòu)名錄 將復(fù)雜表達(dá)式結(jié)果放入臨時變量,用變量名來解釋表達(dá)式用途boolean isMacOs = platform.toUpperCase().
14、indexOf(MAC) -1;boolean isIEBrowser = browser.toUpperCase().indexOf(IE) -1;boolean wasResized = resize 0;if (isMacOs & isIEBrowser & wasInitialized() & wasResized)/ do somethingif ( (platform.toUpperCase().indexOf(MAC) -1) & (browser.toUpperCase().indexOf(IE) -1) & wasInitialized() & resize 0 ) / do
15、 something 6、剖解臨時變量(剖解臨時變量( Split Temporary Variable )重構(gòu)名錄重構(gòu)名錄 一個臨時變量多次被賦值(不在循環(huán)中),應(yīng)該針對每次賦值,創(chuàng)造獨(dú)立的臨時變量。double temp = 2 * (_height + _width);System.out.println (temp);temp = _height * _width;System.out.println (temp);double perimeter = 2 * (_height + _width);System.out.println (perimeter);double area =
16、 _height * _width;System.out.println (area); 7、以衛(wèi)語句取代嵌套條件語句以衛(wèi)語句取代嵌套條件語句 (Replace Nested Conditional with Guard Clauses)重構(gòu)名錄重構(gòu)名錄 函數(shù)中條件語句使人難以看清正常的執(zhí)行路徑,用衛(wèi)語句替換嵌套條件 double getPayAmount() double result;if (_isDead) result = deadAmount();else if (_isSeparated) result = separatedAmount();else if (_isRetired
17、) result = retiredAmount();else result = normalPayAmount();return result;double getPayAmount() if (_isDead) return deadAmount();if (_isSeparated) return separatedAmount();if (_isRetired) return retiredAmount();return normalPayAmount(); 8、分解條件表達(dá)式分解條件表達(dá)式( Decompose Conditional )重構(gòu)名錄重構(gòu)名錄 從復(fù)雜的條件語句分支中分別提煉出獨(dú)立函數(shù)if(date.before(SUMMER_START) | date.after(SUMMER_END)charge = quantity * _winterRate + _winterServiceCharge;elsecharge = quantity * _summerRateif(notSummer(date)charge = winterCharge(quantity);elsecharge = summerCharge(quantity);構(gòu)筑測試體系構(gòu)筑測試體系 如果你想進(jìn)行重構(gòu),首先要擁有一個
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版高端商務(wù)門面租賃合同4篇
- 2025年度智能家庭“魔百和”套餐開通及服務(wù)協(xié)議3篇
- 2024年小學(xué)消防安全責(zé)任制度
- 遺傳算法的課程設(shè)計(jì)論文
- 運(yùn)輸行政管理課程設(shè)計(jì)
- 二零二五年綠色環(huán)保刮瓷施工技術(shù)合作協(xié)議2篇
- 2025年度高端消防工程設(shè)計(jì)合同范本3篇
- 2025年度個人貸款合同補(bǔ)充協(xié)議(抵押物變更)4篇
- 《中醫(yī)養(yǎng)生學(xué)輔助》課件
- 2025年度商業(yè)樓宇窗簾設(shè)計(jì)安裝一體化合同范本4篇
- 河北省大學(xué)生調(diào)研河北社會調(diào)查活動項(xiàng)目申請書
- GB/T 20920-2007電子水平儀
- 如何提高教師的課程領(lǐng)導(dǎo)力
- 企業(yè)人員組織結(jié)構(gòu)圖
- 日本疾病診斷分組(DPC)定額支付方式課件
- 兩段焙燒除砷技術(shù)簡介 - 文字版(1)(2)課件
- 實(shí)習(xí)證明模板免費(fèi)下載【8篇】
- 復(fù)旦大學(xué)用經(jīng)濟(jì)學(xué)智慧解讀中國課件03用大歷史觀看中國社會轉(zhuǎn)型
- 案件受理登記表模版
- 2022年浙江省嘉興市中考數(shù)學(xué)試題(Word版)
- 最新焊接工藝評定表格
評論
0/150
提交評論