溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C#中面向?qū)ο笤O(shè)計七個原則是什么

發(fā)布時間:2020-07-14 16:57:16 來源:億速云 閱讀:280 作者:Leah 欄目:編程語言

今天就跟大家聊聊有關(guān)C#中面向?qū)ο笤O(shè)計七個原則是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

                                                           C#中面向?qū)ο笤O(shè)計七個原則是什么

一:單一職責(zé)原則(Single Responsibility Principle, SRP)

   1、定義:一個對象應(yīng)該只包含單一的職責(zé),并且該職責(zé)被完整地封裝在一個類中

     或者:就一個類而言,應(yīng)該僅有一個引起它變化的原因。

  2、分析:一個類(或者大到模塊,小到方法)承擔(dān)的職責(zé)越多,它被復(fù)用的可能性越小,而且如果一個類承擔(dān)的職責(zé)過多,就相當(dāng)于將這些職責(zé)耦合在一起,當(dāng)其中一個職責(zé)變化時,可能會影響其他職責(zé)的運作。 類的職責(zé)主要包括兩個方面:數(shù)據(jù)職責(zé)和行為職責(zé),數(shù)據(jù)職責(zé)通過其屬性來體現(xiàn),而行為職責(zé)通過其方法來體現(xiàn)。 單一職責(zé)原則是實現(xiàn)高內(nèi)聚、低耦合的指導(dǎo)方針,在很多代碼重構(gòu)手法中都能找到它的存在,它是最簡單但又最難運用的原則,需要設(shè)計人員發(fā)現(xiàn)類的不同職責(zé)并將其分離,而發(fā)現(xiàn)類的多重職責(zé)需要設(shè)計人員具有較強的分析設(shè)計能力和相關(guān)重構(gòu)經(jīng)驗。

  3、實例:

實例說明 某基于Java的C/S系統(tǒng)的“登錄功能”通過如下登錄類(Login)實現(xiàn):
現(xiàn)使用單一職責(zé)原則對其進行重構(gòu)。

二:開閉原則(Open-Closed Principle, OCP)

    1、定義:一個軟件實體應(yīng)當(dāng)對擴展開放,對修改關(guān)閉。也就是說在設(shè)計一個模塊的時候,應(yīng)當(dāng)使這個模塊可以在不被修改的前提下被擴展,即實現(xiàn)在不修改源代碼的情況下改變這個模塊的行為。  

  2、分析:開閉原則由Bertrand Meyer于1988年提出,它是面向?qū)ο笤O(shè)計中最重要的原則之一。在開閉原則的定義中,軟件實體可以指一個軟件模塊、一個由多個類組成的局部結(jié)構(gòu)或一個獨立的類。抽象化是開閉原則的關(guān)鍵。 開閉原則還可以通過一個更加具體的“對可變性封裝原則”來描述,對可變性封裝原則(Principle of Encapsulation of Variation, EVP)要求找到系統(tǒng)的可變因素并將其封裝起來。

三:里氏代換原則(Liskov Substitution Principle, LSP)      

1、定義:如果對每一個類型為S的對象o1,都有類型為T的對象o2,使得以T定義的所有程序P在所有的對象o1都代換成o2時,程序P的行為沒有變化,那么類型S是類型T的子類型

  或者:所有引用基類(父類)的地方必須能透明地使用其子類的對象。

2、分析:里氏代換原則由2008年圖靈獎得主、美國第一位計算機科學(xué)女博士、麻省理工學(xué)院教授Barbara Liskov和卡內(nèi)基.梅隆大學(xué)Jeannette Wing教授于1994年提出。

里氏代換原則可以通俗表述為:在軟件中如果能夠使用基類對象,那么一定能夠使用其子類對象。把基類都替換成它的子類,程序?qū)⒉粫a(chǎn)生任何錯誤和異常,反過來則不成立,如果一個軟件實體使用的是一個子類的話,那么它不一定能夠使用基類。里氏代換原則是實現(xiàn)開閉原則的重要方式之一,由于使用基類對象的地方都可以使用子類對象,因此在程序中盡量使用基類類型來對對象進行定義,而在運行時再確定其子類類型,用子類對象來替換父類對象。

四:依賴倒轉(zhuǎn)原則(Dependence Inversion Principle, DIP)    

1、定義:高層模塊不應(yīng)該依賴低層模塊,它們都應(yīng)該依賴抽象。抽象不應(yīng)該依賴于細節(jié),細節(jié)應(yīng)該依賴于抽象

  或者:要針對接口編程,不要針對實現(xiàn)編程。(Program to an interface, not an implementation.)  

2、分析:依賴倒轉(zhuǎn)原則是Robert C. Martin在1996年為《C++ Reporter》所寫的專欄Engineering Notebook的第三篇,后來加入到他在2002年出版的經(jīng)典著作《Agile Software Development, Principles, Patterns, and Practices》中。  

    簡單來說,依賴倒轉(zhuǎn)原則就是指:代碼要依賴于抽象的類,而不要依賴于具體的類;要針對接口或抽象類編程,而不是針對具體類編程。 實現(xiàn)開閉原則的關(guān)鍵是抽象化,并且從抽象化導(dǎo)出具體化實現(xiàn),如果說開閉原則是面向?qū)ο笤O(shè)計的目標的話,那么依賴倒轉(zhuǎn)原則就是面向?qū)ο笤O(shè)計的主要手段。

  依賴倒轉(zhuǎn)原則的常用實現(xiàn)方式之一是在代碼中使用抽象類,而將具體類放在配置文件中。

類之間的耦合

零耦合關(guān)系

具體耦合關(guān)系

抽象耦合關(guān)系

依賴倒轉(zhuǎn)原則要求客戶端依賴于抽象耦合,以抽象方式耦合是依賴倒轉(zhuǎn)原則的關(guān)鍵。

依賴注入

構(gòu)造注入(Constructor Injection):通過構(gòu)造函數(shù)注入實例變量。

設(shè)值注入(Setter Injection):通過Setter方法注入實例變量。

接口注入(Interface Injection):通過接口方法注入實例變量。

五:接口隔離原則(Interface Segregation Principle, ISP)

  1、定義:客戶端不應(yīng)該依賴那些它不需要的接口   注意,在該定義中的接口指的是所定義的方法。

   或者:一旦一個接口太大,則需要將它分割成一些更細小的接口,使用該接口的客戶端僅需知道與之相關(guān)的方法即可。

  2、分析:接口隔離原則是指使用多個專門的接口,而不使用單一的總接口。每一個接口應(yīng)該承擔(dān)一種相對獨立的角色,不多不少,不干不該干的事,該干的事都要干。

 (1) 一個接口就只代表一個角色,每個角色都有它特定的一個接口,此時這個原則可以叫做“角色隔離原則”。

  (2) 接口僅僅提供客戶端需要的行為,即所需的方法,客戶端不需要的行為則隱藏起來,應(yīng)當(dāng)為客戶端提供盡可能小的單獨的接口,而不要提供大的總接口。

       使用接口隔離原則拆分接口時,首先必須滿足單一職責(zé)原則,將一組相關(guān)的操作定義在一個接口中,且在滿足高內(nèi)聚的前提下,接口中的方法越少越好。 可以在進行系統(tǒng)設(shè)計時采用定制服務(wù)的方式,即為不同的客戶端提供寬窄不同的接口,只提供用戶需要的行為,而隱藏用戶不需要的行為。

六:合成復(fù)用原則(Composite Reuse Principle, CRP)又稱為組合/聚合復(fù)用原則(Composition/ Aggregate Reuse Principle, CARP)

    1、定義:盡量使用對象組合,而不是繼承來達到復(fù)用的目的。(Favor composition of objects over inheritance as a reuse mechanism.)

    2、分析:合成復(fù)用原則就是指在一個新的對象里通過關(guān)聯(lián)關(guān)系(包括組合關(guān)系和聚合關(guān)系)來使用一些已有的對象,使之成為新對象的一部分;新對象通過委派調(diào)用已有對象的方法達到復(fù)用其已有功能的目的。簡言之:要盡量使用組合/聚合關(guān)系,少用繼承。

在面向?qū)ο笤O(shè)計中,可以通過兩種基本方法在不同的環(huán)境中復(fù)用已有的設(shè)計和實現(xiàn),即通過組合/聚合關(guān)系或通過繼承。
繼承復(fù)用:實現(xiàn)簡單,易于擴展。破壞系統(tǒng)的封裝性;從基類繼承而來的實現(xiàn)是靜態(tài)的,不可能在運行時發(fā)生改變,沒有足夠的靈活性;只能在有限的環(huán)境中使用。(“白箱”復(fù)用 )

組合/聚合復(fù)用:耦合度相對較低,選擇性地調(diào)用成員對象的操作;可以在運行時動態(tài)進行。(“黑箱”復(fù)用 )
組合/聚合可以使系統(tǒng)更加靈活,類與類之間的耦合度降低,一個類的變化對其他類造成的影響相對較少,因此一般首選使用組合/聚合來實現(xiàn)復(fù)用;其次才考慮繼承,在使用繼承時,需要嚴格遵循里氏代換原則,有效使用繼承會有助于對問題的理解,降低復(fù)雜度,而濫用繼承反而會增加系統(tǒng)構(gòu)建和維護的難度以及系統(tǒng)的復(fù)雜度,因此需要慎重使用繼承復(fù)用。

七:迪米特法則(Law of Demeter, LoD)又稱為最少知識原則(Least Knowledge Principle, LKP)

1、定義:

(1) 不要和“陌生人”說話。英文定義為:Don't talk to strangers.

(2) 只與你的直接朋友通信。英文定義為:Talk only to your immediate friends.

(3) 每一個軟件單位對其他的單位都只有最少的知識,而且局限于那些與本單位密切相關(guān)的軟件單位。英文定義為:Each unit should have only limited knowledge about other units: only units "closely" related to the current unit.  

 2、分析:迪米特法則來自于1987年秋美國東北大學(xué)(Northeastern University)一個名為“Demeter”的研究項目。簡單地說,迪米特法則就是指一個軟件實體應(yīng)當(dāng)盡可能少的與其他實體發(fā)生相互作用。這樣,當(dāng)一個模塊修改時,就會盡量少的影響其他的模塊,擴展會相對容易,這是對軟件實體之間通信的限制,它要求限制軟件實體之間通信的寬度和深度。

看完上述內(nèi)容,你們對C#中面向?qū)ο笤O(shè)計七個原則是什么有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI