版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、RefactoringAgendan什么是重構(gòu)(What)n為什么需要重構(gòu)(Why)n何時進行重構(gòu)(When)n如何進行重構(gòu)(How)n一些重要常用的重構(gòu)方法(How many)n通過重構(gòu)來引入模式(The End)什么是重構(gòu)n重構(gòu)就是在不改變外部行為的條件下對現(xiàn)有代碼進行修改的過程n也就是對在工作的代碼進行改進,做而不是增加新的功能。為什么進行重構(gòu)n更簡單的設計n代碼更加簡潔易懂n提升結(jié)構(gòu)設計,更具擴展性n幫助你找到并減少bugn幫助你加快編碼速度n題外話:重構(gòu)已經(jīng)是程序員必備技能之一幾道家庭作業(yè)n“Refactoring may be the single most important t
2、echnical factor in achieving agility”(Jim Highsmith, Agile Software Development Ecosystems, page 155)n“Refactoring is like continuing repair of a livingsystem. The goal is to stay within reasonableoperating limits with limited continual damage.By staying within these limits you keep costslow, becaus
3、e costs relate nonlinearly to theamount of repair necessary. It is like maintainingyour house. You are best off (financially) if youcontinuously maintain rather than do large lumprepairs.”(Dirk Riehle (quoted in Jim Highsmiths Agile SoftwareDevelopment Ecosystems, page 155)n“Refactoring keeps you re
4、ady for change by keeping you comfortable with changing your code”(Ken Auer and Roy Miller, Extreme Programming Applied, page 189)n“Duplication & needless complexity are removed from the code during each coding session, even when this requires modifying components that are already “complete.” Au
5、tomated unit tests are used to verify every change.”(Lisa Crispin & Tip House, Testing Extreme Programming, page 5)n“A change to the system that leaves itsbehavior unchanged, but enhances somenonfunctional quality simplicity,flexibility, understandability, performance”(Kent Beck, Extreme Program
6、ming Explained, page 179)重構(gòu)的前提n單元測試n重構(gòu)技術是基于面向?qū)ο蟀l(fā)展出來n面向過程也有重構(gòu)n懂得重構(gòu)技能什么時候不重構(gòu)n程序原型n系統(tǒng)還不能工作n逼近交期n已經(jīng)要交付,效率提升沒有多大意義何時進行重構(gòu)n在下列三種情況下我們需要進行重構(gòu)n1.存在重復的時候。(三次法則)n2.當我們覺得代碼或代碼所表達的意圖不清晰的時候。n3.當我們察覺到代碼有bad smells 的時候。nBad smells例子何時進行重構(gòu)-bad smells(注釋)n注釋:n大多數(shù)注釋存在的理由都是用來彌補拙劣代碼的不足(對外接口注釋除外)。n如果覺得有必要編寫一條注釋的話,首先考慮重構(gòu)或重
7、寫代碼。n下面看看一個注釋的例子:何時進行重構(gòu)-bad smells(注釋)private RequestHeadercreateHeader() RequestHeaderheader = new RequestHeader(); /create source SourceDTOsource = new SourceDTO(); UniqueIDDTOsourceID= new UniqueIDDTO(); sourceID.setType(UniqueIDType.HOTEL); sourceID.setId(SOURCE_ID); source.setUniqueID(sourceID)
8、; header.setSource(source); /create requestor RequestorDTOrequestor = new RequestorDTO(); UniqueIDDTOuniqueId= new UniqueIDDTO(); uniqueId.setType(UniqueIDType.TRAVEL_AGENCY); uniqueId.setId(CHANNEL_PASSPORT); requestor.setUniqueID(uniqueId); header.setRequestor(requestor); header.setTaskId(TASK_ID)
9、; return header;何時進行重構(gòu)-bad smells(數(shù)據(jù)類)n數(shù)據(jù)類:典型的數(shù)據(jù)類只包含數(shù)據(jù)而沒有絲毫行為。只有一些get/set方法。何時進行重構(gòu)-bad smells(數(shù)據(jù)類)一個簡單的數(shù)據(jù)類例子:public class Point private int x; private int y; public Point() this(0, 0); public Point(int x, int y) this.x= x; this.y= y; /set/get方法省略何時進行重構(gòu)-bad smells(數(shù)據(jù)類)PHP OO程序員常見的壞習慣:class Point var
10、$x; var $y; function _construct () Self(0, 0); function _construct($x, $y) $this-x= $x; $this-y= $y; /set/get方法省略何時進行重構(gòu)-bad smells(代碼重復)n代碼重復:n這個是性質(zhì)最惡劣的味道。n各種形式的重復代碼是優(yōu)質(zhì)代碼的最大敵人。n出現(xiàn)重復的情況有些是顯而易見的,有些則不是很容易就能發(fā)現(xiàn)的。n出現(xiàn)重復的最簡單形式就是同一個表達式出現(xiàn)在多個方法中。這個也是大家最常見的重復例子。何時進行重構(gòu)-bad smells(代碼重復)public class MovieList /影片部
11、數(shù) private intnumberOfMovies= 0; private Collection movies = new ArrayList(); /影片部數(shù) public intsize() return movies.size(); public void add(Moviemovie) movies.add(movie); numberOfMovies+; 何時進行重構(gòu)-bad smells(交往不當)n交往不當:n一個類對另一個類的內(nèi)部細節(jié)知道得太多。n遇到這種情況,我們就需要對方法進行遷移,讓那些彼此了解的代碼在一個位置。何時進行重構(gòu)-bad smells(交往不當)n下面看一
12、個例子,這個方法掌握了關于Movie類結(jié)構(gòu)的一切信息,如果Movie的結(jié)構(gòu)方式變化,那么像這樣的方法就需要跟著改變:何時進行重構(gòu)-bad smells(交往不當)n大家管好自己的事情-封裝自己的責任何時進行重構(gòu)-bad smells(交往不當)n對繼承來說也會出現(xiàn)同樣的問題,即子類過多的了解父類的實現(xiàn)細節(jié),超出它們所應該了解的。這種情況我們可以把繼承換成委托(delegation)或者將父類的具體細節(jié)設為私有來解耦何時進行重構(gòu)-bad smells( 交往不當)n類的尺寸過大:n如果我們發(fā)現(xiàn)代碼中存在比較大的類時,就應該仔細檢查一下了。看看是什么原因?qū)е滤^大。想要完成的工作太多?是了解的東西
13、太多?條件判斷導致的?針對不同的情況可以采用不同的重構(gòu)方法和策略。n可以用checkstyle方便的檢查出代碼中是不是存在類過大的情況。何時進行重構(gòu)-bad smells( 懶惰類 )n懶惰類:n這個是與大尺寸類剛好相反的情況,懶惰類不能充分體現(xiàn)其價值,可以和別的適當?shù)念惣右院喜?。何時進行重構(gòu)-bad smells(方法過長)n方法過長:n多長的代碼算長了?如果看行數(shù)的話,任何超過20行的代碼都算長。如果看職責的話,任何完成超出一件工作的方法都算長。n通過將功能內(nèi)聚的代碼塊拆分到各自獨立的方法中,可以消減方法的尺寸并使代碼更容易理解。何時進行重構(gòu)-bad smells(switch 語句)ns
14、witch 語句:n不加約束的使用switch語句意味著沒有深入理解面向?qū)ο蟮脑瓌t。nswitch語句的結(jié)果往往導致霰彈式的修改。n我們常??梢允褂枚鄳B(tài)以一種更好的方式來代替switch語句。何時進行重構(gòu)-bad smells(霰彈式的修改)n霰彈式的修改(shotgun surgery):n這個并不算是源自代碼的味道,更是出于我們與代碼打交道的方式。n當我們要修改某一處功能,卻發(fā)現(xiàn)需要改動多個不同的classes的代碼,這就表明了出現(xiàn)了這種問題,這注定要成為災難。n常見的例子就是需要在多個類和方法的switch語句中添加一條子句。何時進行重構(gòu)-bad smells(發(fā)散式變化)n發(fā)散式變化(
15、divergent change):n如果某個class經(jīng)常因為不同的原因在不同的方向上發(fā)生變化,就表明發(fā)散式變化出現(xiàn)了。n霰彈式修改n是指一種變化引發(fā)多個classes修改n發(fā)散式變化是指一個class受多種變化的影響n這兩種情況下都需要重構(gòu)代碼,達到變化與修改一一對應。如何進行重構(gòu)n準備好自動測試環(huán)境,這些測試能在我們執(zhí)行重構(gòu)時及時的向我們反饋重構(gòu)是否傷到原有行為。n小步前進,在每一步重構(gòu)完成時運行測試。以便于最快的檢查重構(gòu)的有效性。如果失敗,必須恢復到正確代碼,再嘗試進一步的重構(gòu)。n擅于使用優(yōu)良的重構(gòu)工具可以大大減少我們重構(gòu)所需的時間。一些重要常用的重構(gòu)方法n重構(gòu)方法很多,僅Refact
16、oring:Improvingthe Design of Existing Code中就講述了近百種重構(gòu)方法,還有很多重構(gòu)方法沒有列入。n下面將介紹十二種比較重要且常用重構(gòu)方法。重構(gòu)方法-提取方法(Extract method)n提取方法n當一個方法太長或邏輯過于復雜而不易理解時,我們可以將其中的某些部分提取出來而形成各自獨立的方法。重構(gòu)方法-提取方法(Extract method)重構(gòu)方法-提取方法(Extract method)重構(gòu)方法-用委托來代替繼承n用委托來代替繼承(Replace Inheritance witch Delegation):n我們應當只在子類對超類進行擴展而不僅僅是
17、覆寫超類的部分功能時,才使用繼承。n如果只是為了重用超類的某些功能的話,應該用委托來代替繼承。重構(gòu)方法-用委托來代替繼承重構(gòu)方法-用委托來代替繼承接著想設計個“正方形”類別很多人會想到使用繼承:public Square extends Rectangle 多好啊,什么都不用干,就可重復使用Rectangle的area()方法了。這樣會有什么問題呢?重構(gòu)方法-用委托來代替繼承n這個繼承結(jié)構(gòu)有個不足之處,Square從Rectangle繼承了setWidth()和setLength() 函數(shù),這個對Square而言是副作用的,如果給Square的setWidth()和setLength()設置不
18、一樣的值,則Square的4邊就不等長了。這時可以使用委托來代替繼承重構(gòu)方法-用子類代替型別碼n用子類來代替型別碼(Replace Type with Subclasses):n當我們的類使用型別碼來表示子類的時候(例如,雇員分工程師,銷售人員和管理人員),就可以使用這種重構(gòu)方法。n針對每種類型分別設計子類可以消除那些根據(jù)型別碼進行判別的復雜的條件判斷和switch語句。重構(gòu)方法-用子類代替型別碼重構(gòu)方法-用多態(tài)來代替條件判斷n用多態(tài)來代替條件判斷(Replace conditional with Polymorphism):n當我們發(fā)現(xiàn)代碼中有switch語句時,可以考慮創(chuàng)建子類處理不同的情
19、況,從而去掉switch語句。重構(gòu)方法-用多態(tài)來代替條件判斷重構(gòu)方法-用多態(tài)來代替條件判斷n多態(tài)替代Switch重構(gòu)方法-模板函數(shù)n模板函數(shù)(Form Template Method):n當我們在多個類中都有某種具有相同結(jié)構(gòu)但不同細節(jié)的相似方法時就可以使用這種重構(gòu)方法。n相同結(jié)構(gòu)的方法放在父類中,提取出來的細節(jié)具體方法在子類中實現(xiàn)。重構(gòu)方法-模板函數(shù)n輸出工程師員工的XML重構(gòu)方法-模板函數(shù)n輸出雇員(Salesman )的XML表示方法:重構(gòu)方法-模板函數(shù)n范例:輸出雇員(Manager)的XML表示方法:重構(gòu)方法-模板函數(shù)n它們之間的唯一差別就是department不同,我們把toXML方
20、法提到父類中作為模板方法,具體細節(jié)差異方法depertmentName()在子類中實現(xiàn)了,在模板方法中調(diào)用那個多態(tài)方法:重構(gòu)方法-提取類(Extract class)n提取類:n當一個類變得太大或其行為邏輯組織分散時,我們需要將其分成多塊內(nèi)聚的行為并在需要的時候創(chuàng)建新類。重構(gòu)方法-提取類(Extract class)重構(gòu)方法-提取類(Extract class)n可以將與電話號碼相關的行為分離到一個獨立的class中:重構(gòu)方法-提取接口(Extract interface)n提取接口:n當兩個classes的接口有部分相同,可以考慮提取接口。重構(gòu)方法-提取接口(Extract interface)n我們需要從MovieList中提取出來一個接口n最后就是把對MovieList的引用修改成對IMovieList的引用。我們就能為IMovieList接口創(chuàng)建包含mock對象在內(nèi)的其他實現(xiàn)了。重構(gòu)方法-引入解釋變量n引入解釋變量(Introduce Explaining Variable):n當表達式復雜且難以理解時,我們就可以提取其中的某些部分,把中間結(jié)果保留在命名清楚的臨時變量中。n把表達
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 幼兒園元旦活動計劃8篇
- 2024年版企業(yè)勞動協(xié)議參考文本版B版
- 小區(qū)物業(yè)工作計劃
- 2024-2030年中國酚醛樹脂涂料行業(yè)發(fā)展運行現(xiàn)狀及投資潛力預測報告
- 半導體激光治療儀項目可行性分析報告
- 大學班主任工作計劃
- 美術教師個人工作總結(jié)5篇
- 醫(yī)學類實習報告模板九篇
- 《桂花雨》教案15篇
- 新媒體營銷(第三版) 課件 項目四 新媒體短視頻營銷
- 2024-2030年中國游艇產(chǎn)業(yè)發(fā)展狀況規(guī)劃分析報告權威版
- 學前兒童家庭與社區(qū)教育學習通超星期末考試答案章節(jié)答案2024年
- 網(wǎng)絡安全產(chǎn)品質(zhì)保與售后方案
- 2024-2025學年河北省高三上學期省級聯(lián)測政治試題及答案
- 貴州省貴陽市2023-2024學年高一上學期期末考試 物理 含解析
- 幼兒園班級管理中的沖突解決策略研究
- 【7上英YL】蕪湖市2023-2024學年七年級上學期英語期中素質(zhì)教育評估試卷
- 2024年度中國鈉離子電池報告
- 2024年問政山東拆遷協(xié)議書模板
- 浪潮iqt在線測評題及答案
- 山東省青島市2023-2024學年高一年級上冊1月期末選科測試 生物 含解析
評論
0/150
提交評論