一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

面向?qū)ο笤O(shè)計的原則——單一職責原則

 醉三郎 2012-06-12

  學習設(shè)計模式,自然會涉及面向?qū)ο蟮脑O(shè)計原則,面向?qū)ο蟮脑O(shè)計原則一般包括五個原則,下面詳細介紹下五個原則:

1、單一職責原則(single responsibility principle )

      There should never be more than one reason for a class to change.

      所謂單一職責原則,就是對一個類而言,應(yīng)該僅有一個引起它變化的原因。換句話說,一個類的功能要單一,只做與它相關(guān)的事情。在類的設(shè)計過程中要按職責進行設(shè)計,彼此保持正交,互不干涉。

什么是職責?

      在SRP 中,職責定義為“變化的原因”。如果你能夠想到多于一個的動機去改變一個類,那么該類就具有多于一個的職責。

為什么要采用單一職責原則?

      因為每一個職責都是變化的一個軸線,當需求變化時,該變化會反映為類的職責的變化。如果一個類承擔了多于一個的職責,那么就意味著引起它的變化的原因會有多個。如果一個類承擔的職責過多,那么就等同于把這些職責耦合在了一起。一個職責的變化可能會抑制到該類完成其他職責的能力,這樣的耦合會導致脆弱的設(shè)計。當變化發(fā)生時,設(shè)計會受到意想不到的破壞。單一職責原則正是實現(xiàn)高內(nèi)聚低耦合需要遵守的一個原則。

       注意: 單一職責原則簡單而直觀,但在實際應(yīng)用中很難實現(xiàn)。只有變化的軸線僅當實際發(fā)生時才具有真正的意義。如果沒有預(yù)兆,那么去應(yīng)用SRP或者其他任何的原則都是不明智的。

下面就Modem接口為例,說明其原則。

Java代碼 復(fù)制代碼 收藏代碼
  1. interface Modem {   
  2.     public void dial(String pno);   //撥號   
  3.     public void hangup();    //掛斷   
  4.     public void send(char c);   //發(fā)送數(shù)據(jù)   
  5.     public char recv();   //接收數(shù)據(jù)   
  6. }  

      大多數(shù)會認為看起來非常合理,該接口聲明的4個函數(shù)確實是調(diào)制解調(diào)器的功能。 然而,該接口中卻顯示出兩個職責。第一個職責連接管理,第二個職責是數(shù)據(jù)通信。dial和hangup函數(shù)進行調(diào)制解調(diào)器的連接管理,而send和recv負責進行數(shù)據(jù)通信。這兩個職責應(yīng)該被分開嗎?這依賴于應(yīng)用程序變化的方式。如果應(yīng)用程序的變化會影響到連接函數(shù)的簽名,那么這個設(shè)計就是僵硬的設(shè)計,因為調(diào)用send和 recv的類必須重新編譯、部署的次數(shù)會超過我們預(yù)想的情況。在這種情況下,這兩個職責必須被分離,我們分別實現(xiàn)這兩個職責于:

Java代碼 復(fù)制代碼 收藏代碼
  1. interface DataChannel   
  2. {   
  3.     public void send(char c);   
  4.     public void recv();   
  5. }   
  6.   
  7. interface Connection   
  8. {   
  9.     public void dial(string pno);   
  10.     public void hangup();   
  11. }  
下面的類圖將它的2個不同職責分成2個不同的接口,這樣至少可以讓客戶端應(yīng)用程序使用具有單一職責的接口:

讓ModemImplementation 實現(xiàn)這兩個接口。我們注意到,ModemImplementation又組合了2個職責,這不是我們希望的,但有時這又是必須的。通常由于某些原因,迫使我們不得不綁定多個職責到一個類中,但我們至少可以通過接口的分割來分離應(yīng)用程序關(guān)心的概念。事實上,這個例子一個更好的設(shè)計應(yīng)該是這樣的,如圖:

小結(jié)
Single Responsibility Principle (SRP)從職責(改變理由)的側(cè)面上為我們對類(接口)的抽象的顆粒度建立了判斷基準,在為系統(tǒng)設(shè)計類(接口)的時候應(yīng)該保證它們的單一職責性。

高內(nèi)聚、低耦合解釋:

      這是軟件工程中的概念,是判斷設(shè)計好壞的標準,主要是面向OO的設(shè)計,主要是看類的內(nèi)聚性是否高,偶合度是否低
      首先要知道一個軟件是由多個子程序組裝而成, 而一個程序由多個模塊(方法)構(gòu)成!

“高內(nèi)聚,低耦合”主要是闡述的面向?qū)ο笙到y(tǒng)中,各個類需要職責分離的思想。
      每一個類完成特定的獨立的功能,這個就是高內(nèi)聚。耦合就是類之間的互相調(diào)用關(guān)系,如果耦合很強,互相牽扯調(diào)用很多,那么會牽一發(fā)而動全身,不利于維護和擴展。

       類之間的設(shè)置應(yīng)該要低耦合,但是每個類應(yīng)該要高內(nèi)聚.耦合是類之間相互依賴的尺度.如果每個對象都有引用其它所有的對象,那么就有高耦合,這是不合乎要求的,因為在兩個對象之間,潛在性地流動了太多信息.低耦合是合乎要求的:它意味著對象彼此之間更獨立的工作.低耦合最小化了修改一個類而導致也要修改其它類的"連鎖反應(yīng)". 內(nèi)聚是一個類中變量與方法連接強度的尺度.高內(nèi)聚是值得要的,因為它意味著類可以更好地執(zhí)行一項工作.低內(nèi)聚是不好的,因為它表明類中的元素之間很少相關(guān).成分之間相互有關(guān)聯(lián)的模塊是合乎要求的.每個方法也應(yīng)該高內(nèi)聚.大多數(shù)的方法只執(zhí)行一個功能.不要在方法中添加'額外'的指令,這樣會導致方法執(zhí)行更多的函數(shù)。
      推廣開來說,這個思想并不限于類與類之間的關(guān)系。模塊和模塊,子系統(tǒng)之間也都要遵守這個原則,才可以設(shè)計出延展性比較強的系統(tǒng)。

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    久久综合狠狠综合久久综合| 久久久精品日韩欧美丰满| 国产人妻熟女高跟丝袜| 中文字幕亚洲精品乱码加勒比| 久一视频这里只有精品| 婷婷色国产精品视频一区| 邻居人妻人公侵犯人妻视频| 日韩成人午夜福利免费视频| 午夜福利网午夜福利网| 国产亚洲系列91精品| 国产日韩综合一区在线观看| 国产精品丝袜一二三区| 中文字幕区自拍偷拍区| 日韩精品一区二区一牛| 国产成人精品在线一区二区三区| 国产在线一区二区三区不卡| 男人把女人操得嗷嗷叫| 亚洲高清亚洲欧美一区二区| 亚洲综合香蕉在线视频| 我的性感妹妹在线观看| 日本欧美一区二区三区在线播| 欧美成人欧美一级乱黄| 亚洲中文字幕在线视频频道| 亚洲国产欧美久久精品| 丰满人妻少妇精品一区二区三区 | 懂色一区二区三区四区| 五月婷婷亚洲综合一区| 日本加勒比在线观看不卡| 99少妇偷拍视频在线| 人妻偷人精品一区二区三区不卡| 91日韩欧美在线视频| 午夜亚洲少妇福利诱惑| 欧美性高清一区二区三区视频| 国产又大又黄又粗的黄色| 隔壁的日本人妻中文字幕版 | 国产丝袜极品黑色高跟鞋| 青草草在线视频免费视频| 国产精品熟女在线视频| 欧美日韩乱码一区二区三区| 国产精品伦一区二区三区四季 | 高潮日韩福利在线观看|