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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? 最大限制地提高代碼的可重用性(轉(zhuǎn)).txt

?? Java技術(shù)收集很多各種技術(shù)總結(jié)
?? TXT
字號:
作者:zergman
email: zergman@chinaasp.com
日期:2001-6-15 13:28:57
[b]最大限制地提高代碼的可重用性
克服傳統(tǒng)面向?qū)ο缶幊谭椒ㄔ诳芍赜眯苑矫娴牟蛔鉡/b]

[BLOCKQUOTE][b]摘要[/b]
不要放棄編寫可重用代碼的努力!本技巧總結(jié)了三種修改您的現(xiàn)有代碼以增強其可重用性的方法。[i][/i] [/BLOCKQUOTE][b]作者:Jeff Mather([email]jeff.mather@javaworld.com[/email])[/b]
重用是一種神話,這似乎正在日漸成為編程人員的一種共識。然而,重用可能難以實現(xiàn),因為傳統(tǒng)面向?qū)ο缶幊谭椒ㄔ诳芍赜眯苑矫娲嬖谝恍┎蛔恪1炯记烧f明了組成支持重用的一種不同方法的三個步驟。 
[b]第一步:將功能移出類實例方法[/b]
由于類繼承機制缺乏精確性,因此對于代碼重用來說它并不是一種最理想的機制。也就是說,如果您要重用某個類的單個方法,就必須繼承該類的其他方法以及數(shù)據(jù)成員。這種累贅不必要地將要重用此方法的代碼復雜化了。繼承類對其父類的依賴性引入了額外的復雜性:對父類的更改會影響子類;當更改父類或子類中的任一方時,很難記住覆蓋了哪些方法(或者沒有覆蓋哪些方法);而且是否應(yīng)該調(diào)用相應(yīng)的父類方法也不明朗。 
執(zhí)行單一概念性任務(wù)的任何方法都應(yīng)該是獨立的,并應(yīng)將其作為要重用的首選方法。要實現(xiàn)這一點,我們必須返回到過程式編程,將代碼移出類實例方法并將其移入全局可見的過程中。為了提高這類過程的可重用性,您應(yīng)該像編寫靜態(tài)實用方法那樣編寫這類方法:每個過程只使用其自身的輸入?yún)?shù)和/或?qū)ζ渌挚梢娺^程的調(diào)用完成其工作,而且不應(yīng)該使用任何非局部變量。這種外部依賴性的減弱降低了使用該過程的復雜性,從而可促進在別處對它的重用。當然,即便那些不計劃重用的代碼也會從這種結(jié)構(gòu)中受益,因為它的結(jié)構(gòu)總是相當清晰。 
在 Java 中,方法不能脫離類而存在。但是,您可以采取相關(guān)步驟,使方法成為單個類的、公共可見的靜態(tài)方法。作為示例,您可以采用類似下面這樣的一個類: 
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(Point p) {return pPolygon.containsPoint(this, p);} 
      . 
      . 
} 

其中,pPolygon 如下所示: 
class pPolygon { 
    static public int computePerimeter(Polygon polygon) {...} 
    static public boolean isConvex(Polygon polygon) {...} 
    static public boolean containsPoint(Polygon polygon, Point p) {...} 
} 

類名 pPolygon 反映了該類所封裝的過程主要與類型 Polygon 的對象有關(guān)。類名前的 p 表示該類的唯一用途就是將公共可見的靜態(tài)過程組織起來。然而,在 Java 中類名以小寫字母開頭是不規(guī)范的,像 pPolygon 這樣的類并不完成正常的類功能。這就是說,它不代表一類對象;它只是該語言所需的一個組織實體。 
在以上事例中所作更改的全部效果就是,客戶端代碼不再非要通過繼承 Polygon 來重用其功能。現(xiàn)在這一功能在 pPolygon 類中是以過程為單位提供的。客戶端代碼僅使用它所需的功能,而不必關(guān)心它不需要的功能。 
這并不意味著類不會在新的過程式編程風格中發(fā)揮積極作用。恰恰相反,類要執(zhí)行必要的分組任務(wù),并封裝它們所代表的對象的數(shù)據(jù)成員。此外,類通過實現(xiàn)多個接口而具備的多態(tài)性使其具備了卓越的可重用性,請參閱第二步中的說明。但是,您應(yīng)該將通過類繼承獲得可重用性和多態(tài)性的方法歸類到優(yōu)先級較低的技術(shù)中,因為將功能包含在實例方法中并不是實現(xiàn)可重用性的最佳選擇。 
四人合著的暢銷書 [url href=http://www.cn.ibm.com/developerWorks/java/jw-tips/tip107/index.shtml#resources][i]Design Patterns[/i][/url] 簡要提及了一種與這一技術(shù)只有細微差別的技術(shù)。那本書中的 [i]Strategy[/i] 模式提倡用一個共公接口將相關(guān)算法的每個系列成員都封裝起來,以便客戶端代碼可互換這些算法。因為一種算法通常被編寫為一個或幾個獨立的過程,因而這種封裝強調(diào)重用執(zhí)行單一任務(wù)(即一個算法)的過程,而不強調(diào)重用包含代碼和數(shù)據(jù)、執(zhí)行多項任務(wù)的對象。本步驟也體現(xiàn)了同樣的基本思想。 
然而,用接口封裝算法意味著將算法編寫為實現(xiàn)該接口的一個對象。這意味著我們?nèi)匀槐皇`在與數(shù)據(jù)耦合在一起的過程及其封裝對象的其他方法上,因而使重用變得復雜。每次使用算法時必須實例化這些對象也是個問題,這將降低程序的性能。幸運的是,[i]Design Patterns[/i] 提供的一種解決方案可解決這兩個問題。在編寫 Strategy 對象時您可使用 [i]Flyweight[/i] 模式,以使每個對象僅有一個眾所周知的共享實例(該實例處理執(zhí)行問題),這樣每個共享對象就不會在兩次訪問之間維護狀態(tài)(因此該對象不包含任何成員變量,從而解決了許多耦合問題)。生成的 Flyweight-Strategy 模式將本步驟中封裝功能的技術(shù)高度集成在全局可用的無狀態(tài)過程中。 
[b]第二步:將非基本數(shù)據(jù)類型的輸入?yún)?shù)類型轉(zhuǎn)換為接口類型[/b]
通過接口參數(shù)類型而非通過類繼承利用多態(tài)性,這是在面向?qū)ο缶幊谭椒ㄖ袑崿F(xiàn)可重用性的真正基礎(chǔ),正如 Allen Holub 在 [url href=http://www.cn.ibm.com/developerWorks/java/jw-tips/tip107/index.shtml#resources]"Build User Interfaces for Object-Oriented Systems, Part 2"[/url] 中所講的那樣。 
[BLOCKQUOTE]“... 可重用性是通過編寫接口,而不是通過編寫類來實現(xiàn)的。如果一個方法的所有參數(shù)均為一些已知接口的引用,而這些接口又是由您從未聽過的一些類實現(xiàn)的,那么該方法可對編寫代碼時還不存在的類的對象進行操作。從技術(shù)上講,可重用的是方法,而不是傳遞給該方法的對象。” [/BLOCKQUOTE]
將 Holub 的論述應(yīng)用到第一步的結(jié)果,一旦某個功能塊可作為一個全局可見的獨立過程,您就可以通過將它的每個類級輸入?yún)?shù)類型轉(zhuǎn)換為接口類型,從而進一步提高它的可重用性。這樣,實現(xiàn)該接口類型的任何類的對象都符合該參數(shù)的要求,而不僅僅是符合原始類的要求。這樣,該過程便潛在地可用于更多的對象類型。 
例如,假定您有一個全局可見的靜態(tài)方法: 
static public boolean contains(Rectangle rect, int x, int y) {...} 

該方法旨在判斷給定的矩形是否包含給定的位置。此處您應(yīng)該將 rect 參數(shù)的類型從類類型 Rectangle 更改為接口類型,如下所示: 
static public boolean contains(Rectangular rect, int x, int y) {...} 

Rectangular could be the following interface: 
public interface Rectangular { 
      Rectangle getBounds(); 
} 

現(xiàn)在,可描述為 Rectangular 的類(即可實現(xiàn) Rectangular 接口)的對象都可作為 rect 的參數(shù)傳遞給 pRectangular.contains()。我們通過放寬對可傳遞給方法的參數(shù)的約束來提高方法的可重用性。 
但是,就以上示例而言,當 Rectangle 接口的 getBounds 方法返回一個 Rectangle 時,您可能不知道使用 Rectangular 接口會有什么實際的好處;也就是說,如果我們知道我們要傳入的對象在被請求時能返回 Rectangle;為什么不傳入 Rectangle 類型而要傳入接口類型呢?最重要的原因與集合有關(guān)。假定有這樣一個方法: 
static public boolean areAnyOverlapping(Collection rects) {...} 

該方法旨在判斷給定集合中的 rectangular 對象是否有重疊。接下來,在方法體中,當您依次處理集合中的每個對象時,如果無法將對象轉(zhuǎn)換為諸如 Rectangular 這樣的接口類型,如何才能訪問那個對象的 rectangle 呢?唯一的選擇是將對象轉(zhuǎn)換為特定的類類型(我們已知該類中有一個方法能提供 rectangle),這意味著該方法必須事先知道它要對何種類類型進行操作,因此重用它時只能使用這些類型。這就是這一步首先要避免的問題! 
[b]第三步:選擇耦合性較小的輸入?yún)?shù)接口類型[/b]
在執(zhí)行第二步時,應(yīng)該選擇何種接口類型來替代給定的類類型呢?答案是:能充分描述過程對參數(shù)的要求且累贅最少的任何接口。參數(shù)對象要實現(xiàn)的接口越小,任一特定類能實現(xiàn)該接口的機會就越大 -- 因而其對象可用作該參數(shù)的類的數(shù)量也就越多。很容易看出,如果您有如下這樣一個方法: 
static public boolean areOverlapping(Window window1, Window window2) {...} 

該方法旨在判斷兩個(假定為 rectangular)窗口是否重疊,如果該方法僅要求它的兩個參數(shù)提供它們各自的 rectangular 坐標,則最好[i]簡化[/i]這兩個參數(shù)的類型以反映這一事實: 
static public boolean areOverlapping(Rectangular rect1, Rectangular rect2) {...} 

以上代碼假定前面的 Window 類型對象也能實現(xiàn) Rectangular。現(xiàn)在您就可以重用任何 rectangular 對象的第一個方法中所包含的功能。 
您可能有過多次這樣的經(jīng)歷,即充分指定了參數(shù)要求的可用接口包含過多不必要的方法。碰到這種情況時,您就應(yīng)在全局名稱空間中定義一個新的公共接口,以便其他可能面臨同樣窘境的方法重用這個接口。 
您也可能有過多次這樣的經(jīng)歷,即最好創(chuàng)建一個獨特的接口來指定單個過程對一個參數(shù)的要求。您所創(chuàng)建的接口只會用于那個參數(shù)。當您希望將參數(shù)當作 C 中的函數(shù)指針處理時經(jīng)常會出現(xiàn)這種情況,例如,假定有這樣一個過程: 
static public void sort(List list, SortComparison comp) {...} 

該過程通過使用給定的比較對象 comp 對列表的所有對象進行比較,從而對給定的列表進行排序,sort 對 comp 的全部要求就是調(diào)用其單個方法執(zhí)行比較。因此,SortComparison 應(yīng)該是僅包含一個方法的接口: 
public interface SortComparison { 
      boolean comesBefore(Object a, Object b); 
} 

該接口的唯一用途就是為 sort 提供一種訪問完成其工作所需功能的方法,因此 SortComparison 不應(yīng)在別處重用。 
[b]小結(jié)[/b]
以上三步旨在改進用更傳統(tǒng)的面向?qū)ο蠓椒ň帉懙默F(xiàn)有代碼。將這三個步驟與面向?qū)ο缶幊探Y(jié)合使用即可構(gòu)建一種新的方法,您可用這種新方法編寫以后的代碼,這樣編寫代碼將提高方法的可重用性和內(nèi)聚性,同時也會減少方法的相互耦合及復雜性。 
很明顯,您不應(yīng)該對本質(zhì)上不適合重用的代碼執(zhí)行這些步驟。這種代碼通常存在于程序的表示層。創(chuàng)建程序用戶界面的代碼及將輸入事件綁定到完成實際操作的控制代碼是不可重用的兩個例子,因為它們的功能隨程序的不同而相差甚遠,根本無法實現(xiàn)可重用性。[img]http://a301.g.akamai.net/7/301/1403/v001/www.javaworld.com/javaworld/icons/dingbat.gif[/img] 
[TABLE][TR][TD][b]作者簡介 [/b]
Jeff Mather([email]jeff.mather@javaworld.com[/email]) 為基于 Tucson,Ariz. 的 [url href=http://www.eblox.com/]eBlox.com[/url] 工作,在那里他為一些公司創(chuàng)建有關(guān)宣傳材料和生物工藝行業(yè)的 applet。他還在業(yè)余時間編寫[url href=http://geocities.com/silmar_game/]共享游戲[/url]。 [/TD][/TR][/TABLE]
[b]參考資源[/b] [UL][LI]欲了解 Allen Holub 對重用的見解,請閱讀他在 [i]JavaWorld[/i] 發(fā)表的文章,"Build User Interfaces for Object-Oriented system, Part 2": 
[url href=http://www.javaworld.com/javaworld/jw-09-1999/jw-09-toolbox.html]http://www.javaworld.com/javaworld/jw-09-1999/jw-09-toolbox.html [/url][LI]Allen Holub 的 [b]Toolbox[/b] 專欄的完整清單: 
[url href=http://www.javaworld.com/javaworld/topicalindex/jw-ti-toolbox.html]http://www.javaworld.com/javaworld/topicalindex/jw-ti-toolbox.html [/url][LI][i]Design Patterns:Elements of Reusable Object-Oriented Software[/i],Erich Gamma 等 (Addison-Wesley,1995): 
[url href=http://www.amazon.com/exec/obidos/ASIN/0201633612/javaworld]http://www.amazon.com/exec/obidos/ASIN/0201633612/javaworld [/url][LI]查看以前的所有 [b]Java 技巧[/b]并提交您自己的技巧: 
[url href=http://www.javaworld.com/javatips/jw-javatips.index.html]http://www.javaworld.com/javatips/jw-javatips.index.html [/url][LI]Java 專家在 [i]JavaWorld[/i] 的 [b]JavaQ&A[/b] 專欄解答您最棘手的 Java 問題: 
[url href=http://www.javaworld.com/javaworld/javaqa/javaqa-index.html]http://www.javaworld.com/javaworld/javaqa/javaqa-index.html [/url][LI]通過 [i]JavaWorld[/i] 的 [b]Java101[/b] 專欄從基礎(chǔ)開始學習 Java: 
[url href=http://www.javaworld.com/javaworld/topicalindex/jw-ti-java101.html]http://www.javaworld.com/javaworld/topicalindex/jw-ti-java101.html [/url][LI]訪問 [i]JavaWorld[/i] 的主題索引: 
[url href=http://www.javaworld.com/javaworld/topicalindex/jw-ti-index.html]http://www.javaworld.com/javaworld/topicalindex/jw-ti-index.html [/url][LI]要了解更多的 Java 竅門,請訂閱 ITworld.com 的免費 [i]Java Tutor[/i] 時事通訊: 
[url href=http://reg.itworld.com/cgi-bin/subcontent12.cgi]http://reg.itworld.com/cgi-bin/subcontent12.cgi [/url][LI]參與 [b]Java Beginner[/b] 的討論,由 [i]JavaWorld[/i] 作者 Geoff Friesen 負責協(xié)調(diào): 
[url]http://www.itworld.com/jump/jw-javatip107/forums.itworld.com/webx?14@@.ee6b804/1195!skip=1125[/url] [/LI][/UL]

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美v亚洲v综合ⅴ国产v| 亚洲精品视频在线| 亚洲欧美色一区| 老司机精品视频线观看86| 成人视屏免费看| 日韩一区二区免费视频| 一区二区三区中文在线观看| 国产做a爰片久久毛片| 欧美色网一区二区| 国产精品美女久久久久久| 日本女人一区二区三区| 在线观看av一区| 国产精品成人网| 国产麻豆视频一区二区| 91麻豆精品国产自产在线| 亚洲精品综合在线| 国产黄色精品视频| 久久久久久久久久久久久夜| 日韩高清在线一区| 欧美欧美午夜aⅴ在线观看| 亚洲日穴在线视频| 97久久精品人人澡人人爽| 久久精品一区八戒影视| 99国产精品久久久久久久久久| 久久亚洲精品国产精品紫薇| 日韩二区三区在线观看| 欧美日韩国产bt| 亚洲一区二区三区视频在线播放| 99在线精品视频| 亚洲视频在线观看三级| 色中色一区二区| 亚洲精品国产a| 欧美网站大全在线观看| 日韩综合一区二区| 欧美人牲a欧美精品| 日韩av在线发布| 精品少妇一区二区| 韩国中文字幕2020精品| 久久精品人人做| 国产91色综合久久免费分享| 国产精品私人影院| 91影视在线播放| 亚洲国产精品尤物yw在线观看| 欧美群妇大交群中文字幕| 蜜芽一区二区三区| 久久男人中文字幕资源站| 国产成人精品免费| 最新成人av在线| 欧洲国内综合视频| 奇米影视在线99精品| 国产人伦精品一区二区| 色综合久久久久综合体| 日韩精品一二三| 久久久久久久久岛国免费| 99精品视频一区| 亚洲成人www| 久久久久久99久久久精品网站| 成人激情免费视频| 亚洲bt欧美bt精品| 久久亚洲综合av| 欧洲精品中文字幕| 久久99久久99精品免视看婷婷| 日本一区二区三区在线观看| 在线观看亚洲精品| 精品一区二区影视| 亚洲卡通动漫在线| 精品国产三级电影在线观看| jiyouzz国产精品久久| 五月激情综合色| 亚洲国产精品高清| 欧美日本国产视频| a4yy欧美一区二区三区| 男人操女人的视频在线观看欧美| 国产精品乱码久久久久久| 欧美女孩性生活视频| 成人免费视频视频| 青青草原综合久久大伊人精品 | 欧美群妇大交群中文字幕| 国产一区二区三区四区五区入口 | 韩日av一区二区| 亚洲一区二区五区| 国产日韩欧美精品在线| 91精品中文字幕一区二区三区| 成人美女视频在线看| 三级一区在线视频先锋| 中文字幕一区在线| 日韩免费高清av| 精品视频在线免费观看| 日韩精品一区二区三区中文不卡 | 国产精品美女www爽爽爽| 在线不卡免费欧美| 色综合天天做天天爱| 国产jizzjizz一区二区| 麻豆精品一区二区三区| 亚洲午夜久久久久| 亚洲免费色视频| 国产精品久久午夜| 国产亚洲精品中文字幕| 精品国产乱码久久久久久夜甘婷婷 | 亚洲精品国久久99热| 国产婷婷精品av在线| 日韩精品专区在线影院重磅| 欧美三级三级三级| 欧美性受xxxx黑人xyx| 91美女片黄在线| 99热在这里有精品免费| 成人av午夜影院| 成人看片黄a免费看在线| 国产乱码精品一区二区三区av| 美洲天堂一区二卡三卡四卡视频| 香蕉成人伊视频在线观看| 亚洲国产视频一区| 午夜视频在线观看一区二区| 亚洲午夜成aⅴ人片| 亚洲第一二三四区| 日韩黄色免费电影| 奇米777欧美一区二区| 开心九九激情九九欧美日韩精美视频电影 | 日本不卡免费在线视频| 免费日本视频一区| 久久精品国产精品亚洲红杏| 韩国精品免费视频| 国产美女在线精品| 成人三级伦理片| 97成人超碰视| 欧美日韩精品一区二区三区| 欧美久久一二三四区| 日韩欧美在线123| www激情久久| 国产精品电影院| 亚洲夂夂婷婷色拍ww47 | 综合精品久久久| 一区二区三区日韩欧美精品 | 国产精品久久综合| 一区二区三区四区精品在线视频| 亚洲一区中文在线| 久久成人羞羞网站| 成人国产精品免费网站| 欧美日韩中文一区| 久久免费国产精品| 亚洲女同ⅹxx女同tv| 日本vs亚洲vs韩国一区三区二区 | 色综合色综合色综合色综合色综合 | 国产乱码精品一区二区三区av| 欧美va在线播放| 精品国产乱码久久久久久免费| 国产精品国产馆在线真实露脸| 一区二区激情视频| 精品一二三四区| 色偷偷久久人人79超碰人人澡| 91.麻豆视频| 国产精品久久久久久久久晋中 | 亚洲一区二区三区四区五区中文| 日韩国产一区二| 91视视频在线直接观看在线看网页在线看 | 91精品国产一区二区| 中文字幕乱码一区二区免费| 亚瑟在线精品视频| 国产99久久精品| 欧美精品一二三| 《视频一区视频二区| 久久成人精品无人区| 在线免费观看日韩欧美| 2023国产精品视频| 视频一区中文字幕| 91老司机福利 在线| 久久久影视传媒| 日精品一区二区三区| 日本久久电影网| 久久精品视频一区二区三区| 午夜电影网亚洲视频| 成人激情免费视频| 久久在线免费观看| 日韩高清在线电影| 欧美三级欧美一级| 国产精品久久久久桃色tv| 国内成人精品2018免费看| 欧美剧情电影在线观看完整版免费励志电影 | 欧美日韩一区二区在线观看| 日本一区二区三区在线观看| 蜜臀av一级做a爰片久久| 欧美唯美清纯偷拍| 亚洲激情图片小说视频| 成人国产亚洲欧美成人综合网 | 国产精品电影院| 国产白丝精品91爽爽久久| 久久亚洲一区二区三区明星换脸| 日韩中文字幕91| 欧美日韩国产免费一区二区| 一区二区成人在线视频| 99久久精品国产观看| 国产精品久久久一区麻豆最新章节| 久久99精品国产麻豆婷婷| 91精品国产免费| 奇米亚洲午夜久久精品| 日韩一区二区电影网| 蜜臀av性久久久久av蜜臀妖精| 69久久夜色精品国产69蝌蚪网| 亚洲一区二区三区激情| 欧美日韩免费不卡视频一区二区三区|