第七章 在對象之間搬移特性

決定把責(zé)任放在哪兒,即使不是最重要的事情, 也是最重要的事之一.

Move MethodMove Field簡單地移動對象行為. 如果這兩個重構(gòu)手法都需要用到, 我會首先使用Move Field, 再使用Move Method

類往往會因為承擔(dān)過多責(zé)任而變得臃腫不堪. 這種情況下, 我會使用Extract Class 將一部分責(zé)任分離出去. 如果一個類變得太不負責(zé)任, 我就會使用Inline Class將它融入另一個類. 如果一個類使用了另一類, 運用Hide Delegate將這種關(guān)系隱藏起來通常是有幫助的. 有時候隱藏委托類會導(dǎo)致?lián)碛姓叩慕涌诮?jīng)常變化, 此時需要使用Remove Middle Man

當(dāng)我不能訪問某個類的源碼, 卻又想把其他責(zé)任移進這個不可修改的類時, 我才會使用這兩個重構(gòu)手法. 如果我想加入的只是一或兩個函數(shù), 就會使用Introduce Foreign Method: 如果不止一兩個函數(shù), 就使用Introduce Local Extension

7.1 Move Method (搬移函數(shù))

你的程序中, 有個函數(shù)與其所駐類之外的另一個類進行更多的交流: 調(diào)用后者,或被后者調(diào)用.

在該函數(shù)最常用的類中建立一個有這類似行為的新函數(shù). 將舊函數(shù)變成一個單純的委托函數(shù), 或是將就函數(shù)完全移除.

7.2 Move Field (搬移字段)

你的程序中, 某個字段被其所駐類之外的另一個類更多地用到.

在另一個類中新建一個字段, 修改源字段的所有用戶, 令他們改用新字段.

7.3 Extract Class(提煉類)

某個類做了應(yīng)該由兩個類做的事.

建立一個新類, 將相關(guān)的字段和函數(shù)從舊類搬移到新類.

如果你發(fā)現(xiàn)子類化只影響類的部分特性,或如果你發(fā)現(xiàn)某些特性需要以一種方式來子類化, 某些特性則需要以另一種方式子類化, 這就意味著你需要分解原來的類.

7.4 Inline Class(將類內(nèi)聯(lián)化)

某個類沒有做太多事情

將這個類的所有特性搬移到另一個類中, 然后移除原類.

7.5 Hide Delegate(隱藏"委托關(guān)系")

客戶通過一個委托類來調(diào)用另一個對象.

在服務(wù)類上建立客戶端所需的所有函數(shù), 用以隱藏委托關(guān)系

此條體現(xiàn)了對象技術(shù)的關(guān)鍵特征:封裝

如果某個客戶先通過服務(wù)對象的字段得到另一個對象, 然后調(diào)用后者的函數(shù), 那么客戶就必須知曉這一層委托關(guān)系. 你可以在服務(wù)對象上放置一個簡單的委托函數(shù), 將委托關(guān)系隱藏起來, 從而去除這種依賴.

可能隨著提煉類, 都不用持有委托函數(shù), 直接暴露委托的功能.

它的代價是: 每當(dāng)客戶要使用委托類的新功能, 你就必須在服務(wù)端添加一個簡單委托函數(shù).

7.6 Remove Middle Man(移除中間人)

某個類做了過多的簡單委托動作.

讓客戶直接調(diào)動委托類

此條和7.5是互斥的關(guān)系, 很難說什么程度的隱藏才是合適的. 隨著系統(tǒng)的變化, 隱藏程度需要不斷的調(diào)整.

  • 重構(gòu)的意義就在于: 你永遠不必說對不起 --- 只要把出問題的地方修復(fù)好就行了

7.7 Introduce Foreign Method(引入外加函數(shù))

你需要為提供服務(wù)的類添加一個函數(shù), 但你無法修改這個類.

在客戶類中建立一個函數(shù), 并以第一參數(shù)形式傳入一個服務(wù)類實例

在進行本項重構(gòu)時, 如果你以外加函數(shù)實現(xiàn)一項功能, 那就是一個明確信號: 這個函數(shù)原本應(yīng)該在提供服務(wù)的類中實現(xiàn).

但是不要忘記: 外加函數(shù)終歸是權(quán)宜之計. 如果不能把外加函數(shù)搬移到服務(wù)類中, 就把外加函數(shù)交給服務(wù)類的持有者, 請他幫你在服務(wù)類中實現(xiàn)這個函數(shù).施行7.8操作.

7.8 Introduce Local Extension (引入本地擴展)

你需要為服務(wù)類提供一些額外函數(shù), 但你無需修改這個類

建立一個新類, 使它包含這些額外函數(shù). 讓這個擴展品成為源類的子類或者包裝類.

  • 使用本地擴展使你堅持函數(shù)和數(shù)據(jù)應(yīng)該被統(tǒng)一封裝的原則. 把零亂的代碼整理放入擴展類中, 使其易于復(fù)用.
  • 你需要在父類對象創(chuàng)建之前使用本地擴展.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市松邪,隨后出現(xiàn)的幾起案子改鲫,更是在濱河造成了極大的恐慌脏榆,老刑警劉巖仁堪,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阶捆,死亡現(xiàn)場離奇詭異倦卖,居然都是意外死亡鸠匀,警方通過查閱死者的電腦和手機蕉斜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缀棍,“玉大人宅此,你說我怎么就攤上這事∨婪叮” “怎么了父腕?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長青瀑。 經(jīng)常有香客問我璧亮,道長,這世上最難降的妖魔是什么狱窘? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任杜顺,我火速辦了婚禮,結(jié)果婚禮上蘸炸,老公的妹妹穿的比我還像新娘。我一直安慰自己尖奔,他們只是感情好搭儒,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著提茁,像睡著了一般淹禾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上茴扁,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天铃岔,我揣著相機與錄音,去河邊找鬼峭火。 笑死毁习,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的卖丸。 我是一名探鬼主播纺且,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼稍浆!你這毒婦竟也來了载碌?” 一聲冷哼從身側(cè)響起猜嘱,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嫁艇,沒想到半個月后朗伶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡步咪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年论皆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歧斟。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡纯丸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出静袖,到底是詐尸還是另有隱情觉鼻,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布队橙,位于F島的核電站坠陈,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏捐康。R本人自食惡果不足惜仇矾,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望解总。 院中可真熱鬧贮匕,春花似錦、人聲如沸花枫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽劳翰。三九已至敦锌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間佳簸,已是汗流浹背乙墙。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留生均,地道東北人听想。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像疯特,于是被迫代替她去往敵國和親哗魂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容