版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、重構(gòu)技術(shù)重構(gòu)技術(shù)邱百超badqiu(a)講解內(nèi)容講解內(nèi)容l重構(gòu)介紹l重構(gòu)原則l代碼的壞味道l重構(gòu)技巧l重構(gòu)工具使用實(shí)例lQ&A名言名言 l任何一個(gè)傻瓜都能寫出計(jì)算機(jī)可以理解的程序,只有寫出人類容易理解的程序才是優(yōu)秀的程序員 Martin Fowler什么是重構(gòu)什么是重構(gòu)lRefactoring是對(duì)軟件內(nèi)部結(jié)構(gòu)的一種調(diào)整,目的是在不改變外部行為的前提下,提高其可理解性,降低其修改成本。為什么重構(gòu)為什么重構(gòu)l改進(jìn)軟件的設(shè)計(jì)。l程序員對(duì)代碼所做的為了滿足短期利益代碼改動(dòng),或再?zèng)]有完全清楚增個(gè)架構(gòu)下的改動(dòng),都很容易是代碼失去它的清晰結(jié)構(gòu),偏離需求或設(shè)計(jì)。而這些改動(dòng)的積累很容易使代碼偏離它原先設(shè)
2、計(jì)的初衷而變得不可立即和無(wú)法維護(hù)。lRefactoring則幫助重新組織代碼,重新清晰的體現(xiàn)結(jié)構(gòu)和進(jìn)一步改進(jìn)設(shè)計(jì)。為什么重構(gòu)為什么重構(gòu)l提高代碼質(zhì)量,更易被理解l容易理解的代碼可以很容易的維護(hù)和做進(jìn)一步的開(kāi)發(fā)。即使對(duì)寫這些代碼的程序員本身,容易理解代碼也可以幫助容易地做修改。程序代碼也是文檔。而代碼首先是寫給人看的,讓后才是給計(jì)算機(jī)看的。為什么重構(gòu)為什么重構(gòu)lRefactoring幫助盡早的發(fā)現(xiàn)錯(cuò)(Bugs)lRefactoring是一個(gè)code review和反饋的過(guò)程。在另一個(gè)時(shí)段重新審視自己或別人代碼,可以更容易的發(fā)現(xiàn)問(wèn)題和加深對(duì)代碼的理解。lRefactoring是一個(gè)良好的軟件開(kāi)發(fā)習(xí)
3、慣。為什么重構(gòu)為什么重構(gòu)lRefactoring可以提高開(kāi)發(fā)速度lRefactoring對(duì)設(shè)計(jì)和代碼的改進(jìn),都可以有效的提高開(kāi)發(fā)速度。好的設(shè)計(jì)和代碼質(zhì)量實(shí)體提高開(kāi)發(fā)速度的關(guān)鍵。在一個(gè)有缺陷的設(shè)計(jì)和混亂代碼基礎(chǔ)上的開(kāi)發(fā),即使表面上進(jìn)度較快,但本質(zhì)是試延后對(duì)設(shè)計(jì)缺陷的發(fā)現(xiàn)和對(duì)錯(cuò)誤的修改,也就是延后了開(kāi)發(fā)風(fēng)險(xiǎn),最終要在開(kāi)發(fā)的后期付出更多的時(shí)間和代價(jià)。l項(xiàng)目的維護(hù)成本遠(yuǎn)高于開(kāi)發(fā)成本.何時(shí)重構(gòu)何時(shí)重構(gòu)?l添加新功能時(shí)一并重構(gòu)l為了增加一個(gè)新的功能,程序員需要首先讀懂現(xiàn)有的代碼。l修補(bǔ)錯(cuò)誤時(shí)一并重構(gòu)l為了修復(fù)一個(gè)Bug,程序員需要讀懂現(xiàn)有的代碼。lCode Review時(shí)一并重構(gòu)何時(shí)不該重構(gòu)何時(shí)不該重構(gòu)?
4、l代碼太混亂,設(shè)計(jì)完全錯(cuò)誤。與其Refactor,不如重寫。l明天是DeadLinel永遠(yuǎn)不要做Last-Minute-Change。推遲Refactoring,但不可以忽略,即使進(jìn)入Production的代碼都正確的運(yùn)行。lRefactoring的工作量顯著的影響最后期限l一個(gè)Task的計(jì)劃是天,如果為了Refactoring,需要更多的時(shí)間( 天或更多)。推遲Refactoring,同步可以忽略??梢园堰@個(gè)Refactoring作為一個(gè)新的Task,或者安排在Refactoring的Iteration中完成。兩頂帽子兩頂帽子l重構(gòu)重構(gòu)與添加新功能添加新功能l添加新功能時(shí),你不應(yīng)該修改既有代
5、碼,只管添加新功能。l重構(gòu)時(shí)你就不能再添加功能,只管改進(jìn)程序結(jié)構(gòu)。此外你不應(yīng)該添加任何測(cè)試(除非發(fā)現(xiàn)有先前遺漏的東西)l兩頂“帽子”可同時(shí)進(jìn)行,一會(huì)重構(gòu),一會(huì)添加新功能。重構(gòu)與設(shè)計(jì)重構(gòu)與設(shè)計(jì) l重構(gòu)可以從很大程度上去扶助設(shè)計(jì),通常情況下我們的設(shè)計(jì)不是能貫穿我們軟件開(kāi)發(fā)的全過(guò)程的,在這個(gè)過(guò)程中,我們的需求變更的可能性非常大,當(dāng)需求變了,設(shè)計(jì)也得變,但是我們已有的實(shí)現(xiàn)怎么辦?全部廢除?顯然不能!這時(shí)候就要依靠重構(gòu)來(lái)解決這種矛盾。重構(gòu)與性能重構(gòu)與性能 l關(guān)于重構(gòu),有一個(gè)常被提出的問(wèn)題:它對(duì)程序的性能將造成怎樣的影響?為了讓軟件易于理解,你常會(huì)作出一些使程序運(yùn)行變慢的修改。這是個(gè)重要的問(wèn)題。我并不贊成
6、為了提高設(shè)計(jì)的純潔性或把希望寄托于更快的硬件身上,而忽略了程序性能。已經(jīng)有很多軟件因?yàn)樗俣忍挥脩艟芙^,日益提高的機(jī)器速度亦只不過(guò)略微放寬了速度方面的限制而已。但是,換個(gè)角度說(shuō),雖然重構(gòu)必然會(huì)使軟件運(yùn)行更慢,但它也使軟件的性能優(yōu)化更易進(jìn)行。關(guān)鍵在于自己的理解,當(dāng)你擁有了重構(gòu)的經(jīng)驗(yàn),你也就有能力在重構(gòu)的基礎(chǔ)上來(lái)改進(jìn)程序的性能。重構(gòu)與模式重構(gòu)與模式l那么真正要實(shí)現(xiàn)重構(gòu)時(shí),我們有哪些具體的方法呢?可以這樣說(shuō),重構(gòu)的準(zhǔn)則由很多條,見(jiàn)重構(gòu)這本書。但它不是最終的標(biāo)準(zhǔn),因?yàn)槟阋峭耆凑账臉?biāo)準(zhǔn)來(lái)執(zhí)行,那你也就等于不會(huì)重構(gòu),重構(gòu)是一種武器,而真正運(yùn)用武器的高手是沒(méi)有武器勝有武器。只有根據(jù)實(shí)際的需要,憑借
7、一定的思想,才能實(shí)現(xiàn)符合實(shí)際的重構(gòu),我們不能被一些固定的模式套牢了,這樣你的程序會(huì)很僵化。究竟如何把握這個(gè)度,需要大家去總結(jié)。重構(gòu)與思想重構(gòu)與思想 l要想實(shí)現(xiàn)一個(gè)好的重構(gòu),不是重構(gòu)本身,而是我們?cè)趯懘a的時(shí)候,思想當(dāng)中時(shí)刻有它的位置存在!非常重要!如果你本身就沒(méi)想著要去重構(gòu),那么就是有再好的模式供你調(diào)用又怎么樣?就是有了好的模式,你不能根據(jù)實(shí)際的需要去融會(huì)貫通,那你做出來(lái)的重構(gòu)有意義么? 應(yīng)用范圍應(yīng)用范圍l代碼重構(gòu)l網(wǎng)頁(yè)重構(gòu)l設(shè)計(jì)重構(gòu)l.Refactoring的流程的流程l流程1l讀懂代碼(包括測(cè)試?yán)哟a)lRefactoringl運(yùn)行所有的Unit Testsl流程2l讀懂代碼l應(yīng)用重構(gòu)工
8、具進(jìn)行重構(gòu)(如Eclipse)代碼壞味道代碼壞味道l重復(fù)的代碼(Duplicated Code)l過(guò)長(zhǎng)的函數(shù)(Long Method)l過(guò)大類(Large Class)l過(guò)長(zhǎng)的參數(shù)列(Long Parameter List)l發(fā)散式變化(Divergent Change)l霰彈式修改(Shotgun Surgery)l依戀情結(jié)(Feature Envy)l數(shù)據(jù)泥團(tuán)(Data Clumps)l基本型別偏執(zhí)(Primitive Obsession)lSwitch語(yǔ)句(Swtich Statements)l平行繼承體系(Parallel Inheritance Hierarchies)l冗贅類(La
9、zy Class)l夸夸其談未來(lái)性(Speculative Generality)l令人迷惑的暫時(shí)值域(Temporary Field)l過(guò)度遇合的消息鏈(Message Chains)l中間轉(zhuǎn)手人(Middle Man)l狎昵關(guān)系(Inappropriate Intimacy)l異曲同工的類(Alternative Classes with Different Interfaces)l不完善的程序庫(kù)類(Incomplete Library Class)l純粹的數(shù)據(jù)類(Data Class)l被拒絕的遺贈(zèng)(Refused Bequest)l過(guò)多的注釋(Comments)重構(gòu)技巧重構(gòu)技巧l重新組
10、織你的函數(shù)l在對(duì)象之間搬移特性l重新組織數(shù)據(jù)l簡(jiǎn)化條件表達(dá)式l簡(jiǎn)化函數(shù)調(diào)用l處理概括關(guān)系Extract Methods(提煉函數(shù)提煉函數(shù)1)String name = request.getParameter(Name);if( name != null & name.length() 0 ).String age = request.getParameter(Age);if( age != null & age.length() 0 ).String name = request.getParameter(Name);if( !isNullOrEmpty( name ) ).
11、String age = request.getParameter(Age);if( !isNullOrEmpty( age ) ).private boolean isNullOrEmpty( final String string )if( string != null & string.length() 0 )return true;elsereturn false;Extract Methods(提煉函數(shù)提煉函數(shù):清除注釋清除注釋)void printOwing() /print bannerSystem.out.println(“*”);System.out.println(
12、“Banner”);System.out.println(“*”);/print detailsSystem.out.println (name: + _name);System.out.println (amount +getOutstanding();void printOwing()printBanner();printDetails(getOutstanding();void printBanner()System.out.println(“*”);System.out.println(“Banner”);System.out.println(“*”);void printDetail
13、s (double outstanding)System.out.println (name: + _name);System.out.println (amount + outstanding);Inline Method(將函數(shù)內(nèi)聯(lián)化將函數(shù)內(nèi)聯(lián)化)Inline Temp(將臨時(shí)變量?jī)?nèi)聯(lián)化)(將臨時(shí)變量?jī)?nèi)聯(lián)化)Replace Temp with Query(以(以查詢?nèi)〈R時(shí)變量)查詢?nèi)〈R時(shí)變量)double basePrice = _quantity * _itemPrice;if (basePrice 1000)return basePrice * 0.95;elsereturn ba
14、sePrice * 0.98;if (basePrice() 1000)return basePrice() * 0.95;elsereturn basePrice() * 0.98;.double basePrice() return _quantity * _itemPrice;Introduce Explaining Variable(引入解釋性變量)(引入解釋性變量)boolean isMacOs = platform.toUpperCase().indexOf(MAC) -1;boolean isIEBrowser = browser.toUpperCase().indexOf(IE
15、) -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 something Split Temporary Variable(剖解(剖解臨時(shí)變量)
16、臨時(shí)變量)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 = _height * _width;System.out.println (area);Remove Assignments to Parameters(移除對(duì)參數(shù)的賦值)(移除對(duì)參數(shù)的賦值)
17、Replace Method with Method Object(以函數(shù)對(duì)象取代函數(shù))(以函數(shù)對(duì)象取代函數(shù))Substitute Algorithm(替換算(替換算法)法)Replace Nested Conditional with Guard Clauses double getPayAmount() double result;if (_isDead) result = deadAmount();else if (_isSeparated) result = separatedAmount();else if (_isRetired) result = retiredAmount();
18、else result = normalPayAmount();return result;double getPayAmount() if (_isDead) return deadAmount();if (_isSeparated) return separatedAmount();if (_isRetired) return retiredAmount();return normalPayAmount();Split Loop - 1void printValues() double averageAge = 0;double totalSalary = 0;for (int i = 0
19、; i people.length; i+) averageAge += peoplei.age;totalSalary += peoplei.salary;averageAge = averageAge / people.length;System.out.println(averageAge);System.out.println(totalSalary);void printValues() double totalSalary = 0;for (int i = 0; i people.length; i+) totalSalary += peoplei.salary;double av
20、erageAge = 0;for (int i = 0; i people.length; i+) averageAge += peoplei.age;averageAge = averageAge / people.length;System.out.println(averageAge);System.out.println(totalSalary);Split Loop - 2void printValues() System.out.println(averageAge();System.out.println(totalSalary();private double averageAge() double result = 0;for (int i = 0; i people.length; i+) result += peoplei.age;return result / people.length;private double totalSalary() double result = 0;for (int i = 0; i people.length; i+) result += peoplei.salary;ret
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2025學(xué)年揭陽(yáng)市揭西縣數(shù)學(xué)三上期末考試試題含解析
- 2024年礦產(chǎn)開(kāi)采爆破作業(yè)勞務(wù)分包合同
- 辦公環(huán)境下的高效種植技術(shù)與農(nóng)產(chǎn)品電商解決方案
- 2024年田土承包經(jīng)營(yíng)權(quán)租賃與物業(yè)服務(wù)合同3篇
- 醫(yī)療領(lǐng)域中的實(shí)驗(yàn)室安全衛(wèi)生
- 商業(yè)模式創(chuàng)新在解決兒童營(yíng)養(yǎng)問(wèn)題中的價(jià)值
- 培養(yǎng)孩子的獨(dú)立性與自我保護(hù)意識(shí)在戶外活動(dòng)中
- 商業(yè)數(shù)據(jù)分析中的數(shù)學(xué)基礎(chǔ)運(yùn)算技能探討
- 2025中國(guó)鐵塔集團(tuán)黑龍江分公司招聘11人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中國(guó)聯(lián)通云數(shù)據(jù)限公司招聘33人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 心理統(tǒng)計(jì)學(xué)統(tǒng)計(jì)方法
- 北斗創(chuàng)新設(shè)計(jì)導(dǎo)航-知到答案、智慧樹答案
- 【韓國(guó)三星在中國(guó)的跨文化管理探析-以上海子公司為例5800字】
- 新學(xué)位法專題講座課件
- 墜積性肺炎治療新進(jìn)展
- 心身疾病的心理與康復(fù)治療
- 2024年02月四川省省直機(jī)關(guān)2024年度公開(kāi)遴選和公開(kāi)選調(diào)公務(wù)員筆試參考題庫(kù)附帶答案詳解
- 2024安吉桃花源萌寵露營(yíng)節(jié)活動(dòng)方案
- 壯醫(yī)藥水蛭療法
- 200句搞定中考英語(yǔ)詞匯
- 2024年型材切割機(jī)市場(chǎng)需求分析報(bào)告
評(píng)論
0/150
提交評(píng)論