版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、1,Refactoring(重構(gòu)),黃海波 & 陶萬山 With contribution by 勞暉www.chinaxp.org,2,什么是Refactoring,Refactoring是對已經(jīng)完成的代碼進行改進的過程。在不對代碼的外部行為進行改動的情況下,對代碼內(nèi)部的結(jié)構(gòu)進行優(yōu)化。Refactoring是嚴謹?shù)貙ν瓿傻拇a進行清理的從而減少出錯的一種方法。Refactoring的實質(zhì)是對完成代碼的設(shè)計進行
2、改進。Refactoring是XP項目中每天的例行練習。Refactoring必須和Test-Driven Design and Development伴隨進行。,3,為什么要Refactoring?,Refactoring的目的:1. 改進軟件的設(shè)計。程序員對代碼所做的為了滿足短期利益代碼改動,或再沒有完全清楚增個架構(gòu)下的改動,都很容易是代碼失去它的清晰結(jié)構(gòu),偏離需求或設(shè)計。而這些改動的積累很容易使代碼偏離它原先設(shè)計的初
3、衷而變得不可立即和無法維護。Refactoring則幫助重新組織代碼,重新清晰的體現(xiàn)結(jié)構(gòu)和進一步改進設(shè)計。,4,為什么要Refactoring?,,Refactoring的目的:2. 提高代碼質(zhì)量,可維護性。容易理解的代碼可以很容易的維護和做進一步的開發(fā)。即使對寫這些代碼的程序員本身,容易理解代碼也可以幫助容易地做修改。程序代碼也是文檔。而代碼首先是寫給人看的,讓后才是給計算機看的。,5,為什么要Refactoring
4、?,Refactoring的目的:3. Refactoring幫助盡早的發(fā)現(xiàn)錯誤(Defects)Refactoring是一個code review和反饋的過程。在另一個時段重新審視自己或別人代碼,可以更容易的發(fā)現(xiàn)問題和加深對代碼的理解。Refactoring是一個良好的軟件開發(fā)習慣。,6,為什么要Refactoring?,Refactoring的目的:4. Refactoring可以提高提高開發(fā)速度Refactor
5、ing對設(shè)計和代碼的改進,都可以有效的提高開發(fā)速度。好的設(shè)計和代碼質(zhì)量實體提高開發(fā)速度的關(guān)鍵。在一個有缺陷的設(shè)計和混亂代碼基礎(chǔ)上的開發(fā),即使表面上進度較快,但本質(zhì)是試延后對設(shè)計缺陷的發(fā)現(xiàn)和對錯誤的修改,也就是延后了開發(fā)風險,最終要在開發(fā)的后期付出更多的時間和代價。,7,Refactoring和傳統(tǒng)流程,在傳統(tǒng)的流程中,分為設(shè)計和編碼兩個階段。設(shè)計階段(概要設(shè)計,詳細設(shè)計)在編碼階段(先設(shè)計,后編碼)之前。在傳統(tǒng)的過程中,設(shè)計
6、是一個很嚴謹和占用大量時間的階段(比如一個項目6個月,4個月需求分析和設(shè)計),從設(shè)計階段獲得的幾乎不會變化的詳細設(shè)計文檔,然后程序員對這些詳細設(shè)計進行實現(xiàn)?,F(xiàn)實:程序員需要改動代碼來迎合需求的改變。程序員需要改動代碼來能滿足實際中性能的要求程序員沒能理解和按設(shè)計實現(xiàn)程序員為了趕DeadLine對代碼做的Quick-and-Ugly修改結(jié)果:代碼從設(shè)計偏離,設(shè)計變的過時,8,Refactoring和敏捷流程,Refact
7、oring表現(xiàn)敏捷方法的設(shè)計哲學:軟件開發(fā)是一個進化的過程。過去的傳統(tǒng)的設(shè)計方法則專著于軟件的設(shè)計階段,力求整體設(shè)計的完美和詳細,從而防止開發(fā)過程的后期出現(xiàn)沒由預見到的情況而危害軟件的質(zhì)量和進度。敏捷方法則專注于當前的設(shè)計的完美,不過分考慮將來設(shè)計,依賴目前的好的設(shè)計和代碼來應付將來可能出現(xiàn)的需求和情況。而Refactoring就是敏捷方法的實現(xiàn)其設(shè)計哲學的工具。,9,什么時候適合做Refactoring?,在
8、開始增加一個新的功能之前為了增加一個新的功能,程序員需要首先讀懂現(xiàn)有的代碼。在修復一個錯誤的時候為了修復一個Bug,程序員需要讀懂現(xiàn)有的代碼。在做Code Review的時候,10,什么時候不適合做Refactoring?,代碼太混亂,設(shè)計完全錯誤與其Refactor,不如重新開始。明天是DeadLine永遠不要做Last-Minute-Change。推遲Refactoring,但不可以忽略,即使進入Produ
9、ction的代碼都正確的運行。Refactoring的工作量顯著的影響Estimate一個Task的estimate是3天,如果為了Refactoring,需要更多的時間( 2天或更多)。推遲Refactoring,同步可以忽略??梢园堰@個Refactoring作為一個新的Task,或者安排在Refactoring的Iteration中完成。,11,Refactoring的流程,讀懂代碼(包括測試例子代碼)Refactorin
10、g運行所有的Unit Tests,12,Bad Smells,Duplicated CodeLong MethodLarge ClassLong Parameter ListDivergent ChangeShortgun SurgeryFeature EnvyData ClumpsPrimitive ObsessionSwitch StatementsParallel Inheritance Hierarchie
11、sLazy ClassSpeculative GeneralityTemporary FieldMessage ChainsMiddle ManInappropriate IntimacyAlternative Classes with Different InterfacesIncomplete Library ClassData ClassRefused BequestComments,13,Refactori
12、ng之Extract Methods,void printOwing() { //print bannerSystem.out.println(“*********”);System.out.println(“Banner”);System.out.println(“*********”);//print detailsSystem.out.println ("name: " + _name
13、); System.out.println ("amount " + getOutstanding()); },void printOwing(){ printBanner(); printDetails(getOutstanding()); } Void printBanner(){ //print banner System.out.println(“*********
14、”); System.out.println(“Banner”); System.out.println(“*********”);}void printDetails (double outstanding) { System.out.println ("name: " + _name); System.out.println ("amount " +
15、outstanding); },,14,Refactoring之Extract Methods,一個復雜些和現(xiàn)實些的例子,String name = request.getParameter("Name");if( name != null && name.length() > 0 ){......}String age = request.getParameter("
16、Age");if( age != null && age.length() > 0 ){......},String name = request.getParameter("Name");if( !isNullOrEmpty( name ) ){ ......}String age = request.getParameter("Age"
17、;);if( !isNullOrEmpty( age ) ){ ......}private boolean isNullOrEmpty( final String string ){ if( string != null && string.length() > 0 ){ return true; }else{ return false;
18、 }},,15,Refactoring之Inline Method,如果一個Method中的邏輯太簡單,則把其中的代碼移到調(diào)用它的代碼,取消這個Method。,int getRating() { return (moreThanFiveLateDeliveries()) ? 2 : 1; } boolean moreThanFiveLateDeliveries() { return _numberOfLateDeli
19、veries > 5; },int getRating() { return (_numberOfLateDeliveries > 5) ? 2 : 1; },,16,Refactoring之Inline Temp,double basePrice = anOrder.basePrice(); return (basePrice > 1000) ;,return (anOrder.basePrice()
20、> 1000) ;,,17,Refactoring之Replace Temp with Query,double basePrice = _quantity * _itemPrice; if (basePrice > 1000) return basePrice * 0.95; else return basePrice * 0.98;,if (basePrice() > 1000) re
21、turn basePrice() * 0.95; else return basePrice() * 0.98; ……double basePrice() { return _quantity * _itemPrice; },,18,Refactoring之Introduce Explaining Variable,if ( (platform.toUpperCase().indexOf("MAC")
22、> -1) && (browser.toUpperCase().indexOf("IE") > -1) && wasInitialized() && resize > 0 ) { // do something },final boolean isMacOs = atform.toUpperCase().indexOf("M
23、AC")> -1; final boolean isIEBrowser = browser.toUpperCase().indexOf("IE") > -1; final boolean wasResized = resize > 0; if (isMacOs && isIEBrowser && wasInitialized() &&
24、wasResized) { // do something },,19,Refactoring之Introduce Explaining Variable,double temp = 2 * (_height + _width); System.out.println (temp); temp = _height * _width; System.out.println (temp);,final double perimeter
25、 = 2 * (_height + _width);System.out.println (perimeter); final double area = _height * _width; System.out.println (area);,,20,Refactoring之Remove Assignments to Parameters,int discount (int inputVal, int quantity, int
26、 yearToDate){ if (inputVal > 50) inputVal -= 2; },int discount (int inputVal, int quantity, int yearToDate) { int result = inputVal; if (inputVal > 50) result -= 2; },,如果參數(shù)是Object,容易誤賦值。采用final來防止誤用參數(shù),2
27、1,Refactoring之Replace Method with Method Object,class Order... double price() { double primaryBasePrice; double secondaryBasePrice; double tertiaryBasePrice; // long computation; ... },,或者可以采用static
28、method,22,Refactoring之Replace Method with Method Object,String foundPerson(String[] people){ for (int i = 0; i < people.length; i++) { if (people[i].equals ("Don")){ return "
29、Don"; } if (people[i].equals ("John")) { return "John"; } if (people[i].equals ("Kent")){ return "Kent";
30、 } } return ""; },String foundPerson(String[] people){ List candidates = Arrays.asList(new String[] {"Don", "John", "Kent"}); for (int i=0;
31、i<people.length; i++) if (candidates.contains(people[i])) return people[i]; return ""; },,23,更多的Refactoring,www.refactoring.com,24,XP中的Refactoring,在XP的日常工作中,Refactoring通常在每個Pair完成Task
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論