佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > 淺談c#設計模式之單一原則

淺談c#設計模式之單一原則

熱門標簽:網站排名優(yōu)化 客戶服務 國美全國運營中心 電銷業(yè)務 電商新玩法 人工智能 科大訊飛語音識別系統(tǒng) 百度AI接口

單一原則: 程序設計時功能模塊獨立,功能單一更有助于維護和復用。

例如:個人計算機功能很多,如果想從中只拿出一個功能來制造一個新的東西是困難的。同時如果你的計算機開不機,同時你的計算器功能也不能用了。

在編程中如果一個類封裝了太多功能和上面的結果是類似的。

單一職責原則

例1:


大家應該能看出來這個類圖中的接口設計是有問題的,用戶的屬性和用戶的行為沒有分開。我們根據(jù)用戶的屬性和行為拆開這個接口。



重新拆分成兩個接口,IUserBo 負責用戶的屬性,IUserBiz負責用戶的行為。當我們實例化除UserINfo這個對象后,我們可以把UserInfo當做IUserBo實現(xiàn)類使用也可以將它當做IUserBiz的實現(xiàn)類使用,這就要看我們用在什么地方了。如果是獲取用戶信息,就把UserInfo 當做IUserBOSS的實現(xiàn)類,如果是維護用戶信息,就當做是IUserBiz的實現(xiàn)類。在實際應用中我們更傾向于把一個接口拆分成兩個,一個是IUserBO一個是IUserBIz。類圖如下。


這樣做以后,我們就把一個接口拆成了兩個,這樣就符合了單一職責原則,那么什么是單一職責原則呢?

單一職責原則,核心思想是:一個類,最好只做一件事,只有一個引起它變化的原因。

單一職責原則可以看作是低耦合、高內聚在面向對象原則上的引申,將職責定義為引起變化的原因,以提高內聚性來減少引起變化的原因。職責過多,可能引起變化的原因就越多,這將是導致職責依賴,相互之間就產生影響,從而極大的損傷其內聚性和耦合度。單一職責通常意味著單一的功能,因此不要為類實現(xiàn)過多的功能點,以保證實體只有一個引起它變化的原因。例2:

Rectangle擁有兩個方法,一個方法是draw,用來畫圖形,另一個方法是area用來計算面積。Rectangle違背了單一職責原則,因為它具有兩個職責:計算面積與繪制矩形。繪制圖形會與用戶界面有關,但是計算圖形面積卻未必與界面有關,如果把這兩個職責寫到一個類中,那么如果只需要使用area()方法這一職責來計算面積,那就不得不把draw()方法一同編譯,但是卻可能也用不到它。如果其中一個職責需要修改,就不得不重新編譯和部署另外一個。如果類的職責超過一個,這些職責之間就會產生耦合。改變一個職責,可能會影響和妨礙類為其它類服務的功能。把兩個職責分開會好一些。


兩個職責分離,這樣耦合度就會降低。SRP原則的核心就是要求對類的改變只能是一個,對于違反這一原則的類應該進行重構,例如以Façade模式或Proxy模式分離職責,通過基本的方法Extract Interface、Extract Class和Extract Method進行梳理。

例3:看一下下面的接口

    public interface Phone
    {
        //撥通電話
        public void dial(string phoneNumber);
        //通話
        public void chat(object o);
        //回應
        public void answer(object o);
        //通話完畢
        public void huangup();
    }


這個接口有問題嗎?還真有問題。單一職責要求一個接口或者類只有一個原因引起變化,也就是一個接口或者類只有一個職責,它負責一件事情。Phone這個接口不是一個職責,它是有兩個職責:一個是協(xié)議管理,一個是數(shù)據(jù)傳輸。diag()和huangup()這兩個方法實現(xiàn)的是協(xié)議管理,撥號和掛斷。chat()和answer()是數(shù)據(jù)傳輸。協(xié)議改變和數(shù)據(jù)傳輸都會引起類的變化,那么我們就不能說它是符合單一職責原則。由于這兩個職責變化不互相影響,那么就考慮拆成兩個接口。

這個類圖已經符合單一職責原則,但是卻復雜多了,組合是一種強耦合關系,兩者都有共同的生命期,這種強耦合增加了類的復雜性,我們修改一下。



這樣設計才完美,一個手機實現(xiàn)兩個接口,把兩個職責融合一個類中,雖然你會覺得這個phone類有兩個原因引起變化,但是我們是面向接口編程,對外公布的是接口,而不是實現(xiàn)類。如果非要使得類符合單一職責原則,那么就要使用上一個類圖了,但是這樣的話類的耦合性就增加了.

單一職責原則的好處:類的復雜性降低可讀性提高可維護性提高變更引起的風險降低

您可能感興趣的文章:
  • C#面向對象設計的七大原則
  • 淺談C#設計模式之開放封閉原則
  • 高效C#編碼優(yōu)化原則
  • C# 自定義異??偨Y及嚴格遵循幾個原則
  • C# 面向對象的基本原則
  • 淺談C#六大設計原則

標簽:咸寧 棗莊 POS機 攀枝花 廈門 拉薩 南平 益陽

巨人網絡通訊聲明:本文標題《淺談c#設計模式之單一原則》,本文關鍵詞  ;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    临泉县| 亚东县| 万荣县| 曲靖市| 乐至县| 九寨沟县| 嘉禾县| 永德县| 武隆县| 攀枝花市| 土默特右旗| 沈阳市| 秀山| 广元市| 临海市| 甘孜| 阿荣旗| 星子县| 改则县| 湟源县| 青海省| 津南区| 白银市| 台南县| 大埔区| 扎兰屯市| 鄂尔多斯市| 洮南市| 鹿泉市| 恭城| 永寿县| 神农架林区| 双辽市| 汶川县| 肥城市| 宽甸| 连平县| 黎城县| 黄梅县| 海南省| 德江县|