基本上是個閱讀筆記: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那類的,不過這個好像不用擔心,大部分程式碼都不允許抽象的東西繼承具體的東西
## 總結
反正就是多用抽象層去處理分類啦,講有夠多