亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

最大限制地提高代碼的可重用性

2019-11-18 11:45:52
字體:
來源:轉載
供稿:網友

  克服傳統面向對象編程方法在可重用性方面的不足
  
  摘要
  不要放棄編寫可重用代碼的努力!本技巧總結了三種修改您的現有代碼以增強其可重用性的方法。
  作者:Jeff Mather
  重用是一種神話,這似乎正在日漸成為編程人員的一種共識。然而,重用可能難以實現,因為傳統面向對象編程方法在可重用性方面存在一些不足。本技巧說明了組成支持重用的一種不同方法的三個步驟?!?br />  第一步:將功能移出類實例方法
  由于類繼續機制缺乏精確性,因此對于代碼重用來說它并不是一種最理想的機制。也就是說,假如您要重用某個類的單個方法,就必須繼續該類的其他方法以及數據成員。這種累贅不必要地將要重用此方法的代碼復雜化了。繼續類對其父類的依靠性引入了額外的復雜性:對父類的更改會影響子類;當更改父類或子類中的任一方時,很難記住覆蓋了哪些方法(或者沒有覆蓋哪些方法);而且是否應該調用相應的父類方法也不明朗。
  
  執行單一概念性任務的任何方法都應該是獨立的,并應將其作為要重用的首選方法。要實現這一點,我們必須返回到過程式編程,將代碼移出類實例方法并將其移入全局可見的過程中。為了提高這類過程的可重用性,您應該像編寫靜態實用方法那樣編寫這類方法:每個過程只使用其自身的輸入參數和/或對其他全局可見過程的調用完成其工作,而且不應該使用任何非局部變量。這種外部依靠性的減弱降低了使用該過程的復雜性,從而可促進在別處對它的重用。當然,即便那些不計劃重用的代碼也會從這種結構中受益,因為它的結構總是相當清楚。
  
  在 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(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 的對象有關。類名前的 p 表示該類的唯一用途就是將公共可見的靜態過程組織起來。然而,在 Java 中類名以小寫字母開頭是不規范的,像 pPolygon 這樣的類并不完成正常的類功能。這就是說,它不代表一類對象;它只是該語言所需的一個組織實體。
  
  在以上事例中所作更改的全部效果就是,客戶端代碼不再非要通過繼續 Polygon 來重用其功能?,F在這一功能在 pPolygon 類中是以過程為單位提供的??蛻舳舜a僅使用它所需的功能,而不必關心它不需要的功能。
  
  這并不意味著類不會在新的過程式編程風格中發揮積極作用。恰恰相反,類要執行必要的分組任務,并封裝它們所代表的對象的數據成員。此外,類通過實現多個接口而具備的多態性使其具備了卓越的可重用性,請參閱第二步中的說明。但是,您應該將通過類繼續獲得可重用性和多態性的方法歸類到優先級較低的技術中,因為將功能包含在實例方法中并不是實現可重用性的最佳選擇。
  
  四人合著的暢銷書 Design Patterns 簡要提及了一種與這一技術只有細微差別的技術。那本書中的 Strategy 模式提倡用一個共公接口將相關算法的每個系列成員都封裝起來,以便客戶端代碼可互換?????這些算法。因為一種算法通常被編寫為一個或幾個獨立的過程,因而這種封裝強調重用執行單一任務(即一個算法)的過程,而不強調重用包含代碼和數據、執行多項任務的對象。本步驟也體現了同樣的基本思想。
  
  然而,用接口封裝算法意味著將算法編寫為實現該接口的一個對象。這意味著我們仍然被束縛在與數據耦合在一起的過程及其封裝對象的其他方法上,因而使重用變得復雜。每次使用算法時必須實例化這些對象也是個問題,這將降低程序的性能。幸運的是, Design Patterns 提供的一種解決方案可解決這兩個問題。在編寫 Strategy 對象時您可使用 Flyweight 模式,以使每個對象僅有一個眾所周知的共享實例(該實例處理執行問題),這樣每個共享對象就不會在兩次訪問之間維護狀態(因此該對象不包含任何成員變量,從而解決了許多耦合問題)。生成的 Flyweight-Strategy 模式將本步驟中封裝功能的技術高度集成在全局可用的無狀態過程中。
  
  第二步:將非基本數據類型的輸入參數類型轉換為接口類型
  通過接口參數類型而非通過類繼續利用多態性,這是在面向對象編程方法中實現可重用性的真正基礎,正如 Allen Holub 在 "Build User Interfaces for Object-Oriented Systems, Part 2" 中所講的那樣。
  
  “... 可重用性是通過編寫接口,而不是通過編寫類來實現的。假如一個方法的所有參數均為一些已知接口的引用,而這些接口又是由您從未聽過的一些類實現的,那么該方法可對編寫代碼時還不存在的類的對象進行操作。從技術上講,可重用的是方法,而不是傳遞給該方法的對象。”
  將 Holub 的論述應用到第一步的結果,一旦某個功能塊可作為一個全局可見的獨立過程,您就可以通過將它的每個類級輸入參數類型轉換為接口類型,從而進一步提高它的可重用性。這樣,實現該接口類型的任何類的對象都符合該參數的要求,而不僅僅是符合原始類的要求。這樣,該過程便潛在地可用于更多的對象類型。
  
  例如,假定您有一個全局可見的靜態方法:
  
  static public boolean contains(Rectangle rect, int x, int y) {...}
  
  該方法旨在判定給定的矩形是否包含給定的位置。此處您應該將 rect 參數的類型從類類型 Rectangle 更改為接口類型,如下所示:
  
  static public boolean contains(Rectangular rect, int x, int y) {...}
  
  Rectangular could be the following interface:
  
  public interface Rectangular {
  Rectangle getBounds();
  }
  
  現在,可描述為 Rectangular 的類(即可實現 Rectangular 接口)的對象都可作為 rect 的參數傳遞給 PRectangular.contains()。我們通過放寬對可傳遞給方法的參數的約束來提高方法的可重用性。
  
  但是,就以上示例而言,當 Rectangle 接口的 getBounds 方法返回一個 Rectangle 時,您可能不知道使用 Rectangular 接口會有什么實際的好處;也就是說,假如我們知道我們要傳入的對象在被請求時能返回 Rectangle;為什么不傳入 Rectangle 類型而要傳入接口類型呢?最重要的原因與集合有關。假定有這樣一個方法:
  
  static public boolean areAnyOverlapping(Collection rects) {...}
  
  該方法旨在判定給定集合中的 rectangular 對象是否有重疊。接下來,在方法體中,當您依次處理集合中的每個對象時,假如無法將對象轉換為諸如 Rectangular 這樣的接口類型,如何才能訪問那個對象的 rectangle 呢?唯一的選擇是將對象轉換為特定的類類型(我們已知該類中有一個方法能提供 rectangle),這意味著該方法必須事先知道它要對何種類類型進行操作,因此重用它時只能使用這些類型。這就是這一步首先要避免的問題!
  
  第三步:選擇耦合性較小的輸入參數接口類型
  在執行第二步時,應該選擇何種接口類型來替代給定的類類型呢?答案是:能充分描述過程對參數的要求且累贅最少的任何接口。參數對象要實現的接口越小,任一特定類能實現該接口的機會就越大 -- 因而其對象可用作該參數的類的數量也就越多。很輕易看出,假如您有如下這樣一個方法:
  
  static public boolean areOverlapping(Window window1, Window window2) {...}
  
  該方法旨在判定兩個(假定為 rectangular)窗口是否重疊,假如該方法僅要求它的兩個參數提供它們各自的 rectangular 坐標,則最好簡化這兩個參數的類型以反映這一事實:
  
  static public boolean areOverlapping(Rectangular rect1, Rectangular rect2) {...}
  
  以上代碼假定前面的 Window 類型對象也能實現 Rectangular?,F在您就可以重用任何 rectangular 對象的第一個方法中所包含的功能。
  
  您可能有過多次這樣的經歷,即充分指定了參數要求的可用接口包含過多不必要的方法。碰到這種情況時,您就應在全局名稱空間中定義一個新的公共接口,以便其他可能面臨同樣窘境的方法重用這個接口。
  
  您也可能有過多次這樣的經歷,即最好創建一個獨特的接口來指定單個過程對一個參數的要求。您所創建的接口只會用于那個參數。當您希望將參數當作 C 中的函數指針處理時經常會出現這種情況,例如,假定有這樣一個過程:
  
  static public void sort(List list, SortComparison comp) {...}
  
  該過程通過使用給定的比較對象 comp 對列表的所有對象進行比較,從而對給定的列表進行排序,sort 對 comp 的全部要求就是調用其單個方法執行比較。因此,SortCo

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕欧美在线| 亚洲国产精品久久久久秋霞蜜臀| 亚洲深夜福利在线| xxav国产精品美女主播| 国产精品流白浆视频| 精品一区精品二区| 国产偷亚洲偷欧美偷精品| 欧美极品少妇xxxxⅹ喷水| 成人xvideos免费视频| 2019最新中文字幕| 美女av一区二区三区| 中文字幕亚洲第一| 欧美激情久久久| 亚洲石原莉奈一区二区在线观看| 国产va免费精品高清在线观看| 96精品久久久久中文字幕| 国产精品男人爽免费视频1| 亚洲第一精品久久忘忧草社区| 不卡在线观看电视剧完整版| 亚洲成年人在线播放| 成人av.网址在线网站| 国产精品久久久久久久久久免费| 国产精品精品久久久久久| 97婷婷大伊香蕉精品视频| 国产亚洲欧洲在线| 一区二区三区视频在线| 日韩欧美精品网站| 欧美日韩精品在线| 亚洲天堂免费在线| 懂色av中文一区二区三区天美| 国产91精品黑色丝袜高跟鞋| 午夜精品在线视频| 北条麻妃99精品青青久久| 国产成人jvid在线播放| 久久久久久com| 久久久久国产精品www| 久久黄色av网站| 日韩精品中文字幕有码专区| 色诱女教师一区二区三区| 中文字幕亚洲综合| 亚洲色图偷窥自拍| 久久国产色av| 欧美综合一区第一页| 久久久精品视频成人| 国产精品日韩一区| 成人国产精品日本在线| 欧美激情精品久久久久久变态| 亚洲精品久久久久| 日韩视频免费在线| 欧美久久精品午夜青青大伊人| 欧美日韩国产在线播放| 国产精品久久99久久| 久久精品国产成人精品| 91精品国产综合久久香蕉的用户体验| 日韩女在线观看| 亚洲第一男人av| 欧美精品videos性欧美| 狠狠色香婷婷久久亚洲精品| 亚洲精品成人网| 最近中文字幕2019免费| 91在线色戒在线| www.99久久热国产日韩欧美.com| 欧美性xxxx18| 日韩欧美国产激情| 亚洲午夜未满十八勿入免费观看全集| 久久久久久久久久av| 亚洲情综合五月天| 自拍亚洲一区欧美另类| 国产激情久久久久| 亚洲人成电影网站色xx| 68精品国产免费久久久久久婷婷| 亚洲精品网址在线观看| 久久久久久久亚洲精品| 91久久久久久久久久久久久| 亚洲人成电影网站| 国产成人黄色av| 日韩精品在线私人| 色偷偷9999www| 日韩免费观看在线观看| 精品magnet| 亚洲国产欧美久久| 中文欧美日本在线资源| 羞羞色国产精品| 欧美性色19p| 久久夜色精品国产欧美乱| 欧美寡妇偷汉性猛交| 成人疯狂猛交xxx| 国产午夜精品久久久| 亚洲一区精品电影| 性色av一区二区三区免费| 国产成人中文字幕| 欧洲美女免费图片一区| 少妇精69xxtheporn| 91九色国产社区在线观看| 隔壁老王国产在线精品| 日本成人激情视频| 亚洲综合日韩中文字幕v在线| 欧美精品国产精品日韩精品| 国产精品免费电影| 91在线免费看网站| 久久久久久久久久亚洲| 性色av香蕉一区二区| 97色在线视频观看| 亚洲日本欧美日韩高观看| 国产精品看片资源| 亚洲第一精品电影| 国内精品伊人久久| 精品动漫一区二区| 亚洲国产精品久久| 亚洲自拍中文字幕| 欧美精品999| 国产在线日韩在线| 91午夜在线播放| 91精品视频在线播放| 国产精品欧美风情| 亚洲精品久久在线| 欧美另类在线播放| 日本欧美精品在线| 成人写真视频福利网| 欧美丰满老妇厨房牲生活| 国产精品成熟老女人| 欧美高清理论片| 精品久久久久久久久久ntr影视| 国产精品国内视频| 欧美噜噜久久久xxx| 中文字幕综合一区| 高清欧美性猛交xxxx黑人猛交| 久久亚洲综合国产精品99麻豆精品福利| 亚洲激情久久久| 欧美成人激情图片网| 91精品国产91久久久久福利| 中文字幕亚洲自拍| 深夜福利日韩在线看| 久久久国产视频| 性欧美亚洲xxxx乳在线观看| 秋霞午夜一区二区| 国产精品旅馆在线| 91大神福利视频在线| 91国内免费在线视频| 欧美中文字幕视频在线观看| 中文字幕日韩欧美精品在线观看| 国内精品小视频在线观看| 成人网欧美在线视频| 亚洲加勒比久久88色综合| 色偷偷888欧美精品久久久| 国产精品a久久久久久| 中文字幕精品www乱入免费视频| 日韩久久精品成人| 久久久中精品2020中文| 成人夜晚看av| 日韩综合视频在线观看| 91高清在线免费观看| 欧美极品少妇与黑人| 中文字幕精品在线| 亚洲国产欧美久久| 久久成人精品一区二区三区| 亚洲欧美在线免费观看| 亚洲国产高清福利视频| 国产精品亚洲视频在线观看| 欧美在线视频在线播放完整版免费观看| 日韩电影在线观看免费| 日韩精品在线观看网站| 欧美一区二区三区免费视| 日韩高清电影好看的电视剧电影|