代碼重構(gòu):被拒絕的遺贈(zèng)(Refused Bequest)

      網(wǎng)友投稿 1120 2022-05-30

      什么是被拒絕的遺贈(zèng)(Refused Bequest)

      定義: 被拒絕的遺贈(zèng)是指:對(duì)于某個(gè)子類,它只想繼承基類的部分函數(shù)和數(shù)據(jù),不需要基類提供的全部內(nèi)容,這些不需要的內(nèi)容就成為了子類的負(fù)擔(dān)

      影響: 這種壞味道通常影響并不大,但如果子類拒絕實(shí)現(xiàn)部分接口或者基類的方法只適用于某個(gè)子類特定的方法,就會(huì)對(duì)可維護(hù)、可擴(kuò)展性等造成較大影響。

      改進(jìn)目標(biāo): 改進(jìn)不合理的繼承體系,使代碼結(jié)構(gòu)清晰、可控。

      方法:

      ?函數(shù)/字段下移,讓超類只持有子類共享的東西[1]

      ?以委托取代超類/子類

      注[1]:并不建議對(duì)所有存在“被拒絕的遺贈(zèng)”的代碼都進(jìn)行修改,我們經(jīng)常使用繼承復(fù)用一些行為,可以很好的應(yīng)對(duì)日常工作,所以修改的成本和收益還是需要開發(fā)者自己權(quán)衡。但是當(dāng)“被拒絕的遺贈(zèng)”使開發(fā)人員困惑時(shí),就建議及時(shí)處理掉。

      案例1

      代碼背景

      描述了個(gè)人信息的數(shù)據(jù)模型;

      包含人員信息基類,以及老人、成人、孩子三個(gè)子類。老人、成人、孩子類通過繼承人員信息類獲取相關(guān)信息,并實(shí)現(xiàn)、重寫、調(diào)用對(duì)應(yīng)接口、方法等。

      人員相關(guān)信息,包括年齡、性別、身高、體重、基礎(chǔ)退休工資、退休了多少年、上班通勤時(shí)間等

      代碼重構(gòu):被拒絕的遺贈(zèng)(Refused Bequest)

      計(jì)算每個(gè)月的養(yǎng)老金、以及是否達(dá)到上學(xué)年齡的接口

      分別獲取兒童、成年人、老年人相關(guān)個(gè)人信息的方法

      兒童、成年和老年人子類,都實(shí)現(xiàn)了養(yǎng)老金計(jì)算、是否達(dá)到入學(xué)年齡判斷接口

      癥狀/問題

      子類通過繼承父類,了解了過多超出自身需要的方法,也被迫實(shí)現(xiàn)了對(duì)自己無用的接口,后續(xù)其他子類的擴(kuò)展也都需要了解這些多余信息,嚴(yán)重影響了可擴(kuò)展、可維護(hù)性

      父類中提供了isObese實(shí)現(xiàn),但子類中都進(jìn)行了重寫,同時(shí)子類通過super,在父類方法中進(jìn)行調(diào)用,導(dǎo)致調(diào)用關(guān)系復(fù)雜,理解難度較大,可讀性較差

      Old類不需要PersonInfo中孩子和成年人信息,也不該實(shí)現(xiàn)isReachSchoolAge接口。

      Children不需要PersonInfo中成年人和老年人的信息,也不應(yīng)該實(shí)現(xiàn)calculateMonthlyPensionWage接口

      重構(gòu)目標(biāo)

      將每個(gè)子類特有的方法移到相應(yīng)子類中(比如getChildInfo方法應(yīng)該移到child中)

      公共的行為統(tǒng)一抽取到父類中

      重構(gòu)手法

      函數(shù)/字段下移

      案例2

      代碼背景

      案例包含個(gè)人信息和平臺(tái)賬戶信息兩個(gè)類,用于對(duì)外提供賬戶相關(guān)信息

      案例中平臺(tái)賬戶信息類和個(gè)人信息類是繼承關(guān)系。且分別提供了平臺(tái)賬戶類作為子類和超類的兩種情況。

      癥狀/問題

      Person和Platform應(yīng)當(dāng)屬于兩個(gè)體系,之間不應(yīng)該通過繼承來進(jìn)行信息的訪問和交換

      重構(gòu)目標(biāo)

      以委托取代子類或超類,消除被拒絕的遺贈(zèng)

      重構(gòu)對(duì)比(案例1)

      重構(gòu)前

      父類PersonInfo中包含了getChildren、getAdultInfo、getOldInfo等方法,并不是所有子類都需要的。

      重構(gòu)后

      使用函數(shù)下移后,父類只有子類公共所需的方法及屬性,子類不會(huì)獲取及實(shí)現(xiàn)不需要的功能。

      重構(gòu)對(duì)比(案例2)

      重構(gòu)前

      PlatAccountInformation和PersonalInformation繼承關(guān)系,結(jié)構(gòu)設(shè)計(jì)不合理

      重構(gòu)后

      PersonalInformation和PlatAccountInformation為委托關(guān)系,可控制傳出的屬性信息

      總結(jié)

      注[1]:并不建議對(duì)所有存在“被拒絕的遺贈(zèng)”的代碼都進(jìn)行修改,我們經(jīng)常使用繼承復(fù)用一些行為,可以很好的應(yīng)對(duì)日常工作,所以修改的成本和收益還是需要開發(fā)者自己權(quán)衡。但是當(dāng)“被拒絕的遺贈(zèng)”使開發(fā)人員困惑時(shí),就建議及時(shí)處理掉。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:linux 監(jiān)控網(wǎng)絡(luò)IO、磁盤、CPU、內(nèi)存
      下一篇:Connected Car一款適合家庭客戶使用的車聯(lián)網(wǎng)產(chǎn)品
      相關(guān)文章
      久久精品国产精品亚洲下载| 亚洲?V乱码久久精品蜜桃| 亚洲 日韩经典 中文字幕| 亚洲VA成无码人在线观看天堂| 亚洲精品专区在线观看| 亚洲成av人片在www鸭子| 亚洲国产最大av| 中文有码亚洲制服av片| 亚洲AV成人一区二区三区在线看| 亚洲综合综合在线| 亚洲国产综合在线| 亚洲毛片免费视频| 亚洲剧场午夜在线观看| 亚洲一区二区三区高清| 亚洲宅男永久在线| 亚洲成a人片毛片在线| 亚洲三级在线免费观看| 日韩亚洲国产综合高清| 亚洲AV成人一区二区三区在线看| 亚洲人成人无码.www石榴 | 国产亚洲精品无码专区| 亚洲第一区精品日韩在线播放| 在线观看国产一区亚洲bd| av无码东京热亚洲男人的天堂 | 久久亚洲日韩精品一区二区三区| 337p欧洲亚洲大胆艺术| 亚洲中文字幕久久精品无码2021| 亚洲国产熟亚洲女视频| 欧美亚洲精品一区二区| 亚洲国产综合人成综合网站| 77777亚洲午夜久久多人| 亚洲VA中文字幕无码一二三区| 亚洲尹人九九大色香蕉网站| 亚洲人成免费电影| 亚洲精品无码人妻无码| 亚洲国产精品碰碰| 亚洲成A人片777777| 亚洲成人免费电影| 亚洲AV无码之国产精品| 国产精品亚洲精品日韩已方| 久久青青成人亚洲精品|