C#設計模式學習筆記:設計原則
本筆記摘抄自:https://www.cnblogs.com/PatrickLiu/p/8287784.html,記錄一下學習過程以備後續查用。
寫程式碼也是有原則的,我們之所以使用設計模式,主要是為了適應變化,提高程式碼複用率,使軟體更具有可維護性和可擴充套件性。如果我們能更好的理
解這些設計原則,對我們理解物件導向的設計模式也是有幫助的,因為這些模式的產生是基於這些原則的。
設計原則包括:單一職責原則(SRP)、開閉原則(OCP)、里氏替換原則(LSP)、依賴倒置原則(DIP)、介面隔離原則(ISP)、合成複用原
則(CRP)、迪米特法則(LoD)。
下面我們就分別介紹這七種設計原則:
一、單一職責原則(SRP)
1)SRP(Single Responsibilities Principle)的定義:就一個類而言,應該僅有一個引起它變化的原因。簡而言之,就是功能要單一。
2)如果一個類承擔的職責過多,就等於把這些職責耦合在一起,一個職責的變化可能會削弱或者抑制這個類完成其它職責的能力。這種耦合會導致
脆弱的設計,當變化發生時,設計會遭受到意想不到的破壞。(敏捷軟體開發)
3)軟體設計真正要做的許多內容,就是發現職責並把那些職責相互分離。
小結:單一職責原則(SRP)可以看做是低耦合、高內聚在物件導向原則上的引申,將職責定義為引起變化的原因,以提高內聚性來減少引起變化的
原因。責任過多,引起它變化的原因就越多,這樣就會導致職責依賴,大大損傷其內聚性和耦合度。
二、開閉原則(OCP)
1)OCP(Open-Close Principle)的定義:就是說軟體實體(類、方法等等)應該可以擴充套件(擴充套件可以理解為增加),但是不能在原來的方法或者類上修
改,也可以這樣說,對增加程式碼開放,對修改程式碼關閉。
2)OCP的兩個特徵: 對於擴充套件(增加)是開放的,因為它不影響原來的,這是新增加的。對於修改是封閉的,如果總是修改,邏輯會越來越複雜。
小結:開閉原則(OCP)是物件導向設計的核心思想。遵循這個原則可以為我們物件導向的設計帶來巨大的好處:可維護(維護成本小、做管理簡
單、影響最小)、可擴充套件(有新需求,增加就好)、可複用(不耦合,可以使用以前程式碼)、靈活性好(維護方便、簡單)。開發人員應該僅對程式中
出現頻繁變化的那些部分做出抽象(但是不能過激,對應用程式中的每個部分都刻意地進行抽象同樣也不是一個好主意,拒絕不成熟的抽象和抽象本身
一樣重要)。
三、里氏替換原則(LSP)
1)LSP(Liskov Substitution Principle)的定義:子型別必須能夠替換掉它們的父型別。更直白的說,LSP是實現面向介面程式設計的基礎。
小結:任何基類可以出現的地方,子類一定可以出現,所以我們可以實現面向介面程式設計。 LSP是繼承複用的基石,只有當子類可以替換掉基類,軟體
的功能不受到影響時,基類才能真正被複用,而子類也能夠在基類的基礎上增加新的行為。里氏代換原則是對開閉原則的補充,實現開閉原則的關鍵步
驟就是抽象化,而基類與子類的繼承關係就是抽象化的具體實現,所以里氏代換原則是對實現抽象化的具體步驟的規範。
里氏替換原則的經典反例:正方形不是長方形、玩具槍不能殺人、鴕鳥不會飛。
四、依賴倒置原則(DIP)
1)DIP(Dependence Inversion Principle)的定義:抽象不應該依賴細節,細節應該依賴於抽象。簡單說就是,我們要針對介面程式設計,而不要針對實現
程式設計。
2)高層模組不應該依賴低層模組,兩個都應該依賴抽象,因為抽象是穩定的。抽象不應該依賴具體(細節),具體(細節)應該依賴抽象。
小結:依賴倒置原則其實可以說是物件導向設計的標誌,如果在我們編碼的時候考慮的是面向介面程式設計,而不是簡單的功能實現,體現了抽象的穩定
性,只有這樣才符合物件導向的設計。
五、介面隔離原則(ISP)
1)介面隔離原則(Interface Segregation Principle, ISP)指的是使用多個專門的介面比使用單一的總介面要好。也就是說不要讓一個單一的介面承擔
過多的職責,而應把每個職責分離到多個專門的介面中,進行介面分離,過於臃腫的介面是對介面的一種汙染。
2)使用多個專門的介面比使用單一的總介面要好。
3)一個類對另外一個類的依賴性應當是建立在最小的介面上的。
4)一個介面代表一個角色,不應當將不同的角色都交給一個介面。沒有關係的介面合併在一起,形成一個臃腫的大介面,這是對角色和介面的汙染。
5)“不應該強迫客戶依賴於它們不用的方法。介面屬於客戶,不屬於它所在的類層次結構。”這個說得很明白了,再通俗點說,不要強迫客戶使用它們
不用的方法,如果強迫使用者使用它們不使用的方法,那麼這些客戶就會面臨由於這些不使用的方法的改變所帶來的改變。
小結:介面隔離原則(ISP)告訴我們,在做介面設計的時候,要儘量設計的介面功能單一,功能單一,使它變化的因素就少,這樣就更穩定。其實這
體現了高內聚、低耦合的原則,這樣做也避免介面的汙染。
六、合成複用原則(CRP)
1)組合複用原則(Composite Reuse Principle, CRP)就是在一個新的物件裡面使用一些已有的物件,使之成為新物件的一部分,新物件通過向這些
物件的委派達到複用已用功能的目的。簡單地說,就是要儘量使用合成/聚合,儘量不要使用繼承。
2)要使用好組合複用原則,首先需要區分”Has–A”和“Is–A”的關係。“Is–A”是指一個類是另一個類的“一種”,是屬於的關係,而“Has–A”則不同,它表
示某一個角色具有某一項責任。導致錯誤的使用繼承而不是聚合的常見的原因是錯誤地把“Has–A”當成“Is–A”。例如:雞是動物,這就是“Is-A”的表現,
某人有一支手槍,People型別裡面包含一個Gun型別,這就是“Has-A”的表現。
小結:合成複用原則可以使系統更加靈活,類與類之間的耦合度降低,一個類的變化對其他類造成的影響相對較少,因此一般首選使用合成來實現復
用;其次才考慮繼承,在使用繼承時,需要嚴格遵循里氏替換原則,有效使用繼承會有助於對問題的理解,降低複雜度,而濫用繼承反而會增加系統構
建和維護的難度以及系統的複雜度,因此需要慎重使用繼承複用。
七、迪米特法則(Law of Demeter)
1)迪米特法則(Law of Demeter,LoD)又叫最少知識原則(Least Knowledge Principle,LKP),指的是一個物件應當對其他物件有儘可能少的了
解。也就是說,一個模組或物件應儘量少的與其他實體之間發生相互作用,使得系統功能模組相對獨立,這樣當一個模組修改時,影響的模組就會越少,
擴充套件起來更加容易。
2)關於迪米特法則其他的一些表述有:只與你直接的朋友們通訊,不要跟“陌生人”說話。
3)外觀模式(Facade Pattern)和中介者模式(Mediator Pattern)就使用了迪米特法則。
小結:迪米特法則的初衷是降低類之間的耦合,實現型別之間的高內聚、低耦合,這樣可以解耦。但是凡事都有度,過分的使用迪米特原則,會產生
大量這樣的中介和傳遞類,導致系統c#教程複雜度變大。所以在採用迪米特法則時要反覆權衡,既做到結構清晰,又要高內聚低耦合。
相關文章
- C# 設計模式(0)——設計原則C#設計模式
- Python學習筆記之 Python設計思想&設計原則Python筆記
- C#設計模式學習筆記:(9)組合模式C#設計模式筆記
- .NET 雲原生架構師訓練營(設計原則&&設計模式)--學習筆記架構設計模式筆記
- 設計模式學習筆記設計模式筆記
- 學習筆記-設計模式筆記設計模式
- 設計原則 設計模式設計模式
- 【設計模式】設計原則設計模式
- 設計模式 - 設計原則設計模式
- Java設計模式學習筆記(一) 設計模式概述Java設計模式筆記
- 學習筆記-設計模式:MVC模式筆記設計模式MVC
- php設計模式學習筆記PHP設計模式筆記
- JavaScript設計模式學習筆記JavaScript設計模式筆記
- 設計模式的設計原則設計模式
- C#實踐設計模式原則SOLIDC#設計模式Solid
- 設計模式學習筆記——單例模式設計模式筆記單例
- Event Bus 設計模式學習筆記設計模式筆記
- JavaScript設計模式(一)設計原則JavaScript設計模式
- Javascript 設計模式之設計原則JavaScript設計模式
- 設計模式(06)——設計原則(1)設計模式
- 設計模式(07)——設計原則(2)設計模式
- 設計模式學習筆記之工廠模式設計模式筆記
- 設計模式 #1(7大設計原則)設計模式
- 設計模式六大設計原則設計模式
- 設計模式-六大設計原則設計模式
- 重學Java設計模式-學習筆記(1)Java設計模式筆記
- Java設計模式(一):設計模式概述、UML圖、設計原則Java設計模式
- 設計模式 -- 設計模式七大原則設計模式
- Node.js 設計模式 學習筆記 之 流程式設計Node.js設計模式筆記程式設計
- 設計模式學習筆記之裝飾者模式設計模式筆記
- Java設計模式學習筆記(五) 單例模式Java設計模式筆記單例
- 設計模式學習筆記(3)裝飾器設計模式筆記
- Java設計模式學習筆記(四) 抽象工廠模式Java設計模式筆記抽象
- Java設計模式學習筆記(三) 工廠方法模式Java設計模式筆記
- 精通C#學習筆記---C#核心程式設計結構C#筆記程式設計
- 【設計模式】設計模式學習筆記之(一)——類圖、物件之間的關係及設計模式概要設計模式筆記物件
- 前端設計模式(0)物件導向&&設計原則前端設計模式物件
- 物件導向設計原則&設計模式分類物件設計模式