# SOLID 原則 ###### tags: `筆記` `物件導向` `軟體工程` 某天上了kuma 老師的單元測試分享 提到了對於 SOLID 的解釋 這邊筆記一下.. --- ## SOLID 原則,甚麼是好設計? ![image](https://hackmd.io/_uploads/rJ7Ja8BRT.png) #### 單一責任原則 SRP ( Single Responsibility Principle ) 為了 A 而做的修改不會破壞服務B的元件 > 1. 了解領域、減少不必要的依賴 > 2. 高階層模組越偏向業務面思考,對於低階模組偏向技術面思考 > 3. 判斷時機點。寫完能通過驗收單元測試的程式碼後或 Code Reviewer 後,再開始 SRP 重構 >![image](https://hackmd.io/_uploads/Hk2KJwHC6.png) #### 開放封閉原則 OCP (Open Closed Principle) 已經存在好好的東西不用一直改 > 1. OCP 只能是一個理想狀態,很難不修改。如: Bug > 2. 如何設計穩定的 Interface 是一個很大的挑戰。如: 三方支付 > ![image](https://hackmd.io/_uploads/BkZfQPHCp.png) #### 里氏替換原則 LSP ( Liskov Substitution Principle ) 細節有變時,使用者就算不知道,也不會壞 > 1. 減少 Client Code 不必要的依賴 >![image](https://hackmd.io/_uploads/Syh9HPS0p.png) #### 介面隔離原則 ISP ( Interface Segregation Principle ) 使用者只使用**量身打造的**的介面 > 1. Focus 在依賴與 Interface 穩定度,減少意外的發生 > 2. 核心就是契約精神 > ![image](https://hackmd.io/_uploads/HJsHNDHAT.png) #### 相依反轉原則 DIP( Dependency Inversion Principle ) 使用者專注在自身的抽象邏輯,不用太在意依賴的細節 > 1. 減少依賴程度以保護核心業務流程 > 2. 抽出去的 Interface 要跟高階模組放在同一包 Module 裡面 > 3. 可以延遲決策,如: Mock 測試或 In-memory >![image](https://hackmd.io/_uploads/SJZEZwBAT.png) > >![image](https://hackmd.io/_uploads/ry-yGwSRa.png) ### 結論 #### 與 DDD 的整合思考 ![image](https://hackmd.io/_uploads/ry6XLDSA6.png) #### 使用或不使用 SOLID ![image](https://hackmd.io/_uploads/Sy9uLDr0p.png) #### 建立自己的設計守則,有意識地設計自己的程式碼 #### 最適合進行 SOLID 的時機點: 重構 ### 參考 * [測試有時間再寫?你就是不寫才會沒時間!](https://www.youtube.com/watch?v=wTpsxjP0t7M) * [Fong - 你真的懂 SOLID 原則嗎?](https://www.youtube.com/watch?v=Dmv6tMnaCQA)