# SOLID **SOLID 是5大原則的簡稱,分別為:** S = Single-responsibility principle (SRP) = 單一職責原則 O = Open–closed principle (OCP) = 開放封閉原則 L = Liskov substitution principle (LSP) = 里氏替換原則 I = Interface segregation principle (ISP) = 介面隔離原則 D = Dependency inversion principle (DIP) = 依賴反向原則 ## S - 單一職責原則 (Single Responsibility Principle) > 一個類別應該只負責一個職責。 > 類別的大小應該先區分,例如一個輪胎為一個類別單位,還是一整台車為一個類別單位 舉例: 假設有訂單相關的功能(CRUD) 新增訂單功能(Class)只會有新增訂單所需的功能,不會有修改刪除的功能 修改訂單功能不會有新增訂單所需的功能 ## O - 開放封閉原則 (Open-Close Principle) > 對擴展開放,而對修改封閉。 > 白話文:**模組化** > 面對需求,對程式碼的改動是透過增加新程式碼進行的,而不是更改現有的程式碼 舉例: 一台電腦由很多零組件組合而成,CPU、記憶體、硬碟都是獨立的一個模組 任何一個零件都可以獨立更換和擴充,不影響其他零件(不需跟著變動) ## L - 里氏替換原則 (Liskov Substitution Principle) > 子類別必須能夠替換父類別 > 父類別能做到的事情,子類別也要能做到 先驗條件不可以強化: 父類別要求的是矩形,子類別就不能要求得更嚴,只准人家給正方形 後驗條件不可以弱化: 父類別產出的是正方形,子類別不能說沒關係啦,就給人家隨便一個矩形 不變條件必須保持不變: 父類別是一個產生矩形的方法,子類別不能背骨,跑去產生圓形 ## I - 介面隔離原則 (Interface segregation principle) > 不應被迫使用對其而言無用的方法或功能,應該最小化類別與類別之間的介面 利用組合的方式,將需要的功能組合起來,像樂高一樣 而不是設計一個萬用的介面,繼承者繼承時繼承了一堆無用的功能 ## D - 依賴反轉原則 (Dependency inversion principle) > 高階模組不應該依賴於低階模組。兩者都應該依賴抽象。 > **並不是高階模組去依賴低階模組。而是高階模組提出它需要的功能,低階模組去實作出這些功能、達成高階模組的目標。** 抽象不應該依賴細節。細節應該依賴抽象。介面應該是高階模組提出的要求,然後才去使用實作了這些要求的低階模組。這些實作應該圍繞著這些要求,而不是讓要求去配合實作,更不要讓要求中包含實作。 為了解決介面實例化仍然會產生依賴的問題,就有了控制反轉。把控制權交給第三方,藉此讓使用者能夠不用關心實例化的過程,而注重在使用並達成目標的職責上。 而控制反轉的具體實現方法是依賴注入,藉由從建構式傳遞、更改目標的屬性等方式,把低階模組交給高階模組使用者。當我們藉由依賴注入的方式實現控制反轉,就能夠讓物件的設計符合依賴反轉原則。 整理自:[伊果的沒人看筆記本](https://igouist.github.io/)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up