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

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

代碼復用的規則

2019-11-18 12:11:50
字體:
來源:轉載
供稿:網友

  代碼復用是絕大多數程序員所期望的,也是OO的目標之一??偨Y我多年的編碼經驗,為了使代碼能夠最大程度上復用,應該非凡注重以下幾個方面。
  1、 對接口編程
  "對接口編程"是面向對象設計(OOD)的第一個基本原則。它的含義是:使用接口和同類型的組件通訊,即,對于所有完成相同功能的組件,應該抽象出一個接口,它們都實現該接口。具體到java中,可以是接口(interface),或者是抽象類(abstract class),所有完成相同功能的組件都實現該接口,或者從該抽象類繼續。我們的客戶代碼只應該和該接口通訊,這樣,當我們需要用其它組件完成任務時,只需要替換該接口的實現,而我們代碼的其它部分不需要改變!
  
  當現有的組件不能滿足要求時,我們可以創建新的組件,實現該接口,或者,直接對現有的組件進行擴展,由子類去完成擴展的功能。
  
  2、 優先使用對象組合,而不是類繼續
  "優先使用對象組合,而不是類繼續"是面向對象設計的第二個原則。并不是說繼續不重要,而是因為每個學習OOP的人都知道OO的基本特性之一就是繼續,以至于繼續已經被濫用了,而對象組合技術往往被忽視了。下面分析繼續和組合的優缺點:
  
  類繼續答應你根據其他類的實現來定義一個類的實現。這種通過生成子類的復用通常被稱為白箱復用(white-box reuse)。術語"白箱"是相對可視性而言:在繼續方式中,父類的內部細節對子類可見。
  
  對象組合是類繼續之外的另一種復用選擇。新的更復雜的功能可以通過組合對象來獲得。對象組合要求對象具有良好定義的接口。這種復用風格被稱為黑箱復用(black-box reuse),因為被組合的對象的內部細節是不可見的。對象只以"黑箱"的形式出現。
  
  繼續和組合各有優缺點。類繼續是在編譯時刻靜態定義的,且可直接使用,類繼續可以較方便地改變父類的實現。但是類繼續也有一些不足之處。首先,因為繼續在編譯時刻就定義了,所以無法在運行時刻改變從父類繼續的實現。更糟的是,父類通常至少定義了子類的部分行為,父類的任何改變都可能影響子類的行為。假如繼續下來的實現不適合解決新的問題,則父類必須重寫或被其他更適合的類替換。這種依靠關系限制了靈活性并最終限制了復用性。
  
  對象組合是通過獲得對其他對象的引用而在運行時刻動態定義的。由于組合要求對象具有良好定義的接口,而且,對象只能通過接口訪問,所以我們并不破壞封裝性;只要類型一致,運行時刻還可以用一個對象來替代另一個對象;更進一步,因為對象的實現是基于接口寫的,所以實現上存在較少的依靠關系。
  
  優先使用對象組合有助于你保持每個類被封裝,并且只集中完成單個任務。這樣類和類繼續層次會保持較小規模,并且不太可能增長為不可控制的龐然大物(這正是濫用繼續的后果)。另一方面,基于對象組合的設計會有更多的對象(但只有較少的類),且系統的行為將依靠于對象間的關系而不是被定義在某個類中。
  
  注重:理想情況下,我們不用為獲得復用而去創建新的組件,只需要使用對象組合技術,通過組裝已有的組件就能獲得需要的功能。但是事實很少如此,因為可用的組件集合并不豐富。使用繼續的復用使得創建新的組件要比組裝已有的組件來得輕易。這樣,繼續和對象組合常一起使用。然而,正如前面所說,千萬不要濫用繼續而忽視了對象組合技術。
  
  相關的設計模式有:Bridge、Composite、Decorator、Observer、Strategy等。
  
  下面的例子演示了這個規則,它的前提是:我們對同一個數據結構,需要以任意的格式輸出。
  
  第一個例子,我們使用基于繼續的框架,可以看到,它很難維護和擴展。
  abstract class AbstractExampleDocument
  {
  // skip some code ...
  public void output(Example strUCture)
  {
  if( null != structure )
  {
  this.format( structure );
  }
  }
  PRotected void format(Example structure);
  }
  
  
  
  
  第二個例子,我們使用基于對象組合技術的框架,每個對象的任務都清楚的分離開來,我們可以替換、擴展格式類,而不用考慮其它的任何事情。
  class DefaultExampleDocument
  {
   // skip some code ...
   public void output(Example structure)
   {
   ExampleFormatter formatter =
   (ExampleFormatter) manager.lookup(Roles.FORMATTER);
   if( null != structure )
   {
   formatter.format(structure);
   }
   }
  }
  
  
  這里,用到了類似于"抽象工廠"的組件創建模式,它將組件的創建過程交給manager來完成;ExampleFormatter是所有格式的抽象父類;
  
  3、 將可變的部分和不可變的部分分離
  "將可變的部分和不可變的部分分離"是面向對象設計的第三個原則。假如使用繼續的復用技術,我們可以在抽象基類中定義好不可變的部分,而由其子類去具體實現可變的部分,不可變的部分不需要重復定義,而且便于維護。假如使用對象組合的復用技術,我們可以定義好不可變的部分,而可變的部分可以由不同的組件實現,根據需要,在運行時動態配置。這樣,我們就有更多的時間關注可變的部分。
  
  對于對象組合技術而言,每個組件只完成相對較小的功能,相互之間耦合比較松散,復用率較高,通過組合,就能獲得新的功能。
  
  4、 減少方法的長度
  通常,我們的方法應該只有盡量少的幾行,太長的方法會難以理解,而且,假如方法太長,則應該重新設計。對此,可以總結為以下原則:
  
  三十秒原則:
  假如另一個程序員無法在三十秒之內了解你的函數做了什么(What),如何做(How)以及為什么要這樣做(Why),那就說明你的代碼是難以維護的,必須得到提高;
  一屏原則:
  假如一個函數的代碼長度超過一個屏幕,那么或許這個函數太長了,應該拆分成更小的子函數;
  一行代碼盡量簡短,并且保證一行代碼只做一件事
  
  那種看似技巧性的冗長代碼只會增加代碼維護的難度。
  
  5、 消除case / if語句
  要盡量避免在代碼中出現判定語句,來測試一個對象是否某個特定類的實例。通常,假如你需要這么做,那么,重新設計可能會有所幫助。我在工作中碰到這樣的一個問題:我們在使用JAVA做xml解析時,對每個標簽映射了一個JAVA類,采用SAX(簡單的XML接口API:Simple API for XML)模型。結果,代碼中反復出現了大量的判定語句,來測試當前的標簽類型。為此,我們重新設計了DTD(文檔類型定義:Document Type Definition),為每個標簽增加了一個固定的屬性:classname,而且重新設計了每個標簽映射的JAVA類的接口,統一了每個對象的操作: addElement(Element aElement); //增加子元素
  addAttribute(String attName, String attValue); //增加屬性;
  
  則徹底消除了所有的測試當前的標簽類型的判定語句。每個對象通過 Class.forName(aElement.attributes.getAttribute("classname")).newInstence(); 動態創建,
  
  6、 減少參數個數
  有大量參數需要傳遞的方法,通常很難閱讀。我們可以將所有參數封裝到一個對象中來完成對象的傳遞,這也有利于錯誤跟蹤。
  
  許多程序員因為,太多層的對象包裝對系統效率有影響。是的,但是,和它帶來的好處相比,我們寧愿做包裝。究竟,"封裝"也是OO的基本特性之一,而且,"每個對象完成盡量少(而且簡單)的功能",也是OO的一個基本原則。
  
  7、 類層次的最高層應該是抽象類
  在許多情況下,提供一個抽象基類有利做特性化擴展。由于在抽象基類中,大部分的功能和行為已經定義好,使我們更輕易理解接口設計者的意圖是什么。
  
  由于JAVA不答應"多繼續",從一個抽象基類繼續,就無法再從其它基類繼續了。所以,提供一個抽象接口(interface)是個好主意,一個類可以實現多個接口,從而模擬實現了"多繼續",為類的設計提供了更大的靈活性。
  
  8、 盡量減少對變量的直接訪問
  對數據的封裝原則應該規范化,不要把一個類的屬性暴露給其它類,而是應該通過訪問方法去保護他們,這有利于避免產生波紋效應。假如某個屬性的名字改變,你只需要修改它的訪問方法,而不是修改所有相關的代碼。
  
  9、 子類應該特性化,完成非凡功能
  假如一個子類只是使一個組件變成組件治理器,而不是實現接口功能,或者,重載某個功能,那么,就應該使用一個外部的容器類,而不是創建一個子類。
  
  建議:類層次結構圖,不要太深;
  
  例如:下面的接口定義了組件的功能:發送消息;類Transceiver實現了該接口;而其子類Pool只是治理多個Transceiver對象,而沒有提供自己的接口實現。建議使用組合方式,而不是繼續!
  public interface ITransceiver{
   public abstract send(String msg);
  }
  
  public class Transceiver implements ITransceiver {
   public send(String msg){
   System.out.println(msg);
   }
  }
  
  //使用繼續方式的實現
  public class Pool extends Transceiver{
   private List pool = new Vector();
   public void add(Transceiver aTransceiver){
   pool.add(aTransceiver);
  }
  public Transceiver get(int index){
   pool.get(index);
  }
  }
  
  //使用組合方式的實現
  public class Pool {
   private List pool = new Vector();
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美美女操人视频| 欧美在线视频在线播放完整版免费观看| 国产精品三级在线| 成人免费网站在线看| 91精品久久久久久久久不口人| 欧美激情视频一区二区三区不卡| 亚洲剧情一区二区| 欧美日韩在线第一页| 成人av在线天堂| 97久久伊人激情网| 91av在线网站| 欧美做爰性生交视频| 欧美成年人网站| 亚洲激情视频网| 国产97在线播放| 日韩有码在线播放| 91综合免费在线| 久久不射热爱视频精品| 精品欧美国产一区二区三区| 国产精品h片在线播放| 亚洲一区二区三区久久| 久久久国产一区| 亚洲成色777777在线观看影院| 91精品国产777在线观看| 夜夜嗨av色综合久久久综合网| 日韩美女免费视频| 国产成人aa精品一区在线播放| 91高清免费视频| 精品欧美aⅴ在线网站| 国产综合在线观看视频| 国产精品精品久久久久久| 欧美巨大黑人极品精男| 精品国产一区二区三区久久久狼| 亚洲国产高潮在线观看| 狠狠躁夜夜躁人人爽超碰91| 国产精品毛片a∨一区二区三区|国| 亚洲字幕一区二区| 欧美精品国产精品日韩精品| 国产精品av在线播放| 亚洲欧洲国产精品| 一本色道久久88精品综合| 久久久日本电影| 亚洲第一精品久久忘忧草社区| 亚洲国产精品专区久久| 97在线精品国自产拍中文| 亚洲三级黄色在线观看| 久久久久久久久久久免费精品| 视频在线观看一区二区| 精品欧美aⅴ在线网站| 成人免费大片黄在线播放| 欧美性xxxx| 欧美日韩中文字幕在线视频| 国产精品一区二区久久精品| 日本久久久久久久| 91香蕉亚洲精品| 成人黄色大片在线免费观看| 日韩在线视频线视频免费网站| 欧美成人午夜激情在线| 欧美www视频在线观看| 国产91在线高潮白浆在线观看| 中文字幕在线观看亚洲| 色婷婷综合成人av| 亚洲午夜未删减在线观看| 欧美视频免费在线| 亚洲国产成人在线播放| 亚州av一区二区| 国产欧美精品一区二区三区介绍| 精品五月天久久| 2019亚洲日韩新视频| 奇米一区二区三区四区久久| 国产伦精品免费视频| 社区色欧美激情 | 日韩视频一区在线| 日av在线播放中文不卡| 91精品国产99| 欧美日韩免费观看中文| 欧美精品在线免费观看| 国产美女久久精品| 欧美一区二粉嫩精品国产一线天| 国产精品男女猛烈高潮激情| 中文字幕在线看视频国产欧美在线看完整| 欧美一级淫片丝袜脚交| 久久精品成人欧美大片古装| 亚洲一区二区三区乱码aⅴ| 国产欧美va欧美va香蕉在线| 亚洲成**性毛茸茸| 欧美电影《睫毛膏》| 久久精品国产亚洲精品| 亚洲精品久久久一区二区三区| 亚洲精品自拍视频| 成人福利视频网| 国产成人一区三区| 日韩三级影视基地| 欧美在线视频在线播放完整版免费观看| 国产精品一区久久| 国产91成人在在线播放| 久久天堂av综合合色| 国产香蕉97碰碰久久人人| 91精品在线国产| 国产精品久久久久久超碰| 久久视频精品在线| 日韩久久免费视频| 丝袜亚洲欧美日韩综合| 亚洲国产精品悠悠久久琪琪| 久久亚洲成人精品| 久久精品最新地址| 少妇av一区二区三区| 日韩有码视频在线| 国产精品日韩久久久久| 欧美日本精品在线| 欧美激情亚洲精品| 538国产精品一区二区免费视频| 国产va免费精品高清在线| 亚洲自拍高清视频网站| 456国产精品| 精品无人区乱码1区2区3区在线| 亚洲变态欧美另类捆绑| 久久免费视频网站| 亚洲 日韩 国产第一| 在线成人免费网站| 91精品啪在线观看麻豆免费| 国产精品手机播放| 日韩大片免费观看视频播放| 在线精品视频视频中文字幕| 欧美日韩国产成人在线| 精品一区二区三区电影| 精品国产一区二区在线| 91成人性视频| 亚洲a中文字幕| 欧美亚洲激情视频| 日韩欧中文字幕| 中文国产成人精品久久一| 久久国产精品久久国产精品| 亚洲一区二区免费在线| 亚洲国产精品va在看黑人| 国产专区欧美专区| 亚洲国产成人av在线| 国产视频一区在线| 日本国产欧美一区二区三区| 久久99国产精品久久久久久久久| 亚洲第一黄色网| 欧美日韩国产在线播放| 777777777亚洲妇女| 羞羞色国产精品| 久久全球大尺度高清视频| 69**夜色精品国产69乱| 国产成人综合亚洲| 国产精品久久久久久亚洲影视| 亚洲国内高清视频| 一区二区中文字幕| 国产免费一区二区三区香蕉精| 亚洲网站视频福利| 最近2019免费中文字幕视频三| 中文字幕国产精品久久| 午夜精品久久久99热福利| 欧美性videos高清精品| 欧美俄罗斯乱妇| 欧美亚洲在线观看| 国产精品久久久av久久久| 亚洲国内高清视频| 欧美大成色www永久网站婷| 狠狠躁18三区二区一区| 国产一级揄自揄精品视频| 91av在线国产|