---
# System prepended metadata

title: SOLID原則

---

基本上是個閱讀筆記:https://medium.com/%E7%A8%8B%E5%BC%8F%E6%84%9B%E5%A5%BD%E8%80%85/%E4%BD%BF%E4%BA%BA%E7%98%8B%E7%8B%82%E7%9A%84-solid-%E5%8E%9F%E5%89%87-%E7%9B%AE%E9%8C%84-b33fdfc983ca

SOLID原則指的是對於Object Oriented Design(物件導向程式設計)的原則，為了讓軟體容易進行維護及擴充還有阿哩阿雜的好處。SOLID的內容包含
*  SRP(Single Responsibility Principle)
*  OCP(Open-Closed Principle)
*  LSP(Liskov Substitution Principle)
*  ISP(Interface Segregation Principle)
*  DIP(Dependency Inversion Principle)

詳細介紹往下看
## SRP(Single Responsibility Principle) 單一職責原則
*A class should have only one reason to change.*
核心概念是:為了避免一個class(or function)因為一次輸出錯誤、使用不順之類的理由，進行改動導致其他地方使用同個class的地方出錯

一個class(or function)只對唯一的一類角色負責，角色的意思為 比如說感測器(輸入的型態、處理、誤差概念皆為不同)這類可能會使用到同一個概念的function的對象，簡單來說是function 或是 class的使用者們



## OCP(Open-Closed Principle)
*software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification*
核心概念是:所有已經完成的軟體製品，都應該同時具備可擴充性且不需修改的

這個是說起來很簡單做起來麻煩的東西，大概是指 多用inherit之類的技巧，比如說一個已經完成的class，要做他的延伸分類了話 就用inherit去建一個新的class


## LSP(Liskov Substitution Principle)
*Subtype Requirement: Let $\phi (x)$ be a property provable about objects $x$ of type $T$. Then $\phi (y)$ should be true for objects $y$ of type $S$ where $S$ is a subtype of $T$.*
核心概念是:子類別應當遵從父類別的行為

比如說父類別可能有XXX的定義(或function)，那麼子類別一定要遵從XXX的定義(或function)

這之上就有個問題，override怎麼算? 盡量不能使用override了嗎?
答案是依然可以，但有些條件須要遵守
文章列出了三個
#### 1.先決條件須相等或是縮小
ex:父類別條件說 0~60，子類別條件最多就只能 0~60 或是 0~59 ，不可以 0~61
#### 2.後置條件須相等或更大
ex:父類別輸出int，子類別就不能用short，得用int 或 long 或 float
#### 3.不變條件須不變
這個我沒有很理解，猜測是構成父類別的前提，子類別必須嚴格遵守
ex:父類別做一個矩陣，且限制各行列不能有不同的大小(行1 3格 行2 4格這種)了話，子類別就得依據這個前提下去改造或增加特性(比如輸入輸出順序 儲存的型態限定)。可以在不違反前提的條件下找替代方法(比如說用不到的都補null之類的?)



## ISP(Interface Segregation Principle)
*No client should be forced to depend on methods it does not use.*
核心概念是:子類不應碰到他用不到或不能用到的東西

所以請記得interface隔離好他們


## DIP(Dependency Inversion Principle)
*High-level modules should not import anything from low-level modules. Both should depend on abstractions.*
*Abstractions should not depend on details. Details (concrete implementations) should depend on abstractions.*

核心概念是:高層模組不應依賴低層模組，抽象不應依賴具體

高低層的概念可以用inherit代換，或是其他有上下關係的東西
抽象就是......abstract那類的，不過這個好像不用擔心，大部分程式碼都不允許抽象的東西繼承具體的東西


## 總結
反正就是多用抽象層去處理分類啦，講有夠多