重構一點思考(再談重構)_第1頁
重構一點思考(再談重構)_第2頁
重構一點思考(再談重構)_第3頁
重構一點思考(再談重構)_第4頁
重構一點思考(再談重構)_第5頁
已閱讀5頁,還剩42頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

重構的一點思考——再談重構WhatisRefactoringRefactoringistheprocessofchangingasoftwaresysteminsuchawaythatitdoesnotaltertheexternalbehaviorofthecodeyetimprovesitsinternalstructure.--

MartinFowler我們寫代碼時,只關注它的正確性,只要機器認識,通過測試就OK了

Ourcode=忽略未來的維護人員維護人員看我們的代碼時花費更多的時間來理解代碼/*xxx2009-10-21shitUAP有bug,不修改,偏要我們通過這種奇淫技巧進行解決問題*如果不增加一下幾行廢物代碼的話,那么畫面的filedgroup就會莫名其妙的丟失,原因是調用了*billcardpnl.setBillData(billcardpnl.getBillData());**/SolutionRefactoringTip:Anyfoolcanwritecodethatacomputercanunderstand.Goodprogrammerswritecodethathumanscanunderstand.WhyRefactoringTheoneconstantissoftwaredevelopmentChangeRefactoring持續改進軟件設計使代碼更易為人所理解任何一個人都能寫出計算機可以理解的程序,只有寫出人容易理解的程序才是優秀的程序員!幫助發現隱藏的代碼缺陷有助于提高編程效率WhenRefactoringTheRuleofThree在添加新功能時進行重構重構程序,使得加入新功能變得簡單添加這個功能在修改bug時進行重構在代碼評審時進行重構WhenNotRefactoring

現有的程序無法運行,此時應該是重寫程序,而不是重構程序到了最后的交付期限重構中的難題Database修改接口難以通過重構手法完成的設計改動無安全需求安全性良好

11BadSmellsDuplicatedCodeLongMethodLargeClassLongParameterListDivergentChangeShortgunSurgeryFeatureEnvyDataClumpsPrimitiveObsessionSwitchStatementsParallelInheritanceHierarchiesLazyClassSpeculativeGeneralityTemporaryFieldMessageChainsMiddleManInappropriateIntimacyAlternativeClasseswithDifferentInterfacesIncompleteLibraryClassDataClassRefusedBequestComments?OscarNierstrasz8.12TypicalRefactoringsClassRefactoringsMethodRefactoringsAttributeRefactoringsadd(sub)classtohierarchyaddmethodtoclassaddvariabletoclassrenameclassrenamemethodrenamevariableremoveclassremovemethodremovevariablepushmethoddownpushvariabledownpushmethoduppullvariableupaddparametertomethodcreateaccessorsmovemethodtocomponentabstractvariableextractcodeinnewmethodDuplicatedCodeSmell同樣的代碼出現了兩次或更多次!!!違反DRY(Don’tRepeatYourself)RefactorExtractmethodExtractmethod可讀性重復代碼——抽取方法nc.impl.emship.palletlist.PaletlistQueryImplL274L437L580DuplicatedCodeSmell同樣的代碼出現在不同的子類中!!!違反DRYRefactorExtractmethodPullupfieldPullupmethodPullupmethod兩個子類有重復的代碼提取重復的代碼至父類DuplicatedCodeSmell子類代碼類似但不相同Refactor:使用

ExtractMethod

分離出變化的代碼與相似的代碼

使用

FormTemplateMethod.重復代碼erdeli.rule.insert.CheckUniqueForInsertFiltRerdeli.rule.insert.CheckUniqueUpdateRule重復代碼——工具類erdeli.action.InterdeliCopyAerdeli.action.InterdeliAddAerdeli.mediator.OrgChangedForInterdeliEditorTODOFormTemplateMethod重復代碼——FormTemplateMcplan.replreq.Rewrite20ForYG24Impl項目采購替代申請刪除回寫采購計劃reWriteProcplanNumForYG24(ReplReqVO_111[])替代申請保存回寫累加請購單對應的采購計劃reWrite20RepNumForYG24(ReplReqVO_111[])cplan.alter.ProcPlanNQAheadAcplan.alter.ProcPlanNQAfterAlert重復代碼——FormTemplateMethod1、加鎖2、獲取回寫Map3、查詢請購單4、處理請購單行狀態5、構造項目計劃待更新集合6、更新項目采購計劃裝備631重復代碼統計后果怎么產生Ctrl+C,Ctrl+V,Ctrl+S不同的人寫了相同功能的代碼你該怎么辦?注重設計規范SONAR重構LongMethodLongmethodVSshortmethodLivebestandlongerThelongeraprocedureis,themoredifficultitistounderstandGoodnaming(ifyouhaveagoodnameforamethodyoudon'tneedtolookatthebody.)盡量分解LongMethod注釋可能是抽取小方法的信號LongMethodExtractMethodReplaceTempwithQueryDecomposeCondition

33ReplaceTempwithQuery(以查詢取代臨時變量)doublebasePrice=quantity*itemPrice;if(basePrice>1000){returnbasePrice*0.95;}else{ returnbasePrice*0.98;}

if(basePrice()>1000){returnbasePrice()*0.95;}else{returnbasePrice()*0.98;}privatedoublebasePrice(){

returnquantity*itemPrice;}DecomposeCondition復雜的條件邏輯增加可讀性nc.ui.empcd.distrbill.distrbill.validator.SaveSignInNumValidator.checkReplaceCmaterial()LargeClass太多的職責太多的實例變量ExtractClassLongparameterlist使用全局變量嗎?其他方法都可以修改破壞封裝多線程問題IntroduceParameterObjectPreserveWholeObjectIntroduceParameterObjectPreserveWholeObject其他ReplaceArraywithobjectReplaceMagicNumberwithsymbolicConstantReplaceArraywithobjectnc.ui.emic.accreq.subaccessoryout.action.AccessoryJoinCheckAction.doAction(ActionEvent)ReplaceMagicNumberwithsymbolicConstantTest你敢重構嗎?重構工具Unit

Test重構一些建議在開始重構之前,花時間弄清楚復雜的代碼邏輯。保存初始代碼把要做的事情一條條列出來根據重構風險級別來調整重構方法重構的步伐請小一些利用編譯器警告信息附錄1得墨忒耳KentBeck說:

查詢方法:如果一個對象有很多邏輯都依賴于另一個對象的狀態,可能意味著邏輯放錯了地方,①得墨忒耳法則說明:使用對象內部的某個屬性時,不要用貫穿的方法去直接讀取,應該使用一個包裝過的讀取函數。得墨忒耳法則規定,某個對象中的任何方法內部,都應該只調用以下內容:

1它自身。

2傳入該方法的任何參數,但不包括參數對象的屬性。

3方法內部創建的任何對象。

4

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論