![代碼里壞味道_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/15/12fa4f38-904d-43b8-a345-9983c06bf488/12fa4f38-904d-43b8-a345-9983c06bf4881.gif)
![代碼里壞味道_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/15/12fa4f38-904d-43b8-a345-9983c06bf488/12fa4f38-904d-43b8-a345-9983c06bf4882.gif)
![代碼里壞味道_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/15/12fa4f38-904d-43b8-a345-9983c06bf488/12fa4f38-904d-43b8-a345-9983c06bf4883.gif)
![代碼里壞味道_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/15/12fa4f38-904d-43b8-a345-9983c06bf488/12fa4f38-904d-43b8-a345-9983c06bf4884.gif)
![代碼里壞味道_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/15/12fa4f38-904d-43b8-a345-9983c06bf488/12fa4f38-904d-43b8-a345-9983c06bf4885.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、重復代碼 癥狀: 重復的表達式 不同算法做相同的事 類似代碼 措施: 一個類中包含兩段重復代碼時,使用提煉方法提煉方法置于一處 兩個相同層次的類含有重復代碼時,提煉方法,方法上移提煉方法,方法上移 兩個無關類中出現(xiàn)重復代碼時,提煉方法提煉方法至其中一個類或其他類中供調用例:方法上移例:方法上移class Customer private Date lastBillDate; addBill(Date dat,double amount)class RegularCustomer:Customer createBill(Date) chargeFor(Date start,Date end)cl
2、ass PreferredCustomer:Customer createBill(Date) chargeFor(Date start,Date end)class Customer private Date lastBillDate; addBill(Date dat,double amount) createBill(Date) abstract double chargeFor(Date start,Date end)class RegularCustomer:Customer chargeFor(Date start,Date end)class PreferredCustomer:
3、Customer chargeFor(Date start,Date end)3方法過長 癥狀: 存在大量的代碼行 注釋 條件和循環(huán) 措施: 每當需要注釋時,寫一個方法來代替注釋 絕大多數(shù)場合下,采取提煉方法技術提煉方法技術來縮短函數(shù) 方法帶有很多參數(shù)和臨時變量時,采取查詢替換臨時變查詢替換臨時變量量和鏈式調用替換臨時變量鏈式調用替換臨時變量來消除臨時變量;采用引入引入?yún)?shù)對象參數(shù)對象和保留完整對象保留完整對象技術瘦身參數(shù)列表;重型武器:使用方法對象替換方法方法對象替換方法 使用分解條件語句分解條件語句處理條件表達式;使用集合閉包方法集合閉包方法替換循環(huán)例:查詢替換臨時變量例:查詢替換臨時變量
4、/這是未做重構的簡單方法這是未做重構的簡單方法double getPrice() int basePrice=_quantity*_itemPrice; double discountFactor; if(basePrice1000) discountFactor=0.95; else discountFactor=0.98; return basePrice*discountFactor;/重構之后的主方法重構之后的主方法double getPrice() return basePrice()*discountFactor();/把臨時變量賦值語句等號右邊的表達式提煉成一個方法private
5、 int basePrice() return _quantity*_itemPrice;/有了basePrice()的基礎很容易提煉出下面的方法private double discountFactor() if(basePrice()1000) return 0.95; else return 0.98;5例:引入?yún)?shù)對象例:引入?yún)?shù)對象class Entry. Entry(double value,Date chargeDate) _value=value; _chargeDate=chargeDate; Date getDate() return _chargeDate; double
6、 getValue() return _value; private Date _chargeDate; private double _value;class Account. double getFlowBetween(Date start,Date end) double result=0; Enumeration e = _entries.elements(); while(e.hasMoreElements() Entry each=(Entry)e.nextElement(); if(each.getDate().equals(start)|each.getDate().equal
7、s(end)|(each.getDate().after(start)&each.getDate().before(end) result+=each.getValue(); return result; double flow=anAccount.getFlowBetween(startDate,endDate);6例:引入?yún)?shù)對象例:引入?yún)?shù)對象class DateRange boolean include(Date arg) return (arg.equals(_start)|arg.equals(_end)&(arg.after(_start)|arg.before(
8、_end) DateRange(Date start,Date end) _start=start; _end=end; Date getStart() return _start; Date getEnd() return _end; private final Date _start; private final Date _end;class Account. double getFlowBetween(DateRange range) double result=0; Enumeration e = _entries.elements(); while(e.hasMoreElement
9、s() Entry each=(Entry)e.nextElement(); if(range.includes(each.getDate() result+=each.getValue(); return result; double flow=anAccount.getFlowBetween(new DateRange (startDate,endDate); 7例:保持對象完整int low = daysTempRange().getLow();int high = daysTempRange().getHigh();withinPlan = plan.withinRange(low,
10、high);withinPlan = plan.withinRange(daysTempRange();8類太大 癥狀: 出現(xiàn)太多實例變量 包含太多代碼 措施: 提煉類提煉類把一些變量打包 可以作為子類時,提煉子類提煉子類 無法作為委托時,提煉模塊提煉模塊參數(shù)列表太長 癥狀: 參數(shù)列表過長 參數(shù)列表變化頻繁 措施: 傳遞對象傳遞對象,使方法自己獲取它需要的參數(shù) 參數(shù)來自同一對象或是對象本身,保留整個對象為參數(shù)保留整個對象為參數(shù) 參數(shù)來自不同對象,引入?yún)?shù)對象引入?yún)?shù)對象或者引入命名參數(shù)引入命名參數(shù)發(fā)散式變化 癥狀: 一個類因為不同的理由以不同的方式修改 措施: 將兩類變化涉及的方法拆為兩個對象
11、,每個對象只因為同一類變化而變化 將某種特定原因造成的所有變化提煉為一個新類,新類處理這一類變化霰彈式修改 癥狀: 發(fā)生一次改變時,需要修改多個類的多個地方 措施: 使用移動字段和移動方法將所有修改集中到單個類中。若現(xiàn)有類無好的候選者,創(chuàng)建;通??梢允褂脙嚷?lián)化類內聯(lián)化類將整組行為整合到一起。特性依賴 癥狀: 一個方法調用其他類的方法比較多 一個方法調用到多個類的功能 措施: 移動方法至另一適當?shù)膶ο笾?看哪個類含有最多的數(shù)據(jù)就把方法和那些數(shù)據(jù)放在一起數(shù)據(jù)泥團 癥狀: 兩個類中相同的實例變量 許多方法簽名中相同的參數(shù) 措施: 對于實例變量,使用提煉類將其變成一個對象 對于方法簽名,引入?yún)?shù)對象引
12、入?yún)?shù)對象或保留完整對象保留完整對象來瘦身基本類型偏執(zhí) 癥狀: 使用了基本類型(fixnum、string、array) 措施: 使用對象替換數(shù)據(jù)值使用對象替換數(shù)據(jù)值 使用多態(tài)替換類型碼使用多態(tài)替換類型碼 使用模塊擴展替換類型碼使用模塊擴展替換類型碼 使用狀態(tài)或策略模式替換類型碼使用狀態(tài)或策略模式替換類型碼 使用對象替換數(shù)組使用對象替換數(shù)組例:使用對象替換數(shù)組例:使用對象替換數(shù)組有一個數(shù)組String row=new String3;row0=Liverpool;row1=15;String name=row0;int wins=Integer.parseInt(row1);class Per
13、formance private string _name; private int _wins; public string getName() return _name; public void setName(string arg) _name=arg; public int getWins() return _wins public void setWins(int arg) _wins=arg; 16case語句 癥狀: 代碼使用了case語句 措施: 用多態(tài)替換case語句 提煉方法,先把case語句提煉出來; 移動方法至需要多態(tài)行為的類; 選擇技術:使用多態(tài)替換類型碼、模塊擴展替
14、換類型碼、狀態(tài)或策略模式替換類型碼 若分支很少,只在一個方法里起作用,使用顯示方法替顯示方法替換參數(shù)換參數(shù)或引入引入Null對象對象來替換case語句平行繼承體系 癥狀: 為某個類增加子類時,必須為另一個類增加子類 某個繼承體系類名前綴和另一個繼承體系類名前綴相同 措施: 使用移動字段和移動方法冗贅類 癥狀 類并沒有做什么工作 措施: 削減層次削減層次 內聯(lián)化類或內聯(lián)化模塊內聯(lián)化類或內聯(lián)化模塊純臆測的泛化 癥狀: 類或模塊沒太大用處 方法、代碼分支,或整個類的用戶只有測試用例 措施: 類或模塊沒太大用處,使用削減層次削減層次 不必要的委托,通過內聯(lián)化類內聯(lián)化類來移除 帶有未使用參數(shù)的方法,使用
15、移除參數(shù)移除參數(shù) 不必要的方法、代碼,刪除臨時字段癥狀: 某個實例變量僅為某種情況而設置 某些實例變量僅為某個函數(shù)的復雜算法少傳參數(shù)而設置措施: 提煉類提煉類,封裝這些變量和需要他們的方法為方法對象方法對象 引入引入null對象對象為變量無效時創(chuàng)建額外組件,消除條件代碼消息鏈 癥狀: 一長串的 get_This 或臨時變量 措施: 使用隱藏委托隱藏委托技術中間人 癥狀: 一個類的接口中有很多方法在委托另一個類 措施: 這種方法數(shù)目很多時,使用移除中間人移除中間人技術,直接和干活的對象打交道 這種方法的數(shù)目不多時,內聯(lián)化方法內聯(lián)化方法到調用者中 這種方法包含額外的行為時,使用層次替換委托層次替換
16、委托,將實際對象變成一個模塊 過分親密 癥狀 一個類訪問了另一個類的私有部分。 措施 使用移動方法和移動字段可以降低親密程度 將雙向關聯(lián)改成單向將雙向關聯(lián)改成單向 使用提煉類將公共部分提煉到安全之處 子類知道太多父類不想讓他們知道的東西,使用委托替委托替換繼承換繼承讓他們離家異曲同工的類 癥狀: 完成相同工作,但卻使用了不同的方法名 措施: 使用重命名方法重命名方法 使用移動方法將行為移到類中 因此出現(xiàn)冗余代碼時,使用提煉模塊提煉模塊或引入繼承引入繼承來修正不完善的類庫 癥狀: 類庫中函數(shù)構造的不夠好,想擴展時可能很棘手 措施: 使用移動方法將需要的行為直接移到類庫中去數(shù)據(jù)類 癥狀: 類僅由屬性構成,純粹用來持有數(shù)據(jù),過分細致的依賴于其他類 措施: 對任何不應被修改的實例變量采用移除設值方法移除設值方法 運用封裝集合技術封裝集合技術封裝集合實例變量 嘗試移動方法將相關行為移到數(shù)據(jù)類中,對一些設值方法和取值方法使用隱藏方法隱藏方法被拒絕的饋贈 癥狀 子類不需要或僅需少部分父類的方法和數(shù)據(jù) 措施 創(chuàng)建兄弟子類,使用方法下移,將所有不用的方法移到兄弟類中(不推薦) 若子類沖用了行為卻不想支持父類里的公共方法時,應該使用委托替換繼承技術委托替換繼承技術注釋 癥狀: 存在注釋 措施: 提煉方法替代注釋 提煉之后還需注釋,則重命名方法 若需
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 魯教版地理七年級下冊第十一章《中國在世界中》聽課評課記錄1
- 模具車間主管年終總結
- 裝修監(jiān)理個人年終工作總結
- 客服前臺工作計劃范文
- 工業(yè)生產廠房租賃合同范本
- 編劇合作協(xié)議書范本
- 電玩城員工協(xié)議書范本
- 湘教版數(shù)學九年級上冊4.4《解直角三角形的應用》(第1課時)聽評課記錄
- 初三蘇州中考數(shù)學試卷
- 蕪湖脫硫煙囪施工方案
- 發(fā)生輸液反應時的應急預案及處理方法課件
- 中國旅游地理(高職)全套教學課件
- 數(shù)字貨幣的匿名性與反洗錢
- 門脈高壓性消化道出血的介入治療課件
- 民航保密培訓課件
- 兒童尿道黏膜脫垂介紹演示培訓課件
- 詩詞寫作入門
- 學校教育中的STEM教育模式培訓課件
- 電器整機新產品設計DFM檢查表范例
- 樁基礎工程文件歸檔內容及順序表
- 不同產地半夏總生物堿含量測定
評論
0/150
提交評論