無代碼開發(fā)平臺(tái)(國內(nèi)無代碼開發(fā)平臺(tái)推薦)">國內(nèi)無代碼開發(fā)平臺(tái)(國內(nèi)無代碼開發(fā)平臺(tái)推薦)
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í)間等
計(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)容。