# OO 之後的下一步 OO Design(OOD) ###### tags: `學習筆記` `物件導向` `設計模式` > OOD 就是指 OO 的設計原則。 > S.O.L.I.D,代表 5 個重要的 OO design principles > [菜雞與物件導向 (Ex1): 小結](https://igouist.github.io/post/2021/01/oo-ex1-end2020/) > [skyyen999.gitbooks.io](https://skyyen999.gitbooks.io/-study-design-pattern-in-java/content/) # SOLID 原則 讓我們在已 OO 為開發時,能更明確及有效的設計程式架構。 將這些一個個軟體模組建立出一個良好的「軟體大樓」,**所以良好的程式碼不等於良好的架構**。 藉由這些原則,我們可以讓程式碼「**能容忍變化、容易理解、能讓模組和元件使用**」。 ## 1. S 單一職責原則 (Single Responsibility Principle, SRP) > [菜雞與物件導向 (10): 單一職責原則](https://igouist.github.io/post/2020/10/oo-10-single-responsibility-principle/) > [再談物件導向設計原則: 單一職責原則,定義、解析與實踐](https://wadehuanglearning.blogspot.com/2019/12/blog-post.html) A class should have only one reason to change. **「一個模組應只對唯一的一個角色負責。」** **核心邏輯與附加邏輯的區分** ## 2. O 開放封閉原則 (Open-Close Principle, OCP) [物件導向設計原則:開放封閉原則,定義、解析與實踐](https://wadehuanglearning.blogspot.com/2019/12/blog-post_11.html) **重點在這!!** ==認為「軟體應該是對於擴充開放的,但是對於修改封閉的」的概念。== 開放指的是對繼承開放,封閉指的是子類不可往上更改父類的內容。 可以這麼說,一個軟體製品在面對擴展時是開放的,且擴充時不應修改到原有的程式。 如果想擴充系統的功能要用子類的繼承與相依性注入 (依賴注入) 等方式擴充。 ## 3. L 里氏替換原則 (Liskov substitution principle, LSP) ==認為「程式中的物件應該是可以在不改變程式正確性的前提下被它的子類所替換的」的概念。== 子類能在不影響程式運作的方式代替父類所做的事,也就是子類在同一件事情就算多了很多新功能或限制,一樣能代替父類的位置讓程式繼續 run 下去。 - 子型態的先決條件 (Preconditions) 不應被加強。 - 子型態的後置條件 (Postconditions) 不應被削弱。 - 父型態的不變條件 (Invariants) 必須被子型態所保留。 > 先決條件是指執行一段程式前必須成立的條件。 > 後置條件是指執行一段程式後必須成立的條件。 ## 4. I 介面隔離原則 (Interface segregation principle, ISP) ==認為「多個特定客戶端介面要好於一個寬泛用途的介面」的概念。== 針對不同用戶只開放該用戶需要的介面,不需要的東西不給用戶,避免意外被更動到。 ## 5. D 依賴反轉原則 (Dependency inversion principle, DIP) [菜雞與物件導向 (14): 依賴反轉原則](https://igouist.github.io/post/2020/12/oo-14-dependency-inversion-principle/) ==認為一個方法應該遵從「依賴於抽象而不是一個實例」的概念。== 高階模組不應該依賴低階模組,兩者都該依賴抽象。 抽象不應該依賴於具體實作方式,具體實作方式則應該依賴抽象。 # 結論 懂得物件導向的設計原則,以此為架構去撰寫程式碼,在適當遵守設計原則的取捨而非過度地為了設計原則而過度設計。 --- 參考資料來源 : - 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 - [菜雞與物件導向 (Ex1): 小結](https://igouist.github.io/post/2021/01/oo-ex1-end2020/)