這篇文章將為大家詳細(xì)講解有關(guān)Java中如何解決不完美的庫類,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)專注于濰城企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城系統(tǒng)網(wǎng)站開發(fā)。濰城網(wǎng)站建設(shè)公司,為濰城等地區(qū)提供建站服務(wù)。全流程定制開發(fā),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)不完美的庫類
不完美的庫類(Incomplete Library Class)
當(dāng)一個(gè)類庫已經(jīng)不能滿足實(shí)際需要時(shí),你就不得不改變這個(gè)庫(如果這個(gè)庫是只讀的,那就沒轍了)。
問題原因
許多編程技術(shù)都建立在庫類的基礎(chǔ)上。庫類的作者沒用未卜先知的能力,不能因此責(zé)怪他們。麻煩的是庫往往構(gòu)造的不夠好,而且往往不可能讓我們修改其中的類以滿足我們的需要。
解決方法
如果你只想修改類庫的一兩個(gè)函數(shù),可以運(yùn)用 引入外加函數(shù)(Introduce Foreign Method);
如果想要添加一大堆額外行為,就得運(yùn)用 引入本地?cái)U(kuò)展(Introduce Local Extension) 。
收益
減少代碼重復(fù)(你不用一言不合就自己動(dòng)手實(shí)現(xiàn)一個(gè)庫的全部功能,代價(jià)太高)
何時(shí)忽略
如果擴(kuò)展庫會(huì)帶來額外的工作量。
重構(gòu)方法說明
引入外加函數(shù)(Introduce Foreign Method)
問題
你需要為提供服務(wù)的類增加一個(gè)函數(shù),但你無法修改這個(gè)類。
class Report {
//...
void sendReport() {
Date nextDay = new Date(previousEnd.getYear(),
previousEnd.getMonth(), previousEnd.getDate() + 1);
//...
}
}
解決
在客戶類中建立一個(gè)函數(shù),并一個(gè)第一個(gè)參數(shù)形式傳入一個(gè)服務(wù)類實(shí)例。
class Report {
//...
void sendReport() {
Date newStart = nextDay(previousEnd);
//...
}
private static Date nextDay(Date arg) {
return new Date(arg.getYear(), arg.getMonth(), arg.getDate() + 1);
}
}
引入本地?cái)U(kuò)展(Introduce Local Extension)
問題
你需要為服務(wù)類提供一些額外函數(shù),但你無法修改這個(gè)類。
中間人
中間人(Middle Man)
如果一個(gè)類的作用僅僅是指向另一個(gè)類的委托,為什么要存在呢?
問題原因
對象的基本特征之一就是封裝:對外部世界隱藏其內(nèi)部細(xì)節(jié)。封裝往往伴隨委托。但是人們可能過度運(yùn)用委托。比如,你也許會(huì)看到一個(gè)類的大部分有用工作都委托給了其他類,類本身成了一個(gè)空殼,除了委托之外不做任何事情。
解決方法
應(yīng)該運(yùn)用 移除中間人(Remove Middle Man),直接和真正負(fù)責(zé)的對象打交道。
收益
減少笨重的代碼。
何時(shí)忽略
如果是以下情況,不要?jiǎng)h除已創(chuàng)建的中間人:
添加中間人是為了避免類之間依賴關(guān)系。
一些設(shè)計(jì)模式有目的地創(chuàng)建中間人(例如代理模式和裝飾器模式)。
重構(gòu)方法說明
移除中間人(Remove Middle Man)
問題
某個(gè)類做了過多的簡單委托動(dòng)作。
依戀情結(jié)
依戀情結(jié)(Feature Envy)
一個(gè)函數(shù)訪問其它對象的數(shù)據(jù)比訪問自己的數(shù)據(jù)更多。
問題原因
這種氣味可能發(fā)生在字段移動(dòng)到數(shù)據(jù)類之后。如果是這種情況,你可能想將數(shù)據(jù)類的操作移動(dòng)到這個(gè)類中。
解決方法
As a basic rule, if things change at the same time, you should keep them in the same place. Usually data and functions that use this data are changed together (although exceptions are possible).
有一個(gè)基本原則:同時(shí)會(huì)發(fā)生改變的事情應(yīng)該被放在同一個(gè)地方。通常,數(shù)據(jù)和使用這些數(shù)據(jù)的函數(shù)是一起改變
一個(gè)函數(shù)明顯應(yīng)該被移到另一個(gè)地方,可運(yùn)用 搬移函數(shù)(Move Method) 。
如果僅僅是函數(shù)的部分代碼訪問另一個(gè)對象的數(shù)據(jù),運(yùn)用 提煉函數(shù)(Extract Method) 將這部分代碼移到獨(dú)立的函數(shù)中。
如果一個(gè)方法使用來自其他幾個(gè)類的函數(shù),首先確定哪個(gè)類包含大多數(shù)使用的數(shù)據(jù)。然后,將該方法與其他數(shù)據(jù)一起放在此類中。或者,使用 提煉函數(shù)(Extract Method) 將方法拆分為幾個(gè)部分,可以放置在不同類中的不同位置。
收益
減少重復(fù)代碼(如果數(shù)據(jù)處理的代碼放在中心位置)。
何時(shí)忽略
有時(shí),行為被有意地與保存數(shù)據(jù)的類分開。這通常的優(yōu)點(diǎn)是能夠動(dòng)態(tài)地改變行為(見策略設(shè)計(jì)模式,訪問者設(shè)計(jì)模式和其他模式)。
重構(gòu)方法說明
搬移函數(shù)(Move Method)
問題
你的程序中,有個(gè)函數(shù)與其所駐類之外的另一個(gè)類進(jìn)行更多交流:調(diào)用后者,或被后者調(diào)用。
提煉函數(shù)(Extract Method)
問題
你有一段代碼可以組織在一起。
void printOwing() {
printBanner();
//print details
System.out.println("name: " + name);
System.out.println("amount: " + getOutstanding());
}
解決
移動(dòng)這段代碼到一個(gè)新的函數(shù)中,使用函數(shù)的調(diào)用來替代老代碼。
void printOwing() {
printBanner();
printDetails(getOutstanding());
}
void printDetails(double outstanding) {
System.out.println("name: " + name);
System.out.println("amount: " + outstanding);
}
狎昵關(guān)系
狎昵關(guān)系(Inappropriate Intimacy)
一個(gè)類大量使用另一個(gè)類的內(nèi)部字段和方法。
問題原因
類和類之間應(yīng)該盡量少的感知彼此(減少耦合)。這樣的類更容易維護(hù)和復(fù)用。
解決方法
最簡單的解決方法是運(yùn)用 搬移函數(shù)(Move Method) 和 搬移字段(Move Field) 來讓類之間斬?cái)?br/>你也可以看看是否能運(yùn)用 將雙向關(guān)聯(lián)改為單向關(guān)聯(lián)(Change Bidirectional Association to Unidirectional) 讓其中一個(gè)類對另一個(gè)說分手。
如果這兩個(gè)類實(shí)在是情比金堅(jiān),難分難舍,可以運(yùn)用 提煉類(Extract Class) 把二者共同點(diǎn)提煉到一個(gè)新類中,讓它們產(chǎn)生愛的結(jié)晶。或者,可以嘗試運(yùn)用 隱藏委托關(guān)系(Hide Delegate) 讓另一個(gè)類來為它們牽線搭橋。
繼承往往造成類之間過分緊密,因?yàn)樽宇悓Τ惖牧私饪偸浅^后者的主觀愿望,如果你覺得該讓這個(gè)子類自己闖蕩,請運(yùn)用 以委托取代繼承(Replace Inheritance with Delegation) 來讓超類和子類分家。
收益
提高代碼組織性。
提高代碼復(fù)用性。
重構(gòu)方法說明
搬移函數(shù)(Move Method)
問題
你的程序中,有個(gè)函數(shù)與其所駐類之外的另一個(gè)類進(jìn)行更多交流:調(diào)用后者,或被后者調(diào)用。
解決
在該函數(shù)最常引用的類中建立一個(gè)有著類似行為的新函數(shù)。將舊函數(shù)變成一個(gè)單純的委托函數(shù),或是舊函數(shù)完全移除。
搬移字段(Move Field)
問題
在你的程序中,某個(gè)字段被其所駐類之外的另一個(gè)類更多地用到。
解決
在目標(biāo)類新建一個(gè)字段,修改源字段的所有用戶,令他們改用新字段。
將雙向關(guān)聯(lián)改為單向關(guān)聯(lián)(Change Bidirectional Association to Unidirectional)
問題
兩個(gè)類之間有雙向關(guān)聯(lián),但其中一個(gè)類如今不再需要另一個(gè)類的特性。
解決
去除不必要的關(guān)聯(lián)。
提煉類(Extract Class)
問題
某個(gè)類做了不止一件事。
解決
建立一個(gè)新類,將相關(guān)的字段和函數(shù)從舊類搬移到新類。
隱藏委托關(guān)系(Hide Delegate)
問題
客戶通過一個(gè)委托類來調(diào)用另一個(gè)對象。
解決
在服務(wù)類上建立客戶所需的所有函數(shù),用以隱藏委托關(guān)系。
以委托取代繼承(Replace Inheritance with Delegation)
問題
某個(gè)子類只使用超類接口中的一部分,或是根本不需要繼承而來的數(shù)據(jù)。
解決
在子類中新建一個(gè)字段用以保存超類;調(diào)整子類函數(shù),令它改而委托超類;然后去掉兩者之間的繼承關(guān)系。
過度耦合的消息鏈
過度耦合的消息鏈(Message Chains)
消息鏈的形式類似于:obj.getA().getB().getC()。
問題原因
如果你看到用戶向一個(gè)對象請求另一個(gè)對象,然后再向后者請求另一個(gè)對象,然后再請求另一個(gè)對象……這就是消息鏈。實(shí)際代碼中你看到的可能是一長串 getThis()或一長串臨時(shí)變量。采取這種方式,意味客戶代碼將與查找過程中的導(dǎo)航緊密耦合。一旦對象間關(guān)系發(fā)生任何變化,客戶端就不得不做出相應(yīng)的修改。
解決方法
可以運(yùn)用 隱藏委托關(guān)系(Hide Delegate) 刪除一個(gè)消息鏈。
有時(shí)更好的選擇是:先觀察消息鏈最終得到的對象是用來干什么的。看看能否以 提煉函數(shù)(Extract Method)把使用該對象的代碼提煉到一個(gè)獨(dú)立函數(shù)中,再運(yùn)用 搬移函數(shù)(Move Method) 把這個(gè)函數(shù)推入消息鏈。
收益
能減少鏈中類之間的依賴。
能減少代碼量。
何時(shí)忽略
過于侵略性的委托可能會(huì)使程序員難以理解功能是如何觸發(fā)的。
重構(gòu)方法說明
隱藏委托關(guān)系(Hide Delegate)
問題
客戶通過一個(gè)委托類來調(diào)用另一個(gè)對象。
解決
在服務(wù)類上建立客戶所需的所有函數(shù),用以隱藏委托關(guān)系。
提煉函數(shù)(Extract Method)
問題
你有一段代碼可以組織在一起。
void printOwing() {
printBanner();
//print details
System.out.println("name: " + name);
System.out.println("amount: " + getOutstanding());
}
解決
移動(dòng)這段代碼到一個(gè)新的函數(shù)中,使用函數(shù)的調(diào)用來替代老代碼。
void printOwing() {
printBanner();
printDetails(getOutstanding());
}
void printDetails(double outstanding) {
System.out.println("name: " + name);
System.out.println("amount: " + outstanding);
}
搬移函數(shù)(Move Method)
問題
你的程序中,有個(gè)函數(shù)與其所駐類之外的另一個(gè)類進(jìn)行更多交流:調(diào)用后者,或被后者調(diào)用。
解決
在該函數(shù)最常引用的類中建立一個(gè)有著類似行為的新函數(shù)。將舊函數(shù)變成一個(gè)單純的委托函數(shù),或是舊函數(shù)完全移除。
關(guān)于“Java中如何解決不完美的庫類”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯(cuò),請把它分享出去讓更多的人看到。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
網(wǎng)頁題目:Java中如何解決不完美的庫類-創(chuàng)新互聯(lián)
URL鏈接:http://jinyejixie.com/article38/jepsp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、微信小程序、靜態(tài)網(wǎng)站、動(dòng)態(tài)網(wǎng)站、網(wǎng)站導(dǎo)航、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容