版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、重重構(gòu)的一點思構(gòu)的一點思考考再談重構(gòu)再談重構(gòu)What is Refactoring Refactoring is the process of changing a software system in such a way that it does not alter the external behavior of the code yet improves its internal structure.-Martin Fowler我們寫代碼時,只關(guān)注它的正確性,只要機(jī)器認(rèn)識,通過測試就OK了 Our code = 忽略未來的維護(hù)人員維護(hù)人員看我們的代碼時花費更多的時間來理解代碼/* xx
2、x 2009-10-21 shit UAP有bug,不修改,偏要我們通過這種奇淫技巧進(jìn)行解決問題 * 如果不增加一下幾行廢物代碼的話,那么畫面的filedgroup就會莫名其妙的丟失,原因是調(diào)用了 * billcardpnl.setBillData(billcardpnl.getBillData(); * */SolutionRefactoringTip:Any fool can write code that a computer can understand. Good programmers write code that humans can understand.Why Refact
3、oringThe one constant is software developmentRefactoring持持續(xù)改續(xù)改進(jìn)軟件設(shè)計進(jìn)軟件設(shè)計使代碼更易為人所理使代碼更易為人所理解解任何一個人都能寫出計算機(jī)可以理解的程序,只有寫出人容易理解的程序才是優(yōu)秀的程序員!幫助發(fā)現(xiàn)隱藏的代碼缺陷幫助發(fā)現(xiàn)隱藏的代碼缺陷有助于提高編程效率有助于提高編程效率When RefactoringThe Rule of Three在添加新功能時進(jìn)行在添加新功能時進(jìn)行重構(gòu)重構(gòu)重構(gòu)程序,使得加入新功能變得簡單添加這個功能在修改在修改bug時進(jìn)行重時進(jìn)行重構(gòu)構(gòu)在代在代碼評審碼評審時進(jìn)行重構(gòu)時進(jìn)行重構(gòu)When Not Re
4、factoring 現(xiàn)有的程序無法運行現(xiàn)有的程序無法運行,此時應(yīng)該是重寫程序此時應(yīng)該是重寫程序,而而不是重構(gòu)程不是重構(gòu)程序序到了最后的交付期限到了最后的交付期限重重構(gòu)中的構(gòu)中的難難題題Database修改接口難以通過重構(gòu)手法完成的設(shè)計改動無安全需求 安全性良好11Bad SmellsDuplicated CodeLong MethodLarge Class Long Parameter ListDivergent ChangeShortgun SurgeryFeature EnvyData ClumpsPrimitive ObsessionSwitch StatementsParallel I
5、nheritance HierarchiesLazy ClassSpeculative GeneralityTemporary FieldMessage ChainsMiddle ManInappropriate IntimacyAlternative Classes with Different InterfacesIncomplete Library ClassData ClassRefused BequestComments Oscar Nierstrasz8.12Typical RefactoringsClass RefactoringsMethod RefactoringsAttri
6、bute Refactoringsadd (sub)class to hierarchyadd method to classadd variable to classrename classrename methodrename variableremove classremove methodremove variablepush method downpush variable downpush method uppull variable upadd parameter to methodcreate accessorsmove method to component abstract
7、 variableextract code in new methodDuplicated CodeSmell同樣的代碼出現(xiàn)了兩次或更多次!同樣的代碼出現(xiàn)了兩次或更多次!!違反DRY(Dont Repeat Yourself)RefactorExtract methodExtract method可讀性可讀性重復(fù)代碼抽取方法nc.impl.emship.palletlist.PaletlistQueryImplL274L437L580Duplicated CodeSmell同樣的代碼出現(xiàn)在不同的子類中!同樣的代碼出現(xiàn)在不同的子類中!!違反DRYRefactorExtract methodPul
8、l up fieldPull up methodPull up method兩個子類有重復(fù)的代碼提取重復(fù)的代碼至父類Duplicated CodeSmell子類代碼類似但不相同Refactor:使用 Extract Method 分離出變化的代碼與相似的代碼 使用使用 Form Template Method.重復(fù)代碼erdeli.rule.insert.CheckUniqueForInsertFiltRerdeli.rule.insert.CheckUniqueUpdateRule重復(fù)代碼工
9、具類erdeli.action.InterdeliCopyAerdeli.action.InterdeliAddAerdeli.mediator.OrgChangedForInterdeliEditorTODOForm Template Method重復(fù)代碼Form Template Mcplan.replreq.Rewrite20ForYG24Impl項目采購替代申請刪除回寫采購計劃reW
10、riteProcplanNumForYG24(ReplReqVO_111)替代申請保存回寫累加請購單對應(yīng)的采購計劃reWrite20RepNumForYG24(ReplReqVO_111)cplan.alter.ProcPlanNQAheadAcplan.alter.ProcPlanNQAfterAlert重復(fù)代碼Form Template Method1、加鎖2、獲取回寫Map3、查詢請購單4、處理請購單行狀態(tài)5、構(gòu)造項目計劃待更新集合6、更新項目采購計劃裝備631重復(fù)代碼統(tǒng)計后果怎么
11、產(chǎn)生CtrlCtrl+C+C, Ctrl+V, Ctrl+ Ctrl+V, Ctrl+S S不同的人寫了相同功能的代碼不同的人寫了相同功能的代碼你該怎么辦?你該怎么辦?注重設(shè)計規(guī)范SONAR重構(gòu)Long MethodLong method VS short methodLive best and longerThe longer a procedure is, the more difficult it is to understandGood naming(if you have a good name for a method you dont need to look at the bo
12、dy.)盡盡量分解量分解Long Method注注釋可能是抽取小方法的信號釋可能是抽取小方法的信號Long MethodExtract MethodReplace Temp with QueryDecompose Condition33Replace Temp with Query(以查詢?nèi)〈R時變量)double basePrice = quantity * itemPrice; if (basePrice 1000) return basePrice * 0.95; else return basePrice * 0.98; if (basePrice() 1000) return bas
13、ePrice() * 0.95; else return basePrice() * 0.98;private double basePrice() return quantity * itemPrice; Decompose Condition復(fù)雜的條件邏輯增加可讀性nc.ui.empcd.distrbill.distrbill.validator.SaveSignInNumValidator.checkReplaceCmaterial()Large Class太多的職責(zé) 太多的實例變量Extract ClassLong parameter list使用全局變量嗎?其他方法都可以修改破壞封裝
14、多線程問題Introduce Parameter ObjectPreserve Whole ObjectIntroduce Parameter ObjectPreserve Whole Object其他Replace Array with objectReplace Magic Number with symbolic ConstantReplace Array with objectnc.ui.emic.accreq.subaccessoryout.action.AccessoryJoinCheckAction.doAction(ActionEvent)Replace Magic Numbe
15、r with symbolic ConstantTest你敢重構(gòu)嗎?重構(gòu)工具Unit Test重構(gòu)一些建議在開始重構(gòu)之前,花時間弄清楚復(fù)雜的代碼邏輯。保存初始代碼把要做的事情一條條列出來根據(jù)重構(gòu)風(fēng)險級別來調(diào)整重構(gòu)方法重構(gòu)的步伐請小一些利用編譯器警告信息附錄1得墨忒耳Kent Beck說: 查詢方法:如果一個對象有很多邏輯都依賴于另一個對象的狀態(tài),可能意味著邏輯放錯了地方,得墨忒耳法則說明:使用對象內(nèi)部的某個屬性時,不要用貫穿的方法去直接讀取,應(yīng)該使用一個包裝過的讀取函數(shù)。 得墨忒耳法則規(guī)定,某個對象中的任何方法內(nèi)部,都應(yīng)該只調(diào)用以下內(nèi)容: 1它自身。 2 傳入該方法的任何參數(shù),但不包括參數(shù)對象的屬性。 3 方法內(nèi)部
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 餐飲業(yè)解除勞動合同樣本
- 農(nóng)業(yè)技術(shù)聘用合同證明
- 倉儲管理租賃代理合同
- 建筑行業(yè)專家聘用合同
- 小區(qū)玻璃施工合同范例
- 音響技術(shù)員勞動合同三篇
- 配電柜制造設(shè)備承攬合同三篇
- 音樂錄制與發(fā)行合同三篇
- 退伙合同協(xié)議書范本甲乙丙
- 集體宿舍租賃合同一般寫幾字
- 單軸水泥攪拌樁施工方案設(shè)計
- 老年人睡眠障礙的護(hù)理(PPT課件)
- 會陰阻滯麻醉完整版PPT課件
- 《家庭禮儀》PPT課件
- 應(yīng)聘人員面試登記表(應(yīng)聘者填寫)
- T∕CAAA 005-2018 青貯飼料 全株玉米
- s鐵路預(yù)應(yīng)力混凝土連續(xù)梁(鋼構(gòu))懸臂澆筑施工技術(shù)指南
- 撥叉831006設(shè)計說明書
- 程序語言課程設(shè)計任意兩個高次多項式的加法和乘法運算
- 石油鉆井八大系統(tǒng)ppt課件
- 北師大版二年級數(shù)學(xué)上冊期末考試復(fù)習(xí)計劃
評論
0/150
提交評論