2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩24頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、1,Refactoring(重構(gòu)),黃海波 & 陶萬(wàn)山 With contribution by 勞暉www.chinaxp.org,2,什么是Refactoring,Refactoring是對(duì)已經(jīng)完成的代碼進(jìn)行改進(jìn)的過(guò)程。在不對(duì)代碼的外部行為進(jìn)行改動(dòng)的情況下,對(duì)代碼內(nèi)部的結(jié)構(gòu)進(jìn)行優(yōu)化。Refactoring是嚴(yán)謹(jǐn)?shù)貙?duì)完成的代碼進(jìn)行清理的從而減少出錯(cuò)的一種方法。Refactoring的實(shí)質(zhì)是對(duì)完成代碼的設(shè)計(jì)進(jìn)行

2、改進(jìn)。Refactoring是XP項(xiàng)目中每天的例行練習(xí)。Refactoring必須和Test-Driven Design and Development伴隨進(jìn)行。,3,為什么要Refactoring?,Refactoring的目的:1. 改進(jìn)軟件的設(shè)計(jì)。程序員對(duì)代碼所做的為了滿足短期利益代碼改動(dòng),或再?zèng)]有完全清楚增個(gè)架構(gòu)下的改動(dòng),都很容易是代碼失去它的清晰結(jié)構(gòu),偏離需求或設(shè)計(jì)。而這些改動(dòng)的積累很容易使代碼偏離它原先設(shè)計(jì)的初

3、衷而變得不可立即和無(wú)法維護(hù)。Refactoring則幫助重新組織代碼,重新清晰的體現(xiàn)結(jié)構(gòu)和進(jìn)一步改進(jìn)設(shè)計(jì)。,4,為什么要Refactoring?,,Refactoring的目的:2. 提高代碼質(zhì)量,可維護(hù)性。容易理解的代碼可以很容易的維護(hù)和做進(jìn)一步的開(kāi)發(fā)。即使對(duì)寫(xiě)這些代碼的程序員本身,容易理解代碼也可以幫助容易地做修改。程序代碼也是文檔。而代碼首先是寫(xiě)給人看的,讓后才是給計(jì)算機(jī)看的。,5,為什么要Refactoring

4、?,Refactoring的目的:3. Refactoring幫助盡早的發(fā)現(xiàn)錯(cuò)誤(Defects)Refactoring是一個(gè)code review和反饋的過(guò)程。在另一個(gè)時(shí)段重新審視自己或別人代碼,可以更容易的發(fā)現(xiàn)問(wèn)題和加深對(duì)代碼的理解。Refactoring是一個(gè)良好的軟件開(kāi)發(fā)習(xí)慣。,6,為什么要Refactoring?,Refactoring的目的:4. Refactoring可以提高提高開(kāi)發(fā)速度Refactor

5、ing對(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à)。,7,Refactoring和傳統(tǒng)流程,在傳統(tǒng)的流程中,分為設(shè)計(jì)和編碼兩個(gè)階段。設(shè)計(jì)階段(概要設(shè)計(jì),詳細(xì)設(shè)計(jì))在編碼階段(先設(shè)計(jì),后編碼)之前。在傳統(tǒng)的過(guò)程中,設(shè)計(jì)

6、是一個(gè)很?chē)?yán)謹(jǐn)和占用大量時(shí)間的階段(比如一個(gè)項(xiàng)目6個(gè)月,4個(gè)月需求分析和設(shè)計(jì)),從設(shè)計(jì)階段獲得的幾乎不會(huì)變化的詳細(xì)設(shè)計(jì)文檔,然后程序員對(duì)這些詳細(xì)設(shè)計(jì)進(jìn)行實(shí)現(xiàn)?,F(xiàn)實(shí):程序員需要改動(dòng)代碼來(lái)迎合需求的改變。程序員需要改動(dòng)代碼來(lái)能滿足實(shí)際中性能的要求程序員沒(méi)能理解和按設(shè)計(jì)實(shí)現(xiàn)程序員為了趕DeadLine對(duì)代碼做的Quick-and-Ugly修改結(jié)果:代碼從設(shè)計(jì)偏離,設(shè)計(jì)變的過(guò)時(shí),8,Refactoring和敏捷流程,Refact

7、oring表現(xiàn)敏捷方法的設(shè)計(jì)哲學(xué):軟件開(kāi)發(fā)是一個(gè)進(jìn)化的過(guò)程。過(guò)去的傳統(tǒng)的設(shè)計(jì)方法則專(zhuān)著于軟件的設(shè)計(jì)階段,力求整體設(shè)計(jì)的完美和詳細(xì),從而防止開(kāi)發(fā)過(guò)程的后期出現(xiàn)沒(méi)由預(yù)見(jiàn)到的情況而危害軟件的質(zhì)量和進(jìn)度。敏捷方法則專(zhuān)注于當(dāng)前的設(shè)計(jì)的完美,不過(guò)分考慮將來(lái)設(shè)計(jì),依賴目前的好的設(shè)計(jì)和代碼來(lái)應(yīng)付將來(lái)可能出現(xiàn)的需求和情況。而Refactoring就是敏捷方法的實(shí)現(xiàn)其設(shè)計(jì)哲學(xué)的工具。,9,什么時(shí)候適合做Refactoring?,在

8、開(kāi)始增加一個(gè)新的功能之前為了增加一個(gè)新的功能,程序員需要首先讀懂現(xiàn)有的代碼。在修復(fù)一個(gè)錯(cuò)誤的時(shí)候?yàn)榱诵迯?fù)一個(gè)Bug,程序員需要讀懂現(xiàn)有的代碼。在做Code Review的時(shí)候,10,什么時(shí)候不適合做Refactoring?,代碼太混亂,設(shè)計(jì)完全錯(cuò)誤與其Refactor,不如重新開(kāi)始。明天是DeadLine永遠(yuǎn)不要做Last-Minute-Change。推遲Refactoring,但不可以忽略,即使進(jìn)入Produ

9、ction的代碼都正確的運(yùn)行。Refactoring的工作量顯著的影響Estimate一個(gè)Task的estimate是3天,如果為了Refactoring,需要更多的時(shí)間( 2天或更多)。推遲Refactoring,同步可以忽略??梢园堰@個(gè)Refactoring作為一個(gè)新的Task,或者安排在Refactoring的Iteration中完成。,11,Refactoring的流程,讀懂代碼(包括測(cè)試?yán)哟a)Refactorin

10、g運(yùn)行所有的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,一個(gè)復(fù)雜些和現(xiàn)實(shí)些的例子,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,如果一個(gè)Method中的邏輯太簡(jiǎn)單,則把其中的代碼移到調(diào)用它的代碼,取消這個(gè)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來(lái)防止誤用參數(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通常在每個(gè)Pair完成Task

溫馨提示

  • 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論