處理概括關(guān)系

0. 本章內(nèi)容導(dǎo)圖

本章所介紹的重構(gòu)手法專門用來處理類的概括關(guān)系(generalization,即繼承關(guān)系)。


處理概括關(guān)系

1. 重構(gòu)手法

1.1 字段上移

概要:
兩個子類擁有相同的字段。
將該字段移至超類。
動機(jī):
a. 處理兄弟類間重復(fù)的字段以及因重復(fù)字段造成的函數(shù)重復(fù)
示例圖:

字段上移

總結(jié):
? ? 如果子類是分別開發(fā)的扔罪,或者是在重構(gòu)過程中組合起來的,往往會擁有重復(fù)性桶雀,尤其是字段重復(fù)矿酵。命名并非判斷字段是否重復(fù)的標(biāo)準(zhǔn),要依據(jù)它們是如何被方法使用的矗积。

1.2 函數(shù)上移

概要:
有些函數(shù)全肮,在各個子類中產(chǎn)生完全相同的結(jié)果。
將該函數(shù)移至超類棘捣。
動機(jī):
a. 避免行為重復(fù)
示例圖:

函數(shù)上移

總結(jié):
? ? 重復(fù)是滋生bug的溫床辜腺,任何時候,只要系統(tǒng)內(nèi)出現(xiàn)重復(fù),都應(yīng)該設(shè)法去除重復(fù)哪自。相較于“提煉函數(shù)”丰包,”函數(shù)上移“特指出現(xiàn)在兄弟類之間的函數(shù)重復(fù)。

1.3 構(gòu)造函數(shù)本體上移

概要:
你在各個子類中擁有一些構(gòu)造函數(shù)壤巷,它們的本體幾乎完全一致邑彪。
在超類中新建一個構(gòu)造函數(shù),并在子類構(gòu)造函數(shù)中調(diào)用它胧华。
動機(jī):
a. 處理對象構(gòu)建過程中的代碼重復(fù)
示例:
重構(gòu)前:

class Manager extends Employee {
    public Manager(String name, String id, int grade) {
        mName = name;
        mId = id;
        mGrade = grade;
    }
}

重構(gòu)后:

public Manager(String name, String id, int grade) {
    super(name, id);
    mGrade = grade;
}

總結(jié):
? ? 構(gòu)造函數(shù)不是普通的函數(shù)寄症,比使用普通函數(shù)有更多的限制,因此對于構(gòu)造函數(shù)中涉及的重復(fù)要同普通函數(shù)中的重復(fù)區(qū)別開來矩动。

1.4 函數(shù)下移

概要:
超類中的某個函數(shù)只與部分(而非全部)子類有關(guān)有巧。
將這個函數(shù)移到相關(guān)的那些子類去。
動機(jī):
a. 超類中的存在應(yīng)該是所有子類的共同抽象悲没,與子類有關(guān)的函數(shù)應(yīng)在子類中處理
示例圖:

函數(shù)下移

總結(jié):
? ? 超類中的字段和接口應(yīng)該是所有子類共同擁有的特征篮迎,不應(yīng)將對某些子類的特殊處理放在超類中進(jìn)行。這也是對依賴倒轉(zhuǎn)原則的遵守示姿。

依賴倒轉(zhuǎn)原則:抽象不應(yīng)該依賴于細(xì)節(jié)甜橱,細(xì)節(jié)應(yīng)當(dāng)依賴于抽象。換句話說就是栈戳,要針對接口編程岂傲,而非針對實(shí)現(xiàn)編程。

1.5 字段下移

概要:
超類中的某個字段只被部分(而非全部)子類用到子檀。
將這個字段移到需要它的那些子類去镊掖。
動機(jī):
a. 超類中的存在應(yīng)該是所有子類的共同抽象,與子類有關(guān)的字段應(yīng)在子類中處理
示例圖:

字段下移

總結(jié):
? ? 超類應(yīng)該是所有子類都具有的共同特征的抽象褂痰。

1.6 提煉子類

概要:
類中的某些特性只被某些(而非全部)實(shí)例用到亩进。
新建一個子類,將上面所說的那一部分特性移到子類中脐恩。
動機(jī):
a. 類中的某些行為只被一部分實(shí)例用到镐侯,其他實(shí)例不需要它們
示例圖:

提煉子類

總結(jié):
? ? 類是對象的藍(lán)圖,類定義了使用該類創(chuàng)建的所有對象具有的屬性和行為驶冒。如果類中的某些特性不是全部實(shí)例都具備的苟翻,就應(yīng)該將那些部分實(shí)例才具有的特性泛化到子類中。

泛化:一般事物(稱為超類或父類)和該事物的較為特殊的種類(稱為子類)之間的關(guān)系骗污。

1.7 提煉超類

概要:
兩個類有相似特性崇猫。
為這兩個類建立一個超類,將相同特性移至超類需忿。
動機(jī):
a. 消除系統(tǒng)中兩個相似類中的重復(fù)诅炉,建立抽象體系
示例圖:

提煉超類

總結(jié):
? ? 有很多因素會導(dǎo)致系統(tǒng)中出現(xiàn)共通性的類蜡歹,沒有為它們建立出繼承結(jié)構(gòu),此重構(gòu)手法就是針對這種情況涕烧,幫助找出共通性月而,建立繼承結(jié)構(gòu)。這是一種抽象的過程议纯。

抽象關(guān)注一個對象的外部視圖父款,可以用來分離對象的基本行為和它的實(shí)現(xiàn)。

1.8 提煉接口

概要:
若干客戶使用類接口中的同一子集瞻凤,或者兩個類的接口有部分相同憨攒。
將相同的子集提煉到一個獨(dú)立接口中。
動機(jī):
a. 針對接口編程
b. 接口隔離阀参,分離責(zé)任
示例圖:

提煉接口

總結(jié):
? ? 針對客戶的使用分離責(zé)任可以使系統(tǒng)的用法更加清晰肝集,同時也容易看清系統(tǒng)的責(zé)任劃分。你可以從同一個類建立多個不同的接口蛛壳,以滿足多個客戶不同的需要杏瞻。這也是接口隔離原則要求的實(shí)現(xiàn)方式。

接口隔離原則:使用多個專門的接口衙荐,而不使用單一的總接口伐憾,即客戶端不應(yīng)該依賴那些它不需要的接口。

1.9 折疊繼承體系

概要:
超類和子類之間無太大區(qū)別赫模。
將它們合為一體。
動機(jī):
a. 消除不必要的繼承關(guān)系
示例圖:

折疊繼承體系

總結(jié):
? ? 系統(tǒng)中的每個類都是需要維護(hù)的蒸矛,當(dāng)發(fā)現(xiàn)系統(tǒng)中有這種設(shè)計(jì)或者由于其他重構(gòu)出現(xiàn)了這種情況瀑罗,就需要果斷處理。

1.10 塑造模板函數(shù)

概要:
你有一些子類雏掠,其中相應(yīng)的某些函數(shù)以相同順序執(zhí)行類似的操作斩祭,但各個操作的細(xì)節(jié)上有所不同
將這些操作分別放進(jìn)獨(dú)立函數(shù)中乡话,并保持它們都有相同的簽名摧玫,于是原函數(shù)也就變得相同了。然后將原函數(shù)上移至超類绑青。
動機(jī):
a. 消除重復(fù)诬像,分離不變性和可變性
示例圖:

塑造模板函數(shù)

總結(jié):
? ? 這是通過重構(gòu)實(shí)現(xiàn)模板方法模式的過程。

模板方法模式:定義一個操作中算法的框架闸婴,而將一些步驟延遲到子類中坏挠。模板方法模式使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。

1.11 以委托取代繼承

概要:
某個子類只使用超類接口中的一部分邪乍,或是根本不需要繼承而來的數(shù)據(jù)降狠。
在子類中新建一個字段用以保存超類对竣;調(diào)整子類函數(shù),令它改而委托超類榜配;然后去掉兩者之間的繼承關(guān)系否纬。
動機(jī):
a. 消除誤用的泛化關(guān)系
示例圖:

以委托取代繼承

總結(jié):
? ? 對于繼承關(guān)系,你需要理解父類和子類之間應(yīng)該是一種is-a的關(guān)系蛋褥,如果僅僅是因?yàn)榇a復(fù)用而采用繼承是大錯特錯的临燃。繼承和組合都是實(shí)現(xiàn)代碼復(fù)用的方式,使用它們之前壁拉,要先弄明白類之間的關(guān)系谬俄。

1.12 以繼承取代委托

概要:
你在兩個類之間使用委托關(guān)系,并經(jīng)常為整個接口編寫許多極簡單的委托函數(shù)弃理。
讓委托類繼承受托類溃论。
動機(jī):
a. 需要使用受托類中的所有函數(shù),且所有委托函數(shù)都是極簡單的
示例圖:

以繼承取代委托

總結(jié):
? ? 要注意此重構(gòu)手法使用的條件痘昌,即委托類為受托類的所有接口都編寫了極簡單的委托函數(shù)钥勋。合成復(fù)用原則告訴我們,在涉及代碼復(fù)用時辆苔,要優(yōu)先考慮組合算灸,而非繼承。但當(dāng)對象之間是一種泛化的關(guān)系時驻啤,就要考慮將依賴關(guān)系改為泛化關(guān)系菲驴。
? ? 如果受托對象被不止一個其他對象共享,而且受托對象是可變的骑冗,就不能將委托關(guān)系替換為繼承關(guān)系赊瞬,因?yàn)椴荒苡绊懙狡渌麑ο髮υ撌芡袑ο蟮氖褂眉皵?shù)據(jù)共享。

合成復(fù)用原則:盡量使用對象組合贼涩,而不是繼承來達(dá)到復(fù)用的目的巧涧。即復(fù)用時要優(yōu)先考慮組合,而非繼承遥倦。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谤绳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子袒哥,更是在濱河造成了極大的恐慌缩筛,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件统诺,死亡現(xiàn)場離奇詭異歪脏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)粮呢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門婿失,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钞艇,“玉大人,你說我怎么就攤上這事豪硅×ㄕ眨” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵懒浮,是天一觀的道長飘弧。 經(jīng)常有香客問我,道長砚著,這世上最難降的妖魔是什么次伶? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮稽穆,結(jié)果婚禮上冠王,老公的妹妹穿的比我還像新娘。我一直安慰自己舌镶,他們只是感情好柱彻,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著餐胀,像睡著了一般哟楷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上否灾,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天卖擅,我揣著相機(jī)與錄音,去河邊找鬼墨技。 笑死磨镶,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的健提。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼伟叛,長吁一口氣:“原來是場噩夢啊……” “哼私痹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起统刮,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤紊遵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后侥蒙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暗膜,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年鞭衩,在試婚紗的時候發(fā)現(xiàn)自己被綠了学搜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娃善。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖瑞佩,靈堂內(nèi)的尸體忽然破棺而出聚磺,到底是詐尸還是另有隱情,我是刑警寧澤炬丸,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布瘫寝,位于F島的核電站,受9級特大地震影響稠炬,放射性物質(zhì)發(fā)生泄漏焕阿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一首启、第九天 我趴在偏房一處隱蔽的房頂上張望暮屡。 院中可真熱鬧,春花似錦闽坡、人聲如沸栽惶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽外厂。三九已至,卻和暖如春代承,著一層夾襖步出監(jiān)牢的瞬間汁蝶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工论悴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掖棉,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓膀估,卻偏偏與公主長得像幔亥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子察纯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353

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

  • 1 Pull Up Field(字段上移) 和 Pull Up Method(函數(shù)上移) 將字段或者函數(shù)移動到超類...
    hklbird閱讀 615評論 1 1
  • 一 Pull Up Field 怎么說 將兩個子類擁有的相同的字段移到父類中 為什么 移除了重復(fù)的字段聲明帕棉,同時也...
    司鑫閱讀 180評論 0 2
  • 今天晚上抽個時間去看了堂妹和小寶寶,看到了寶寶饼记,很開門香伴!回到家以后,具则,陪孩子學(xué)習(xí)即纲,孩子和我很用心,博肋,結(jié)果就是我們很...
    苗苗女神閱讀 137評論 1 2
  • 文蓉老師在昨天的直播課剛開始低斋,先給大家?guī)砹艘皇住短Α贩涮娜乩蠋煹母杪曈茡P(yáng),感動了所有的鄉(xiāng)村教師拔稳。 換個角度看課堂...
  • 蝴蝶葛峻,翩翩起舞在花叢中 自由,自在 享受著花朵帶來的芬芳 落葉巴比,紛紛揚(yáng)揚(yáng)在半空中 輕快术奖,灑脫 享受著風(fēng)姑娘帶來的涼...
    路上過客閱讀 322評論 3 5