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

隨筆 - 181  文章 - 15  trackbacks - 0
<2009年4月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

My Tech blog

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

3.5 Divergent Change ( 發散式變化)
針對某一外界變化的所有相應修改,都只應該發生在單一class中,而這個新class內的所有內容都應該反映外界變化。為此,你應該找出因為某特定原因而造成的所有變化,然后運用Extract Class將他們提煉到另一個class中。
3.6Shotgun Surgery(散彈式修改)
如果每遇到某種變化,你都必須在許多不同的classes內作出許多小修改以響應之,你所面臨的壞味道就是散彈式修改。
這種情況下,你應該使用Move Method和Move Field把所有需要修改的代碼放進同一個class。如果眼下沒有合適的class可以安置這些代碼,就創造一個。通常你可以運用Inline Class把一系列相關行為放進同一個class。這可能會造成少量發散式變化,但你可以輕易處理它。

InLine Class

場景:你的某個class沒有做太多事情(沒有承擔足夠責任)。
將class的所有特性搬移到另一個class中,然后移除原class。
作法
在移動的目的class身上聲明所有被移動的class的公共屬性和方法。(如果“以一個獨立接口表示source class函數”更合適的話,就應該在inlining之前使用Extract Interface)
修改所有source class引用點,改而引用吸收被移動的class的目標class。(將source class聲明為private,以斬斷package之外的所有引用可能。同時并修改source class的名稱,這便可以使編譯器幫助你捕獲到所有對于source class的dangling reference(虛懸引用點)
編譯,測試
運用Move Method和Move Field,將source class的特性全部搬移到目標class。
3.7Feature Envy(依戀情結)
有一種經典的氣味是:函數對某個class的興趣高過對自己所處之host class的興趣。這種傾慕之情最通常的焦點便是數據。無數次經驗里,我們看到某個函數為了計算某值,從另一個對象那兒調用幾乎半打的取值函數。療法顯而易見:把這個函數移至另一個地點。你應該使用Move Method,把它移到它該去的地方。有時候函數只有一部分受這種依戀之苦,這時候你應該使用Extract Method把這一部分提煉到獨立的函數中,再使用Move Method帶它去它的夢中家園。
往往一個函數會用上數個classes特性。那么它究竟該被置于何處呢?我們的原則是:判斷哪個class擁有最多“被此函數使用”的數據,然后就把這個函數和那些數據擺在一起。如果先以Extract Method將這個函數分解為數個較小函數并分別放置于不同地點,上述步驟也就比較容易完成了。
3.8Data Clumps(數據泥團)
將“總是綁在一起出現的數據”放進屬于它們自己的對象中。首先找出這些數據的值域形式出現點,運用Extract Class將它們提煉到一個獨立的對象中。然后運用Introduce Parameter Object 或 Preserve Whole Object為參數過長的成員函數減肥。
一個好的評判數據泥團的辦法:刪除掉眾多數據中的一筆。其他數據如果不再有意義,這就是個明確的信號:你應該為它們產生一個新對象。

3.9Primitive Obsession(基本型別偏執)
對象技術的新手通常不愿意在小任務上運用小對象--像是結合數值和幣值的money class、含一個起始值和一個結束值得range class、電話號碼或郵政編碼(ZIP)等等的特殊strings。你可以運用Replace Data Value with Object將原本單獨存在的數值替換為對象。如果欲替換之數值是type code(型別碼),而它不影響行為,你可以運用Replace Type Code with Class將它換掉。如果你有相依于此type code的條件式,可運用Replace Type Code with SubClass或Replace Type Code with State/Strategy 加以處理。
如果你有一組應該總是放在一起的值域,可運用Extract Class。如果你在參數列中看到基本型數據,不妨試試Introduce Parameter Object。如果你發現自己正在從array中挑選數據,可運用Replace Array with Object。
Replace Type Code with Class
在以C為基礎的編程語言中,type code(型別碼)或枚舉值很常見。如果帶著一個有意義的符號名,type code的可讀性還是不錯的。問題在于,符號名終究只是個別名,編譯器看見的、進行型別檢驗的,還是背后那個數值。任何接受type code作為引數(argument)的函數,所期望的實際上是一個數值,無法強制使用符號名。這會大大降低代碼的可讀性,從而成為臭蟲之源。
如果把那樣的數值轉換為一個class,編譯器就可以對這個class進行型別檢驗。只要為這個class提供factory method,你就可以始終保證只有合法的實體才會被創建出來,而且它們都回被傳遞給正確的宿主對象。
但是如果枚舉被switch所使用,你就不能簡單地將它替換為class。因為switch往往只會接受整型數據。所以應該首先對switch運用Replace Conditional with Polymorphism重構,而在這之前,還要進行Replace Type Code with Subclasses或Replace Type Code with State/Strategy把type code處理掉。
作法:
1、為 type code建立一個class。其中包含相應的用于記錄type code的值域,并準備一組static變量保存允許被創建的實體,并以一個static函數根據原本的type code 返回合適的實體。
2、修改source class代碼,讓他使用上述新建的class。
3、編譯、測試
4、對于source class中每一個使用type code 的函數,相應建立一個函數,讓新函數使用新的class。你需要建立“以新class實體為自變量”的函數,用以替換原先“直接以type code為引數”的函數。你還需要建立一個“返回新class實體”的函數,用以替換原先一直返回type code的函數。建立新函數前,你可以使用Rename Method修改原函數名稱,明確指出那些函數仍然使用舊式的type code。
5、逐一修改source class用戶,讓它們使用新接口。
6、每修改一個用戶,編譯并測試。
7、刪除使用“type code”的接口,并刪除保存舊type code的靜態變量。
8、編譯測試。
Replace Type Code with SubClass
我的理解:

在這里Room類包含一個屬性IsMeetingRoom。如果為true,則這個房間就是一個會議室,如果為false,則這個房間就是一個普通的房間。這里true和false可以理解為一個簡單的“型別編碼”。它可以重構為下面的形式:

更復雜的情況:

這樣就需要根據RoomType的實際數量分離出多個子類來。

作法:
使用Self Encapsulate Field方法把type code自我封裝起來。如果type code被傳遞給構造函數,你就需要將構造函數換成factory method.
為type code的每一個數值建立一個相應的subclass。在每個subclass中覆寫type code的取值函數(getter),使其返回相應的type code值。
每建立一個新的subclass,編譯并測試。
從superclass中刪除掉保存type code的值域。將type code訪問函數聲明為抽象函數。
編譯,測試。
Replace Type Code with State/Strategy
你有一個type code,它會影響class的行為,但你無法使用subclassing。
以state object(專門用來描述狀態的對象)取代type code。
之所以無法subclassing是因為Type Code會在對象生命周期過程中發生變化。
如果你打算再完成本項重構之后再以Replace Conditional with Polymorphism(用多態替換條件判斷)簡化一個算法,那么選擇Strategy模式比較合適;如果你打算搬移與狀態有關的數據,而且你把新建對象視為一種變遷狀態,就應該使用State模式。

Replace Array with Object
你有一個數組(array),其中的元素各自代表不同的東西。
以對象替換數組,對于數組中的每個元素,以一個值域表示之。
String[] row =new String[3];
row[0]="Liverpool";
row[1]="15";
轉換為
Performance row=new Performance();
row.setName("Liverpool");
row.setWins("15");
3.10Switch Statements

如果你只是在單一函數中有些選擇事例,而你并不想改動它們,那么“多態”就有點殺雞用牛刀了。這種情況下Replace Paremeter with Explicit Method是個不錯的選擇。如果你的選擇條件之一是null,可以試試Introduce Null Object
Replace Paremeter with Explicit Method
此方法即是將包含多個switch分支的函數的各個分支獨立成不同的函數。比如:
public static Object CreateObject(int typeOfObject)
{
      switch(typeOfObject)
      {
            case 1:return new A();
            case 2:return new B();
            case 3:return new C();
      }
}
轉換為:
public static Object Create1()
{
      return new A();
}
public static Object Create2()
{
      return new B();
}
public static Object Create3()
{
      return new C();
}
思考:這樣會削弱此函數的運行期特性。
Introduce Null Object
使用這種重構方法的好處就是你不用在向一個對象發送消息的時候去檢驗這個對象是否存在。因為對象確實存在,只不過有可能對你發送的消息做出“我是空”的回應。
作法
為source class建立一個subclass,使其行為像source class的null版本。在source class和null class中都加上IsNull()函數,前者的IsNull()應該返回false,后者的應該返回true.可以建立一個nullable接口,將isnull函數放在其中,讓source class實現這個接口。
另外可以創建一個testing接口,專門用來檢驗對象是否為null.
編譯。
找出所有“索求source obejct卻得到一個null”的地方。修改這些地方,使他們改而獲得一個null object。
找出所有“講source object與null做比較的地方”。修改這些地方,使它們調用IsNull()函數。
你可以在不該在出現null value的地方放上一些斷言,確保null的確不再出現。這可能對你有所幫助。
這出這樣的程序點:如果對象不是null,做A動作,否則做B動作。
對于每一個上述地點,在null class中覆寫A動作,使其行為和B動作相同。
使用上述的被覆寫動作(A),然后刪除“對象是否等于null”的條件測試。編譯并測試。
其他特殊情況
使用本項重構時,你可以有數種不同的null objects,例如你可以說“沒有顧客”和“不知名顧客”這兩種情況是不同的。果真如此,你可以針對不同的情況建立不同的null class。有時候null objects 也可以攜帶數據,例如不知名顧客的使用記錄等等。
本質上講,這是一個比Null Object模式更大的模式:Special Case模式。所謂Special case class是某個class的特殊情況,有著特殊的行為。因此表述不知名顧客的UnKnownCustomer 和表示沒有顧客的NoCustomer都是Customer的特例。你經常可以在表示數量的class中看到這樣的特例類。例如Java浮點數有“正無窮大”、“負無窮大”和“非數量”等特例。special case class的價值是:它們可以降低你的錯誤處理開銷。例如浮點運算決不會拋出異常。如果你對NaN作浮點運算,結果也會是個NaN。這和“null object”的訪問函數通常會返回另一個null object是一樣的道理。

posted on 2007-07-17 21:26 littlegai 閱讀(301) 評論(0)  編輯 收藏 引用 所屬分類: 我的讀書筆記
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品最新自拍| 亚洲欧美日韩系列| 在线亚洲欧美专区二区| 韩日精品中文字幕| 怡红院精品视频在线观看极品| 黄色成人在线| 最新国产精品拍自在线播放| 亚洲片区在线| 亚洲一区国产精品| 久久在线视频在线| 亚洲国产精品99久久久久久久久| 亚洲国产va精品久久久不卡综合| 亚洲精品久久久久久久久久久| 一区二区免费看| 久久久福利视频| 欧美三级在线视频| 国内久久精品| 亚洲午夜精品| 免费成人av在线| 99视频精品| 久久久久久久一区| 国产精品激情| 亚洲日本欧美| 欧美一区二区啪啪| 亚洲激情在线播放| 欧美一区视频| 欧美视频一区二区三区在线观看 | 免费看的黄色欧美网站| 最新国产精品拍自在线播放| 亚洲欧美综合网| 欧美日韩国产黄| 一区免费在线| 午夜精品视频| 亚洲伦理在线免费看| 亚洲直播在线一区| 欧美黄色aaaa| 欧美伊人久久久久久午夜久久久久 | 欧美日本网站| 在线不卡中文字幕| 欧美一区二区三区视频在线观看 | 亚洲精品一区二区三区樱花| 午夜日韩在线观看| 国产精品mv在线观看| 亚洲精品欧美日韩专区| 久久精品在线播放| 午夜欧美大片免费观看| 欧美性大战xxxxx久久久| av不卡免费看| 亚洲精品欧美日韩| 欧美激情综合亚洲一二区| 亚洲国产精品电影| 美女网站久久| 久久久久久久国产| 韩国在线一区| 久久一区中文字幕| 久久久久久999| 在线播放不卡| 欧美国产欧美亚洲国产日韩mv天天看完整 | 亚洲国产婷婷| 欧美刺激午夜性久久久久久久| 欧美一区影院| 精品电影在线观看| 欧美成在线视频| 欧美经典一区二区三区| 日韩午夜免费| 一区二区三区精密机械公司 | 欧美色一级片| 亚洲欧美综合v| 亚洲伊人网站| 国产一级一区二区| 免费国产自线拍一欧美视频| 麻豆成人在线观看| 99精品99| 亚洲免费在线观看视频| 国产一区 二区 三区一级| 久热精品视频在线| 欧美黑人一区二区三区| 一区二区三区四区蜜桃| 亚洲天堂网在线观看| 国产主播精品| 亚洲国产aⅴ天堂久久| 欧美日韩爆操| 一区二区在线看| 欧美成人精品高清在线播放| 欧美激情国产精品| 亚洲永久免费观看| 欧美有码在线观看视频| 亚洲国产高清一区| 日韩午夜高潮| 国产一区二区视频在线观看| 欧美成人在线免费观看| 欧美日韩免费观看一区三区| 欧美在线视屏| 欧美激情一区在线观看| 欧美资源在线观看| 欧美激情一区二区三区在线视频| 亚洲一区二区综合| 免费人成精品欧美精品| 欧美一区二区三区久久精品茉莉花| 久久久久久久一区二区三区| 亚洲天堂网在线观看| 另类图片国产| 久久大香伊蕉在人线观看热2| 蜜桃av一区| 久久九九精品| 国产精品v欧美精品v日本精品动漫 | 亚洲黑丝一区二区| 亚洲自拍电影| 99国产精品久久久久久久成人热| 亚洲国产经典视频| 免费不卡欧美自拍视频| 91久久精品网| 香蕉亚洲视频| 亚洲图片在线| 开心色5月久久精品| 亚洲综合精品四区| 麻豆精品网站| 久久久久久网址| 国产精品乱看| 亚洲欧洲日韩女同| 一区二区三区在线免费播放| 宅男66日本亚洲欧美视频| 亚洲精选久久| 久久亚洲一区二区三区四区| 亚洲欧美日韩天堂| 欧美三日本三级少妇三99| 欧美国产综合视频| 亚洲乱码国产乱码精品精天堂| 亚洲一区综合| 亚洲午夜羞羞片| 欧美日韩精品二区第二页| 欧美激情精品| 亚洲欧洲日本一区二区三区| 久久久久欧美精品| 裸体一区二区| 在线成人小视频| 久久影音先锋| 欧美黄色aaaa| a91a精品视频在线观看| 欧美精品一区二区三区蜜桃| 免费高清在线视频一区·| 激情成人在线视频| 欧美福利电影在线观看| 伊人成人在线视频| 老牛国产精品一区的观看方式| 毛片基地黄久久久久久天堂| 尤物九九久久国产精品的特点 | 久久不射中文字幕| 国产欧美一二三区| 欧美一区二区三区在线视频 | 一区二区免费在线视频| 欧美精品福利| 亚洲午夜久久久久久久久电影网| 亚洲一区二区欧美| 国产精品亚洲综合天堂夜夜| 午夜精品视频网站| 美女成人午夜| 亚洲精品永久免费精品| 欧美日韩一区二区在线视频| 亚洲午夜久久久久久久久电影网| 久久精品一二三区| 亚洲精品美女久久7777777| 欧美日韩成人一区二区| 亚洲主播在线| 亚洲成色999久久网站| 在线视频精品一区| 午夜伦欧美伦电影理论片| 国产在线观看一区| 欧美激情免费观看| 亚洲一区二区免费看| 美女脱光内衣内裤视频久久网站| 亚洲区在线播放| 国产精品日日摸夜夜摸av| 久久久免费精品视频| 一区二区电影免费观看| 毛片精品免费在线观看| 亚洲制服少妇| 在线观看精品视频| 国产精品日本欧美一区二区三区| 久久免费视频一区| 亚洲欧美激情精品一区二区| 欧美国产日韩a欧美在线观看| 亚洲欧美国内爽妇网| 亚洲欧洲在线看| 国产一区二区三区四区三区四| 欧美理论电影网| 卡通动漫国产精品| 欧美中文在线视频| 亚洲一区二区三区四区视频| 欧美激情久久久| 久久久久亚洲综合| 亚洲欧美在线观看| 亚洲视频在线看| 日韩视频在线免费观看| 亚洲第一精品久久忘忧草社区| 国产嫩草一区二区三区在线观看| 欧美日韩1区2区| 欧美精品一区二| 欧美高清视频www夜色资源网| 久久精精品视频|