亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 最大化java代碼的可重用性.txt

?? 含有許多JAVA的技巧!
?? TXT
字號:
最大化JAVA代碼的可重用性 
(加入日期:2001-8-2 點擊數:843)
【對此文發表評論】 【編程愛好者論壇】 【保存文章至硬盤】 【打印文章】 
 
——克服傳統OO方法在重用方面的缺陷

摘要:不要放棄編寫可重用代碼的努力!本文介紹了三種對現有代碼進行修改以提高其可重用性的方法。

在程序員中似乎存在著一種日益普遍的觀點,認為重用只是一個神話。或許是傳統的面向對象編程方法中所存在的不足增加了重用的困難。本文介紹了從另外一種不同的途徑使重用成為可能的三個步驟。

第一步:將功能實現從類實例的方法中移出

由于缺乏精確性,類繼承不是非常理想的代碼重用機制。換句話說,如果不繼承一個類的數據成員和其他的方法,那么你就無法重用這個類的某個單獨的方法。這些額外的不必要的負擔使方法重用的代碼變得復雜。派生類對其父類的依賴性也以入了額外的復雜性:對父類的改動會對子類造成影響;當修改任意一個類的時候,我們很難記得清哪個方法被覆蓋,哪個沒有;而且被覆蓋的方法是否會調用父類中相應的方法并不非常清晰地顯現。

任何執行單一概念任務的方法應該能夠成為代碼用的首選而獨立存在。為了達到這個目標,我們必須會到過程化的編程模式,將代碼從類實例的方法中移出,形成具有全局可見性的過程。為了提高這種過程的可重用性,過程代碼應該象靜態的通用方法一樣編寫:每個過程只能使用自己的輸入參數,只能調用其他全局性的過程完成其工作,不能使用任何非本地的變量。這種對外部依賴的簡化降低了過程使用的復雜性,也增加了在其他地方使用此過程的可能性。當然,由于其結構通常會變得更為清晰,即使拋開重用的目的不談我們也可以從這種代碼的組織方式中受益。

在Java中,方法不能脫離類而單獨存在。因此,你可以對相關的過程進行組織并使它們成為一個獨立的類中的公共靜態方法。例如,對于如下所示的一個類:

class Polygon{


public int getPerimeter(){…}

public boolean isConvex(){…}

public Boolean containsPoint(Point p){…}


}

可以將它改寫成下面的形式:

class Polygon { 


public int getPerimeter() { return pPolygon.computePerimeter(this);} 

public boolean isConvex() { return pPolygon.isConvex(this);} 

public boolean containsPoint() { return pPolygon.containsPoint(this, p);} 


} 

在此處,nPolygon應該是這個樣子:

class pPolygon { 

static public int computePerimeter(Polygon polygon) {...} 

static public boolean isConvex(Polygon polygon) {...} 

static public boolean containsPoint(Polygon polygon, Point p) {...} 


從類的名字pPolygon可以看出,該類所封裝的過程主要與Polygon類型的對象有關。名字前面的p表示該類的唯一目的是組織公共靜態過程。在Java中,類的名字以小寫字母開頭不是一種標準的做法,但象pPloygon這樣的類事實上并不執行普通類的功能。也就是說,它并不代表著一類對象,它只是語言本身所需要的用于代碼組織的實體。

 在上面這個例子中,改動代碼的總體影響是使得客戶代碼不必為了重用其功能而從Polygon繼承。Polygon類的功能現在已經由pPolygon類以過程為單位提供。客戶代碼只使用自己需要的代碼,無需關心自身并不需要的功能。

這并不意味著在這種新型的過程化編程模式中,類不服務于更有用的目的。恰恰相反,類執行組織和封裝對象數據成員的必要工作。而且它們通過多重接口實現多態性的能力也為代碼重用提供了顯著的支持,這將在下一個步驟中討論。然而,由于將功能實現包含在實例方法中無法實現理想的代碼重用,所以通過類繼承實現代碼重用和多態性支持也不應成為最佳的技術選擇。

在一本被廣為閱讀的書《Design Patterns》中曾簡要地提及一種略有不同的技術。策略模式(Strategy Pattern)提倡將相關算法的每個成員封裝在一個通用的接口下,以便于客戶端代碼可交換地使用其算法。由于一個算法通常被作為一個或幾個獨立的過程進行編碼,這種封裝更注重執行單獨任務的過程的重用,而不是執行多種任務的、包含代碼和數據的對象的重用。這一步驟體現了相同的基本思想。

然而,將一個算法封裝在一個接口下意味著將算法作為實現接口的對象進行編碼。這意味著我們仍然依賴于一個與所包裝的對象的數據和其他方法相耦合的過程,這樣便會使其復用變得復雜。此外還存在這樣一個問題,每次需要使用這個算法的時候都必須實例化這些對象,這便會降低程序的性能。值得慶幸的是,設計模式提供了針對這兩個問題的解決方法。可以在對策略對象進行編碼時應用享元模式(Flyweight Pattern,譯者注:還存在一種譯法為輕量模式),這樣每個對象只會存在一個被共知共享的實例(這針對程序性能的問題),而且每個共享對象在訪問間隔中并不維持狀態(于是對象將沒有數據成員,這針對大多數的耦合問題)。由此產生的享元--策略模式非常類似于在這一步驟中所提到的將功能實現封裝在全局可見的、無狀態的過程中的技術。(譯者注:以上這兩段文字讀起來可能有些晦澀難解,建議有興趣的讀者參閱文中所提到《設計模式》一書,Erich Gamma等著、李英軍等譯、機械工業出版社出版。)

第二步:將非原始的輸入參數類型改為接口類型

在面向對象編程中,代碼重用的真正基礎在于通過接口參數類型利用多態性,而不是通過類繼承,正如Allen Holub在 “Build User Interfaces for Object-Oriented System, Part 2”中所述:

“……你應該通過對接口而不是類編程實現重用。如果一個方法的所有參數都是某個已知接口的引用,這個接口由一些你所不知道的類實現,那么這個方法就能夠操作這樣一些對象:當編寫方法的代碼時,這些對象的類甚至還不存在。從技術上講,可重用的是方法,而不是傳遞給方法的對象。”

將Holub所講的方法應用于第一步所得到的結果,只要某塊功能代碼能夠作為一個全局可見的過程而獨立存在,你就可以將其每個類類型(class-type)的輸入參數改為一個接口類型,這樣便能進一步提高其重用的潛力。那么,實現此接口類型的任何類的對象都可以作為參數使用,而不僅僅局限于原始類。由此,這個過程對可能存在的大量的對象類型都成為可用的。

例如,有這樣一個全局可見的靜態過程

static public boolean contains(Rectangle rect, int x, int y) {…}

這個方法用于檢查給定的矩形是否包含某個給定的點。在這個例子中,rect參數的類型可以從Rectangle類改變為接口類型,如下所示:

static public boolean contains(Rectangular rect, int x, int y){…}

Rectangular可以是下面形式的接口:

public interface Rectangular{

       Rectangle getBounds();

}

現在,所有可以被描述為矩形的類(也就意味著實現了Rectangular接口)的對象都可以作為傳遞給pRectangular.contains()的rect參數。通過放寬所傳遞的參數類型的限制,我們使方法具有更好的可重用性。

不過,在上面這個例子中,Rectangular接口的getBounds方法返回一個Rectangle類型,你可能會懷疑使用這個接口是否具有真正的價值;換句話說,如果我們知道傳入過程的對象會在被調用時返回一個Rectangle,為什么不直接傳入Rectangle取代接口類型呢?不這樣做的最重要原因與集合有關,假設有這樣一個方法:

static public boolean areAnyOverlapping(Collection rects) {…}

這個方法的目的在于檢查給定集合中的任意矩形對象是否存在重疊。那么,在方法內部遍歷集合中的每個對象時,如果無法將對象造型(cast)成如Rectangular這樣的接口類型,那么將如何能夠訪問對象的矩形區域呢?唯一的選擇是將對象造型成為其特定的類型(我們直到它有一個能夠返回rectangle的方法),這意味著方法必須事先知道其所要操作的是什么類型。這恰恰是這一步驟力圖首先要避免的問題!

第三步:選擇低耦合的輸入參數接口類型

完成第二步之后,應該選擇什么樣的接口類型來取代給定的類型呢?答案是能夠通過參數完全描述過程的需求,同時又具有最少的額外負擔的接口類型。參數對象所要實現的接口越簡單,其他特定類實現此接口的機會就越大——由此,其對象可以作為參數使用的類也就越多。通過下面的例子可以很容易地看到這點:

static public boolean areOverlapping(Window window1, Window window2) {...}

這個方法用于檢查兩個窗口(假定是矩形窗口)是否重疊,如果這個方法只要求從參數獲得兩個窗口的矩形坐標,那么簡化參數的類型使其能反映這個事實是一種更好的選擇:

static public boolean areOverlapping(Rectangular rect1, Rectangular rect2) {...}

以上的代碼假設先前的Window類型的對象同樣可以實現Rectangular接口。現在對于所有的矩形對象,都可以重用第一個方法所包含的功能了。

你可能多次體驗到當一個接口能夠完全確定需要通過參數獲哪那些內容時,會存在太多不必要的方法。在這種情況下,應該在全局命名空間中定義一個新的公共接口以供其他可能面臨同一困境的方法重用。

你可能還會不止一次地發現,在確定需要通過單一過程的一個參數獲取哪些內容時,最好創建一個單獨的接口。你應該只為這個參數使用此接口。這通常會在你希望如同C語言中的函數指針一樣使用參數的情況下出現。例如下面的過程:

static public void sort(List list, SortComparison comp) {...}

此過程使用參數所提供的比較對象comp,通過比較給定列表中的所有對象而對其進行排序,sort對comp的全部要求是調用一個單獨的方法進行比較。因此,SortComparison應該是只帶有一個方法的接口:

public interface SortComparison { 

boolean comesBefore(Object a, Object b); 

} 

這個接口的唯一目的是為sort提供一個與其完成任務所需功能相聯系的鉤子(hook),因此SortComparison無法在其他地方重用。

結束語

以上所述的三個步驟用于現有的、按照相對傳統的面向對象方法所編寫的代碼。這些步驟與面向對象編程技術結合就形成了一種可以運用于今后代碼編寫中的新方法,它可以提高代碼的可重用性和內聚性,同時降低了耦合度及復雜性。

很顯然,這些步驟無法運用于那些在本質上就不適合于重用的代碼。這類代碼通常出現在應用程序的表示層(presentation layer)。例如程序中用于創建用戶界面的代碼,以及將輸入事件與完成實際工作的過程相聯系的控制代碼,都是屬于那種其功能在不同的程序中差別很大的代碼,這種代碼的重用幾乎是不可能的。

本欄文章均來自于互聯網,版權歸原作者和各發布網站所有,本站收集這些文章僅供學習參考之用。任何人都不能將這些文章用于商業或者其他目的。( ProgramFan.Com ) 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美在线不卡| 一区二区三区中文字幕精品精品 | 三级欧美在线一区| 福利视频网站一区二区三区| 欧美人妇做爰xxxⅹ性高电影 | 亚洲三级小视频| 久久97超碰色| 欧美日韩国产不卡| 亚洲欧美日韩国产综合在线| 国产成人免费视频网站高清观看视频 | 欧美区在线观看| 亚洲欧美福利一区二区| 丁香婷婷综合网| 久久亚洲综合色| 麻豆精品精品国产自在97香蕉| 在线观看一区日韩| 亚洲欧美色图小说| 99国产精品久| 亚洲丝袜另类动漫二区| 极品美女销魂一区二区三区| 欧美一区三区二区| 日韩黄色免费电影| 9191成人精品久久| 亚洲妇女屁股眼交7| 日本乱人伦aⅴ精品| 国产精品情趣视频| 成人免费的视频| 国产精品免费看片| 99久久精品久久久久久清纯| 国产精品国产自产拍高清av| 99久久国产综合精品女不卡| 国产精品久久久久影视| 99久久久国产精品免费蜜臀| 亚洲免费资源在线播放| 欧美在线色视频| 日韩激情av在线| 日韩欧美一区二区不卡| 久久 天天综合| 中文字幕精品综合| 色综合久久综合| 一区二区三区 在线观看视频| 欧美午夜免费电影| 日韩精品国产欧美| 欧美va亚洲va| 粉嫩在线一区二区三区视频| 中文字幕一区在线观看| 欧美在线观看一区| 日韩黄色免费网站| 久久久精品免费网站| 成人动漫一区二区| 亚洲自拍偷拍九九九| 91精品国产品国语在线不卡| 激情五月激情综合网| 日本一区二区三区四区| 在线精品视频一区二区三四| 免费av网站大全久久| 国产色产综合产在线视频| 色综合久久九月婷婷色综合| 日韩国产在线观看一区| 精品美女在线观看| 一本色道久久综合亚洲精品按摩| 午夜国产精品影院在线观看| 欧美精品一区二区三区高清aⅴ | 欧美va亚洲va香蕉在线| www.亚洲免费av| 午夜国产精品影院在线观看| 国产精品色噜噜| 91精品国产入口| av午夜一区麻豆| 日日骚欧美日韩| 国产精品色在线观看| 538在线一区二区精品国产| 国产91露脸合集magnet| 午夜视频一区在线观看| 久久精品人人做| 4438x亚洲最大成人网| 成人app在线| 老司机精品视频一区二区三区| 亚洲欧洲美洲综合色网| 日韩免费高清视频| 在线视频中文字幕一区二区| 国产精品影视在线观看| 日欧美一区二区| 亚洲精品水蜜桃| 久久久影视传媒| 91精品蜜臀在线一区尤物| 91天堂素人约啪| 成人深夜福利app| 精品亚洲国内自在自线福利| 亚洲电影中文字幕在线观看| 国产精品人妖ts系列视频| 久久众筹精品私拍模特| 欧美一区二区三区四区高清| 在线观看免费一区| bt欧美亚洲午夜电影天堂| 国产成人精品一区二区三区四区 | 91在线视频播放| 国产91精品露脸国语对白| 免费在线成人网| 日日噜噜夜夜狠狠视频欧美人| 亚洲美女电影在线| 亚洲欧美日韩系列| **欧美大码日韩| 中文字幕乱码日本亚洲一区二区| 精品久久久久一区| 欧美一级二级三级乱码| 欧美一级国产精品| 欧美一区二区三区在线看| 6080yy午夜一二三区久久| 在线成人av影院| 在线播放中文一区| 555www色欧美视频| 日韩欧美在线网站| 亚洲精品在线一区二区| 久久久高清一区二区三区| 久久亚洲精精品中文字幕早川悠里| 精品国产乱码久久久久久浪潮| 欧美成人bangbros| 久久只精品国产| 国产精品久久久久久久久图文区| 国产精品丝袜一区| 亚洲色图欧美偷拍| 亚洲va国产va欧美va观看| 欧美aaaaa成人免费观看视频| 蜜臀av性久久久久蜜臀aⅴ流畅| 蜜臀av性久久久久蜜臀av麻豆 | 国产网站一区二区| 国产精品天美传媒沈樵| 亚洲第一电影网| 婷婷亚洲久悠悠色悠在线播放| 午夜精品久久久久久不卡8050| 日本亚洲视频在线| 国产一区二区不卡老阿姨| 成人美女视频在线观看| 色欧美日韩亚洲| 91精品国产aⅴ一区二区| 337p日本欧洲亚洲大胆色噜噜| 久久久激情视频| 成人影视亚洲图片在线| 成人午夜碰碰视频| 欧美视频在线观看一区二区| 欧美不卡视频一区| 中文字幕一区二区三区不卡在线 | 6080国产精品一区二区| 久久亚洲一区二区三区四区| 亚洲欧洲韩国日本视频| 亚洲国产综合91精品麻豆| 黑人精品欧美一区二区蜜桃 | 精品伦理精品一区| 国产精品美女久久福利网站| 亚洲制服丝袜一区| 国产一区二区主播在线| 欧美在线免费观看亚洲| 久久久蜜桃精品| 亚洲一区二区三区四区的| 国内欧美视频一区二区| 欧美性猛片xxxx免费看久爱| 精品国产免费一区二区三区四区 | 亚洲人成网站在线| 激情综合色播激情啊| 欧美在线观看视频在线| 国产日产欧美精品一区二区三区| 亚洲1区2区3区4区| 大胆亚洲人体视频| 欧美成人伊人久久综合网| 一区二区三区精品在线| 国产ts人妖一区二区| 欧美一级黄色录像| 亚洲成a人v欧美综合天堂下载 | 欧美大黄免费观看| 亚洲免费观看高清完整版在线 | 国产露脸91国语对白| 精品1区2区3区| 中文字幕一区二区三区四区 | 欧美日韩一级片网站| **性色生活片久久毛片| 国产成a人无v码亚洲福利| 制服.丝袜.亚洲.另类.中文| 亚洲精品一卡二卡| 99这里只有精品| 中文字幕av一区二区三区高| 韩国视频一区二区| 欧美一区二区不卡视频| 亚洲chinese男男1069| 色综合咪咪久久| 中文字幕一区二区三区在线播放| 国产成人av资源| 日韩欧美亚洲另类制服综合在线| 一区二区三区国产| 91丨九色丨黑人外教| 国产精品传媒在线| 99精品视频免费在线观看| 国产精品伦理一区二区| 成人av动漫网站| 综合网在线视频| 97精品视频在线观看自产线路二| 中文字幕中文在线不卡住| www.欧美精品一二区| 日日噜噜夜夜狠狠视频欧美人| 欧美日韩另类一区|