![改善既有的代碼-重構(gòu)(ppt)_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/18/fee21f1a-65ad-4b28-98bb-12deed90fc15/fee21f1a-65ad-4b28-98bb-12deed90fc151.gif)
![改善既有的代碼-重構(gòu)(ppt)_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/18/fee21f1a-65ad-4b28-98bb-12deed90fc15/fee21f1a-65ad-4b28-98bb-12deed90fc152.gif)
![改善既有的代碼-重構(gòu)(ppt)_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/18/fee21f1a-65ad-4b28-98bb-12deed90fc15/fee21f1a-65ad-4b28-98bb-12deed90fc153.gif)
![改善既有的代碼-重構(gòu)(ppt)_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/18/fee21f1a-65ad-4b28-98bb-12deed90fc15/fee21f1a-65ad-4b28-98bb-12deed90fc154.gif)
![改善既有的代碼-重構(gòu)(ppt)_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/18/fee21f1a-65ad-4b28-98bb-12deed90fc15/fee21f1a-65ad-4b28-98bb-12deed90fc155.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
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)工具使用實例lQ&A名言名言 l任何一個傻瓜都能寫出計算機可以理解的程序,只有寫出人類容易理解的程序才是優(yōu)秀的程序員 Martin Fowler什么是重構(gòu)什么是重構(gòu)lRefactoring是對軟件內(nèi)部結(jié)構(gòu)的一種調(diào)整,目的是在不改變外部行為的前提下,提高其可理解性,降低其修改成本。為什么重構(gòu)為什么重構(gòu)l改進軟件的設(shè)計。l程序員對代碼所做的為了滿足短期利益代碼改動,或再沒有完全清楚增個架構(gòu)下的改動,都很容易是代碼失去它的清晰結(jié)構(gòu),偏離需求或設(shè)計。而這些改動的積累很容易使代碼偏離它原先設(shè)
2、計的初衷而變得不可立即和無法維護。lRefactoring則幫助重新組織代碼,重新清晰的體現(xiàn)結(jié)構(gòu)和進一步改進設(shè)計。為什么重構(gòu)為什么重構(gòu)l提高代碼質(zhì)量,更易被理解l容易理解的代碼可以很容易的維護和做進一步的開發(fā)。即使對寫這些代碼的程序員本身,容易理解代碼也可以幫助容易地做修改。程序代碼也是文檔。而代碼首先是寫給人看的,讓后才是給計算機看的。為什么重構(gòu)為什么重構(gòu)lRefactoring幫助盡早的發(fā)現(xiàn)錯(Bugs)lRefactoring是一個code review和反饋的過程。在另一個時段重新審視自己或別人代碼,可以更容易的發(fā)現(xiàn)問題和加深對代碼的理解。lRefactoring是一個良好的軟件開發(fā)習(xí)
3、慣。為什么重構(gòu)為什么重構(gòu)lRefactoring可以提高開發(fā)速度lRefactoring對設(shè)計和代碼的改進,都可以有效的提高開發(fā)速度。好的設(shè)計和代碼質(zhì)量實體提高開發(fā)速度的關(guān)鍵。在一個有缺陷的設(shè)計和混亂代碼基礎(chǔ)上的開發(fā),即使表面上進度較快,但本質(zhì)是試延后對設(shè)計缺陷的發(fā)現(xiàn)和對錯誤的修改,也就是延后了開發(fā)風(fēng)險,最終要在開發(fā)的后期付出更多的時間和代價。l項目的維護成本遠高于開發(fā)成本.何時重構(gòu)何時重構(gòu)?l添加新功能時一并重構(gòu)l為了增加一個新的功能,程序員需要首先讀懂現(xiàn)有的代碼。l修補錯誤時一并重構(gòu)l為了修復(fù)一個Bug,程序員需要讀懂現(xiàn)有的代碼。lCode Review時一并重構(gòu)何時不該重構(gòu)何時不該重構(gòu)?
4、l代碼太混亂,設(shè)計完全錯誤。與其Refactor,不如重寫。l明天是DeadLinel永遠不要做Last-Minute-Change。推遲Refactoring,但不可以忽略,即使進入Production的代碼都正確的運行。lRefactoring的工作量顯著的影響最后期限l一個Task的計劃是天,如果為了Refactoring,需要更多的時間( 天或更多)。推遲Refactoring,同步可以忽略??梢园堰@個Refactoring作為一個新的Task,或者安排在Refactoring的Iteration中完成。兩頂帽子兩頂帽子l重構(gòu)重構(gòu)與添加新功能添加新功能l添加新功能時,你不應(yīng)該修改既有代
5、碼,只管添加新功能。l重構(gòu)時你就不能再添加功能,只管改進程序結(jié)構(gòu)。此外你不應(yīng)該添加任何測試(除非發(fā)現(xiàn)有先前遺漏的東西)l兩頂“帽子”可同時進行,一會重構(gòu),一會添加新功能。重構(gòu)與設(shè)計重構(gòu)與設(shè)計 l重構(gòu)可以從很大程度上去扶助設(shè)計,通常情況下我們的設(shè)計不是能貫穿我們軟件開發(fā)的全過程的,在這個過程中,我們的需求變更的可能性非常大,當(dāng)需求變了,設(shè)計也得變,但是我們已有的實現(xiàn)怎么辦?全部廢除?顯然不能!這時候就要依靠重構(gòu)來解決這種矛盾。重構(gòu)與性能重構(gòu)與性能 l關(guān)于重構(gòu),有一個常被提出的問題:它對程序的性能將造成怎樣的影響?為了讓軟件易于理解,你常會作出一些使程序運行變慢的修改。這是個重要的問題。我并不贊成
6、為了提高設(shè)計的純潔性或把希望寄托于更快的硬件身上,而忽略了程序性能。已經(jīng)有很多軟件因為速度太慢而被用戶拒絕,日益提高的機器速度亦只不過略微放寬了速度方面的限制而已。但是,換個角度說,雖然重構(gòu)必然會使軟件運行更慢,但它也使軟件的性能優(yōu)化更易進行。關(guān)鍵在于自己的理解,當(dāng)你擁有了重構(gòu)的經(jīng)驗,你也就有能力在重構(gòu)的基礎(chǔ)上來改進程序的性能。重構(gòu)與模式重構(gòu)與模式l那么真正要實現(xiàn)重構(gòu)時,我們有哪些具體的方法呢?可以這樣說,重構(gòu)的準則由很多條,見重構(gòu)這本書。但它不是最終的標準,因為你要是完全按照它的標準來執(zhí)行,那你也就等于不會重構(gòu),重構(gòu)是一種武器,而真正運用武器的高手是沒有武器勝有武器。只有根據(jù)實際的需要,憑借
7、一定的思想,才能實現(xiàn)符合實際的重構(gòu),我們不能被一些固定的模式套牢了,這樣你的程序會很僵化。究竟如何把握這個度,需要大家去總結(jié)。重構(gòu)與思想重構(gòu)與思想 l要想實現(xiàn)一個好的重構(gòu),不是重構(gòu)本身,而是我們在寫代碼的時候,思想當(dāng)中時刻有它的位置存在!非常重要!如果你本身就沒想著要去重構(gòu),那么就是有再好的模式供你調(diào)用又怎么樣?就是有了好的模式,你不能根據(jù)實際的需要去融會貫通,那你做出來的重構(gòu)有意義么? 應(yīng)用范圍應(yīng)用范圍l代碼重構(gòu)l網(wǎng)頁重構(gòu)l設(shè)計重構(gòu)l.Refactoring的流程的流程l流程1l讀懂代碼(包括測試例子代碼)lRefactoringl運行所有的Unit Testsl流程2l讀懂代碼l應(yīng)用重構(gòu)工
8、具進行重構(gòu)(如Eclipse)代碼壞味道代碼壞味道l重復(fù)的代碼(Duplicated Code)l過長的函數(shù)(Long Method)l過大類(Large Class)l過長的參數(shù)列(Long Parameter List)l發(fā)散式變化(Divergent Change)l霰彈式修改(Shotgun Surgery)l依戀情結(jié)(Feature Envy)l數(shù)據(jù)泥團(Data Clumps)l基本型別偏執(zhí)(Primitive Obsession)lSwitch語句(Swtich Statements)l平行繼承體系(Parallel Inheritance Hierarchies)l冗贅類(La
9、zy Class)l夸夸其談未來性(Speculative Generality)l令人迷惑的暫時值域(Temporary Field)l過度遇合的消息鏈(Message Chains)l中間轉(zhuǎn)手人(Middle Man)l狎昵關(guān)系(Inappropriate Intimacy)l異曲同工的類(Alternative Classes with Different Interfaces)l不完善的程序庫類(Incomplete Library Class)l純粹的數(shù)據(jù)類(Data Class)l被拒絕的遺贈(Refused Bequest)l過多的注釋(Comments)重構(gòu)技巧重構(gòu)技巧l重新組
10、織你的函數(shù)l在對象之間搬移特性l重新組織數(shù)據(jù)l簡化條件表達式l簡化函數(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(將臨時變量內(nèi)聯(lián)化)(將臨時變量內(nèi)聯(lián)化)Replace Temp with Query(以(以查詢?nèi)〈R時變量)查詢?nèi)〈R時變量)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(剖解(剖解臨時變量)
16、臨時變量)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(移除對參數(shù)的賦值)(移除對參數(shù)的賦值)
17、Replace Method with Method Object(以函數(shù)對象取代函數(shù))(以函數(shù)對象取代函數(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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 湘師大版道德與法治九年級下冊3.1《多民族的大家庭》聽課評課記錄
- 教科版道德與法治八年級上冊6.2《公民的責(zé)任》聽課評課記錄
- 魯教版數(shù)學(xué)六年級上冊2.1《0科學(xué)計數(shù)法》聽評課記錄
- 岳麓版歷史七年級上冊第18課《漢代的科技與文化》聽課評課記錄
- 蘇科版數(shù)學(xué)九年級下冊5.1《二次函數(shù)》講聽評課記錄
- 五年級數(shù)學(xué)聽評課記錄表
- 人教版九年級數(shù)學(xué)上冊第二十二章二次函數(shù)《22.2二次函數(shù)與一元二次方程》第1課時聽評課記錄
- 【2022年新課標】部編版七年級上冊道德與法治第六課 交友的智慧 2課時聽課評課記錄
- 韓式餐廳承包經(jīng)營合同范本
- 個人入股分紅協(xié)議書范本
- 中國服裝零售行業(yè)發(fā)展環(huán)境、市場運行格局及前景研究報告-智研咨詢(2025版)
- 臨床提高膿毒性休克患者1h集束化措施落實率PDCA品管圈
- 心肺復(fù)蘇(最全版)完整版
- 春節(jié)節(jié)后施工復(fù)工安全培訓(xùn)
- GB/T 3478.1-1995圓柱直齒漸開線花鍵模數(shù)基本齒廓公差
- GB/T 1346-2001水泥標準稠度用水量、凝結(jié)時間、安定性檢驗方法
- FZ/T 25001-2012工業(yè)用毛氈
- 瑞幸咖啡SWOT分析
- DL∕T 1867-2018 電力需求響應(yīng)信息交換規(guī)范
- 小學(xué)生品德發(fā)展水平指標評價體系(小學(xué))
- 水利工程地震應(yīng)急預(yù)案
評論
0/150
提交評論