天天看點

軟體構造筆記(十四)---PPT第十講OO設計原則:SOLID

面向可維護性的構造技術

  • OO設計原則:SOLID
    • (SRP) The Single Responsibility Principle
    • (OCP) The Open-Closed Principle
    • (LSP) The Liskov Substitution Principle
    • (ISP) The Interface Segregation Principle
    • (DIP) The Dependency Inversion Principle

OO設計原則:SOLID

(SRP) The Single Responsibility Principle

SRP–單一責任原則

1.内容:不應有多于1個的原因使得一個類發生變化,即一個類,一個責任

2.舉例:

軟體構造筆記(十四)---PPT第十講OO設計原則:SOLID

(OCP) The Open-Closed Principle

OCP–開放-封閉原則

1.對擴充性的開放:

這意味着子產品的行為可以被擴充。當應用程式的需求發生變化時,或者滿足新應用程式的需求時,我們可以使子產品以新的不同的方式運作。

2.對修改的封閉:

但子產品自身的代碼是不應被修改的,擴充子產品行為的一般途徑是修改子產品的内部實作,如果一個子產品不能被修改,那麼它通常被認為是具有固定的行為。

3.實作方式:

軟體構造筆記(十四)---PPT第十講OO設計原則:SOLID

第一種:如果有多種類型的Server,那麼針對每一種新出現的Server,不得不修改Server類的内部具體實作。不推薦使用

第二種:通過構造一個抽象的Server類:AbstractServer,該抽象類中包含針對所有類型的Server都通用的代碼,進而實作了對修改的封閉;當出現新的Server類型時,隻需從該抽象類中派生出具體的子類ConcreteServer即可,進而支援了對擴充的開放。

4.舉例:

軟體構造筆記(十四)---PPT第十講OO設計原則:SOLID

左邊:如果要修改m_type的值,則要修改内部代碼實作,破壞對修改的封閉。

右邊:如果要修改m_type的值,隻需要增加額外的類進行實作就可以,其他無關的類都不做改動,滿足OCP原則

(LSP) The Liskov Substitution Principle

LSP–Liskov 替換原則

子類型必須能夠替換其基類型,派生類必須能夠通過其基類的接口使用,用戶端無需了解二者之間的差異

(ISP) The Interface Segregation Principle

ISP–接口隔離原則

1.“ 胖”接口具有很多缺點:不夠聚合

胖接口可分解為多個小的接口,不同的接口向不同的用戶端提供服務,用戶端隻通路自己所需要的端口。

軟體構造筆記(十四)---PPT第十講OO設計原則:SOLID

2.舉例:

這是一個不好的實作方式,RobotWorker不需要實作eat()方法,但由于接口中包含兩個方法,是以都要實作,不滿足ISP原則。

軟體構造筆記(十四)---PPT第十講OO設計原則:SOLID

修改方式如下:

将上述兩個接口分離,實作類時隻實作需要功能的接口即可。

軟體構造筆記(十四)---PPT第十講OO設計原則:SOLID

(DIP) The Dependency Inversion Principle

DIP–依賴轉置原則

1.抽象的子產品不應依賴于具體的子產品,具體應依賴于抽象

舉個例子:

下面的實作是通過接口而不是具體類實作的

軟體構造筆記(十四)---PPT第十講OO設計原則:SOLID

2.實作方法:

不推薦的方法:上層client的代碼中直接嵌入了對下層具體實作機制的調用

軟體構造筆記(十四)---PPT第十講OO設計原則:SOLID

滿足DIP的方法:上層client的代碼面向抽象接口程式設計,隔離對下層具體實作機制的直接接觸

軟體構造筆記(十四)---PPT第十講OO設計原則:SOLID

再舉個例子:

delegation要通過接口實作,而不是具體子類

軟體構造筆記(十四)---PPT第十講OO設計原則:SOLID