青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 181  文章 - 15  trackbacks - 0
<2008年5月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用鏈接

留言簿(1)

隨筆分類(lèi)

隨筆檔案

My Tech blog

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

3.10Switch Statement
面向?qū)ο蟮囊粋€(gè)最明顯特征就是:少用switch或case語(yǔ)句。從本質(zhì)上講,switch語(yǔ)句的問(wèn)題在于重復(fù)。通常用多態(tài)來(lái)解決Switch 語(yǔ)句帶來(lái)的壞味道。switch語(yǔ)句常常根據(jù)type code進(jìn)行選擇,你要的是與該type code相關(guān)的函數(shù)或class。所以你應(yīng)該使用Extract Method將switch語(yǔ)句提煉到一個(gè)獨(dú)立的函數(shù)中,再以Move Method將他搬移到需要多態(tài)的那個(gè)class里頭。此時(shí)你必須決定是否使用Replace Type Code with Subclass或Replace Type Code with State/Strategy。一旦這樣完成繼承結(jié)構(gòu)之后,你就可以Replace Conditional with Polymorphism了。
如果你只是在單一函數(shù)中有些選擇事例,而你并不想改動(dòng)它們,那么“多態(tài)”就有點(diǎn)殺雞用牛刀了。這種情況下Replace Parameter with Explicit Method是個(gè)不錯(cuò)的選擇。如果你的選擇條件之一是null,可以試試Introduce Null Object。
3.11Parallel Inheritance Hierarchies(平行繼承關(guān)系)
在這種情況下,每當(dāng)你為某個(gè)class增加一個(gè)subclass,必須也為另外一個(gè)class相應(yīng)增加一個(gè)subclass。如果你發(fā)現(xiàn)某個(gè)繼承體系的class名稱前綴和另一個(gè)繼承體系的class名稱前綴完全相同,便是聞到了這種壞味道。消除這種重復(fù)性的一般策略是:讓一個(gè)繼承體系的實(shí)體(instance)指涉(參考、引用、refer to)另一個(gè)繼承體系的實(shí)體。如果再接再厲運(yùn)用Move Method和Move Field,就可以將指涉端的繼承實(shí)體消弭。

3.12Lazy Class(冗贅類(lèi))
你所創(chuàng)建的每一個(gè)class,都得有人去理解它、維護(hù)它,這些工作都是要花錢(qián)的。如果一個(gè)class的所得不值其身價(jià),它就應(yīng)該消失。項(xiàng)目中經(jīng)常會(huì)出現(xiàn)這樣的情況:某個(gè)class原本對(duì)得起自己的身價(jià),但重構(gòu)使它身形縮水,不再做那么多工作;或開(kāi)發(fā)者事前規(guī)劃了某些變化,并添加一個(gè)class來(lái)對(duì)付這些變化,但變化實(shí)際上沒(méi)有發(fā)生。如果某些subclass沒(méi)有做滿足夠工作,試試Collapse Hierarchy。對(duì)于幾乎沒(méi)用的組件,你應(yīng)該以inline class對(duì)付它們。
Collapse Hierarchy(折疊繼承體系)
superclass和subclass之間無(wú)太大區(qū)別。
將它們合為一體。
動(dòng)機(jī)
如果你曾經(jīng)寫(xiě)過(guò)繼承體系,你就會(huì)知道,繼承體系很容易變得過(guò)分復(fù)雜。所謂重構(gòu)繼承體系,往往是將函數(shù)和值域在體系中上下移動(dòng)。完成這些動(dòng)作后,你很可能發(fā)現(xiàn)某個(gè)subclass并未帶來(lái)該有的價(jià)值,因此需要把classes合并(折疊)起來(lái)。
作法:
選擇你想移除的class:是superclass還是subclass?
使用pull up Field和pull up method或者push down method和push down field,把想要移除的class內(nèi)的所有行為和數(shù)據(jù)搬移到另一個(gè)class。
每次移動(dòng)后,編譯并測(cè)試。
調(diào)整“即將被移除的那個(gè)class”的所有引用點(diǎn),令它們改而引用合并(折疊)后留下的class。這個(gè)動(dòng)作將會(huì)影響到變量的聲明、參數(shù)的型別以及構(gòu)造函數(shù)。
移除我們的目標(biāo);此時(shí)它應(yīng)該已經(jīng)成為一個(gè)空類(lèi)。
編譯、測(cè)試。

3.13Speculative Generality(夸夸其談未來(lái)性)
如果所有的裝置都會(huì)被用到,那就值得處理這些非必要的事情;如果用不到就不值得。用不上的裝置只會(huì)擋你的路,所以,把它搬開(kāi)吧。
如果函數(shù)或class的唯一用戶是test cases(測(cè)試用例),這就飄出了壞味道。如果你發(fā)現(xiàn)這樣的函數(shù)或class,請(qǐng)把它們連同其test case都刪掉。但如果他們的用途是幫助test cases檢測(cè)正當(dāng)功能,當(dāng)然必須刀下留人。
3.14Temporary Field(令人迷惑的暫時(shí)值域)
有時(shí)你會(huì)看到這樣的對(duì)象:其內(nèi)某個(gè)instance變量?jī)H為某種特定情勢(shì)而設(shè)。這樣的代碼讓人不易理解,因?yàn)槟阃ǔUJ(rèn)為對(duì)象在所有時(shí)候都需要它的所有變量。在變量未被使用的情況下猜測(cè)起當(dāng)初設(shè)置的目的,會(huì)讓你發(fā)瘋。
請(qǐng)使用Extract Class給這個(gè)可憐的孤兒創(chuàng)造一個(gè)家,然后把所有和這個(gè)變量相關(guān)的代碼都放進(jìn)這個(gè)新家。
如果class中有一個(gè)復(fù)雜算法,需要好幾個(gè)變量,往往就可能導(dǎo)致這種壞味道。由于實(shí)現(xiàn)者不希望傳遞一長(zhǎng)串參數(shù),所以他把這些參數(shù)都放進(jìn)值域中,但是這些值域只在使用該算法的時(shí)候才有效,其他情況下只會(huì)讓人迷惑。這個(gè)時(shí)候可以用Extract Class把這些變量和其相關(guān)的函數(shù)提煉到一個(gè)獨(dú)立的class中,提煉后的新對(duì)象是一個(gè)method object。
3.15Message Chains(過(guò)渡耦合的消息鏈)
用戶索求對(duì)象,然后向求得的對(duì)象繼續(xù)索求對(duì)象。
這時(shí)候應(yīng)該使用Hide Delegate。應(yīng)該先觀察Message Chain最終得到的對(duì)象是用來(lái)干什么的,看看能否以Extract Method把使用該對(duì)象的代碼提煉到一個(gè)獨(dú)立函數(shù)中,再運(yùn)用Move Method把這個(gè)函數(shù)推入Message Chain。
Hide Delegate(隱藏委托關(guān)系)

 當(dāng)類(lèi)圖如上所示時(shí),客戶端如果想要獲得對(duì)應(yīng)Person的Manager,需要如下過(guò)程:

Department department = person.Department;
            Manager manager 
= department.Manager;

通過(guò)重構(gòu),為類(lèi)Person添加屬性Manager,如:

 1 public class Person
 2     {
 3         private Department _department;
 4         public Department Department
 5         {
 6             get
 7             {
 8                 return _department;
 9             }
10             set
11             {
12                 _department = value;
13             }
14         }
15         public Manager Manger
16         {
17             get
18             {
19                 return _department.Manager;
20             }
21         }
22     }

這樣客戶端可以這樣寫(xiě):
Manager manager = person.Manger;
當(dāng)然如果person不屬于任何一個(gè)部門(mén),那么程序就會(huì)出錯(cuò)。這里其實(shí)可以引入Null Object來(lái)解決問(wèn)題。

3.16Middle Man(中間轉(zhuǎn)手人)
人們可能會(huì)過(guò)渡運(yùn)用delegation。你也許會(huì)看到某個(gè)class所實(shí)現(xiàn)的接口有一半的函數(shù)都委托給其他class,這樣就使過(guò)渡運(yùn)用。這時(shí)你應(yīng)該使用Remove Middle Man,直接和職責(zé)對(duì)象打交道。如果這樣“不干實(shí)事”的函數(shù)只有少數(shù)幾個(gè),可以運(yùn)用inline Method把它們放進(jìn)調(diào)用端。如果這些Middle Man 還有其他的行為,你可以運(yùn)用Replace Delegation with Inheritance把它們變成實(shí)責(zé)對(duì)象的subclass,這樣你既可以擴(kuò)展原對(duì)象的行為,又不必負(fù)擔(dān)那么多的委托動(dòng)作。
Remove Middle Man
這個(gè)重構(gòu)過(guò)程和Hide Delegate剛好相反。
Replace Delegation with Inheritance

這個(gè)重構(gòu)過(guò)程就是把關(guān)聯(lián)關(guān)系轉(zhuǎn)換為繼承關(guān)系。


轉(zhuǎn)變?yōu)?br>
3.17Inappropriate Intimacy
當(dāng)兩個(gè)類(lèi)彼此關(guān)系緊密地時(shí)候,有可能是他們所包含的方法或值域處在錯(cuò)誤的類(lèi)中而導(dǎo)致,此時(shí)應(yīng)當(dāng)通過(guò)Move Method或Move Field把它們移動(dòng)到合適的位置。應(yīng)當(dāng)看一下兩個(gè)類(lèi)之間是否真的需要雙向?qū)Ш疥P(guān)系,如果不是,讓它們之間的關(guān)系變?yōu)閱蜗驅(qū)Ш疥P(guān)系。或者通過(guò)Extract Class把共同的函數(shù)或值域抽取出來(lái),讓每一個(gè)Class直接去調(diào)用被抽取出來(lái)的類(lèi)。另外如果是子類(lèi)和父類(lèi)過(guò)分耦合,則可以通過(guò)將繼承轉(zhuǎn)換為關(guān)聯(lián)的手段來(lái)降低耦合性。
3.18Alternative Classes with Different Interfaces(異曲同工的類(lèi))
如果兩個(gè)函數(shù)做同一件事,卻有著不同的簽名式,應(yīng)當(dāng)運(yùn)用Rename Method根據(jù)它們的用途重新命名。請(qǐng)反復(fù)運(yùn)用Move Method將某些行為移入classes,直到兩者的協(xié)議一致為止。或許可以使用Extract Superclass來(lái)解決問(wèn)題。
3.19Incomplete Library Class(不完美的程序庫(kù)類(lèi))
當(dāng)你面對(duì)的程序類(lèi)庫(kù)不夠好( 或者不能滿足要求)而你又不能直接改變它時(shí),可以采用Introduce Foreign Method 方法來(lái)修改其中一兩個(gè)函數(shù),或者使用Introduce Local Extension來(lái)添加行為。
Introduce Foreign Method (162)
在client class建立一個(gè)函數(shù),并以一個(gè)server class實(shí)體作為第一個(gè)參數(shù)。書(shū)中的例子:

Introduce Local Extension(164)
這種重構(gòu)方式實(shí)際上就是從已封裝的類(lèi)庫(kù)中繼承你認(rèn)為功能不足的那個(gè)類(lèi),然后添加你想要實(shí)現(xiàn)的功能。當(dāng)然,有時(shí)候你想擴(kuò)展的那個(gè)類(lèi)碰巧加上了關(guān)鍵字final(java) 或sealed(c#),這樣就沒(méi)辦法了。
3.20Data Class(純稚的數(shù)據(jù)類(lèi))
所謂Data Class是指:它們擁有一些值域,以及用于訪問(wèn)這些值域的函數(shù),除此之外一無(wú)長(zhǎng)物。早期的Data Class可能會(huì)包含public值域或容器類(lèi)值域,應(yīng)當(dāng)首先將它們封裝起來(lái)(用屬性或特定方法)。盡量可能的把外界操縱這些值域的方法搬移到類(lèi)里面來(lái),那些不應(yīng)該被其他classes修改的值域,請(qǐng)運(yùn)用Remove Setting Method。
Remove Setting Method
即去調(diào)設(shè)值函數(shù)或?qū)傩灾械膕et讓它變?yōu)橹蛔x。
3.21Refused Bequest
當(dāng)子類(lèi)不愿意繼承父類(lèi)的某些東西時(shí),建議將繼承修改為關(guān)聯(lián)。不建議隨便修改繼承體系。這是一種很淡的壞味道。
3.22Comments(過(guò)多的注釋)
注釋本身并不是壞味道,它可以幫助我們找到代碼中的壞味道。
如果你需要注釋來(lái)解釋一塊代碼做了什么,試試Extract Method;如果method已經(jīng)提煉出來(lái),但還是需要注釋來(lái)解釋其行為,試試Rename Mehtod;如果你需要注釋說(shuō)明某系系統(tǒng)的需求規(guī)格,試試Introduce Assertion。
當(dāng)你感覺(jué)需要撰寫(xiě)注釋?zhuān)?qǐng)先嘗試重構(gòu),試著讓所有注釋都變得多余。
如果你不知道該做什么,這才是注釋的良好運(yùn)用時(shí)機(jī)。除了用來(lái)記述將來(lái)的打算之外,注視還可以用來(lái)標(biāo)注你并無(wú)十足把握的區(qū)域。你可以在注釋里寫(xiě)下“為什么做某某事”。這類(lèi)信息可以幫助將來(lái)的修改者,尤其是那些健忘的家伙。
Introduce Assertion
引入斷言。
某一段代碼需要對(duì)程序狀態(tài)作出某種假設(shè)。注意,你可以創(chuàng)建自己的斷言,而不僅僅是依賴已有斷言。
posted on 2007-07-30 22:11 littlegai 閱讀(411) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): 我的讀書(shū)筆記
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品激情电影| 新狼窝色av性久久久久久| 亚洲性av在线| 亚洲精品专区| 久久精品二区三区| 亚洲欧美日韩一区二区在线| 欧美精品手机在线| 欧美高清日韩| 在线观看不卡| 久久久91精品国产| 久久久久久一区二区| 国产精品久久久久999| 亚洲精品一区二区三区99| 亚洲激情视频在线播放| 久久免费精品视频| 老司机67194精品线观看| 国产日韩欧美91| 午夜精品久久久久久久99樱桃| 亚洲欧美日韩人成在线播放| 国产精品进线69影院| 亚洲毛片av| 亚洲天堂男人| 欧美四级电影网站| 一本久久知道综合久久| 亚洲自拍偷拍福利| 欧美午夜片在线观看| 9i看片成人免费高清| 亚洲一二三区在线| 欧美色视频一区| 一区二区三区四区五区精品视频 | 亚洲精品在线视频观看| 亚洲国产专区| 欧美激情第10页| 91久久综合亚洲鲁鲁五月天| 亚洲高清久久久| 鲁大师影院一区二区三区| 欧美成人在线免费观看| 亚洲人www| 欧美日韩中文字幕精品| 99在线视频精品| 久久av资源网| 伊人久久男人天堂| 老司机精品导航| 亚洲精品色图| 欧美一级电影久久| 国产网站欧美日韩免费精品在线观看 | 欧美一区二区三区视频| 欧美综合国产| 亚洲激情视频在线| 欧美视频一区在线| 欧美一区二区免费视频| 免费看av成人| 亚洲午夜精品一区二区三区他趣| 国产精品色婷婷| 久久国产视频网站| 亚洲精品国产精品国自产观看浪潮| 亚洲午夜免费视频| 国内精品亚洲| 欧美日韩专区| 久久五月婷婷丁香社区| 亚洲最快最全在线视频| 久久久精品一区| 日韩亚洲国产精品| 国产日韩欧美一区二区| 欧美成人精品一区二区| 亚洲一区区二区| 欧美不卡在线| 午夜视频久久久| 亚洲精品资源| 韩国久久久久| 国产精品草莓在线免费观看| 久久久噜久噜久久综合| 在线午夜精品自拍| 亚洲国产91| 久久久国产精品一区| 一本色道久久88精品综合| 国产一区二区三区四区hd| 欧美日韩免费高清| 久久综合亚州| 欧美在线视频一区| 中文国产一区| 亚洲日韩欧美视频一区| 久久免费视频在线观看| 亚洲欧美日本精品| 亚洲麻豆av| 在线观看成人网| 国产一区二区电影在线观看 | 正在播放欧美一区| 亚洲电影视频在线| 国产一区二区三区高清| 国产精品免费一区二区三区观看 | 久久亚洲精品视频| 午夜精品一区二区三区在线视| 日韩视频―中文字幕| 欧美黄色一区二区| 噜噜噜在线观看免费视频日韩| 欧美在现视频| 欧美一区二区三区四区在线观看| 亚洲午夜av| 99热免费精品| 999亚洲国产精| 亚洲精品国偷自产在线99热| 激情久久五月| 国内精品视频666| 国内精品久久久久久影视8 | 国模私拍一区二区三区| 国产精品亚洲精品| 国产精品国产| 国产精品久久国产三级国电话系列| 欧美日韩国产黄| 欧美精品 日韩| 欧美日韩精品免费| 欧美日韩精品免费观看视一区二区| 欧美不卡视频一区发布| 免费日韩精品中文字幕视频在线| 蜜臀va亚洲va欧美va天堂| 久久夜色精品国产噜噜av| 久久综合网色—综合色88| 久久免费国产| 欧美激情视频一区二区三区在线播放| 欧美gay视频| 欧美—级在线免费片| 欧美日韩亚洲一区三区| 欧美视频中文字幕| 国产精品一区免费视频| 狠狠色综合一区二区| 亚洲国产国产亚洲一二三| 亚洲理伦在线| 亚洲欧美国产日韩天堂区| 欧美一区二区三区在线观看视频| 久久精品免费看| 欧美不卡视频| 夜夜嗨一区二区| 性刺激综合网| 免费日韩成人| 国产精品欧美久久| 国内精品视频一区| 99国产精品久久久久久久久久| 亚洲新中文字幕| 久久久久久亚洲综合影院红桃| 欧美激情a∨在线视频播放| 日韩视频永久免费| 久久国产一区二区| 欧美日韩成人在线| 国产亚洲精品综合一区91| 亚洲三级免费电影| 欧美一级播放| 亚洲日本激情| 久久国产精品久久国产精品| 欧美国产精品一区| 国产精品推荐精品| 亚洲区国产区| 久久都是精品| 亚洲精品视频中文字幕| 先锋影音国产精品| 欧美日本不卡高清| 极品日韩av| 午夜精品网站| 亚洲欧洲精品一区二区三区 | 在线观看日韩| 亚洲一区二区成人| 欧美成人免费在线观看| 亚洲砖区区免费| 欧美高清视频| 伊人久久大香线| 欧美在线啊v一区| 亚洲日本国产| 久久综合久久综合九色| 国产免费成人在线视频| 中文精品一区二区三区| 亚洲国产成人精品久久久国产成人一区| 亚洲愉拍自拍另类高清精品| 欧美日韩国产电影| 亚洲国产日日夜夜| 另类激情亚洲| 午夜精品视频| 国产精品夜色7777狼人| 一区二区三区久久网| 亚洲大片在线| 免费亚洲电影在线| 激情五月婷婷综合| 久久久久久久网站| 午夜精品久久久久久99热软件| 欧美亚韩一区| 一区二区三区免费网站| 91久久在线播放| 欧美精品入口| 一本一道久久综合狠狠老精东影业| 欧美激情精品久久久久久久变态| 久久精品视频在线| 好看的日韩视频| 麻豆91精品91久久久的内涵| 欧美一区二区三区四区视频| 国产日韩精品综合网站| 欧美在线电影| 久久狠狠婷婷| 在线观看视频免费一区二区三区| 久久久久国产精品厨房| 久久大综合网| 亚洲国产婷婷香蕉久久久久久99|