# 步入SOLID - 觀念與實作 --- # 今日主題 - Why "SOLID"? - SRP 單一職責 - OCP 開放封閉 - LSP, ISP, DIP??? - 推薦網站 --- ## SOLID 提出者 **Robert C. Martin** ![](https://i.imgur.com/YC1QGUB.png =200x) - 敏捷開發、軟體工程 - 開發幾種軟體設計原理而聞名(單一職責、介面隔離、依賴反轉) --- # Why "SOLID"? ---- 遠古註解一堆,結果都已經不精確? ---- ## 簡潔你的程式碼 ## 讓你再也不需要繁複的註解 ---- 專案太難維護嗎? 碰一下程式碼就會噴奇怪的bug嗎? ---- ## 減少維護成本 ---- 需求永遠都在變,但程式都寫死了? ---- ## 增加軟體擴充空間 ---- # 因此你可以 ---- ## 少掉一點頭髮 --- # What's "SOLID" --- ## 基本名詞補帖 (1) **高 內聚 & 封裝** 以小時候收玩具為例 --- ## 基本名詞補帖 (2) **低 耦合** 例如:A類別使用B類別的方法,即產生耦合。 --- # SRP 單一職責原則 ---- **A class should have only one reason to change.** 一個類別(or方法or元件)只能有一個原因而被改變。 ---- ## 舉例 ___ ### 今天我想要設計了一個長方形物件... - 大小 - 畫出來 - 匯出 ---- ### 假設我們將相關功能的程式碼寫在一起 ```java= public interface Rectangle { void setSize(double width, double height); void draw(); void export(); } ``` ---- ### 有多少種需求變動會使類別被更改? ```java= public interface Rectangle { void setSize(double width, double height); void draw(); void export(); } ``` ---- ### 3種 - 匯出的檔案格式有變? - 畫出的筆觸有變? - 老闆想要新增顏色屬性? ```java= public interface Rectangle { void setSize(double width, double height); void draw(); void export(); } ``` ---- ### 依照單一職責原則我們可以改成這樣 ![](https://i.imgur.com/GH4aj5k.png) ---- ## 建議 ___ - 檢查一個類別或方法的職責有哪些(盡量少)。 - 是否只能有一種需求變動能改變它? --- # OCP 開放-封閉原則 ---- - 對於擴展是 開放的 (open for extension) - 對於修改是 封閉的 (closed for modification) ---- ![](https://i.imgur.com/nWYW0mH.jpg =350x) --- ## 在準備好接受這些以前... - LSP 里氏替換原則: 子型態必須符合父型態的預期。 - ISP 介面隔離原則: 不要強迫物件實作or繼承用不到的方法。 - DIP 依賴反轉原則: 將元件的依賴方向反轉。 ---- Program to interface, not an implementation. 開始在你的程式中使用interface。 ---- 介面是類別與類別之間建立的條約 使用介面來隔開class之間的直接耦合 ---- ### Bad! ```java= String chat(String toSomeone, String msg){ CellPhone phone = new CellPhone(); phone.connect(toSomeone); phone.send(msg); return phone.recieve(); } ``` ---- ### Program to interface ```java= String chat(String toSomeone, String msg){ Communicate cm = new Computer(); cm.connect(toSomeone); cm.send(msg); return cm.recieve(); } ``` ---- ### Better(依賴注入) ```java= String chat(String toSomeone, String msg, Communicate cm){ cm.connect(toSomeone); cm.send(msg); return cm.recieve(); } ``` --- ### 推薦 網站: - [搞笑談軟工](http://teddy-chen-tw.blogspot.com/2010/06/program-to-interface.html)(軟體工程系列文章) - openhome.cc(設計模式) ---- ### 推薦 ![](https://i.imgur.com/sZGaqVF.jpg =200x) ---- ### 推薦 ![](https://i.imgur.com/ASP8Y3O.jpg =200x) ---- ## 謝謝大家 <!-- - S -> 單一職責原則 Single responsibility principle - O -> 開放-封閉原則 Open-Closed Principle - L -> 里氏替換原則 Liskov Substitution principle - I -> 介面隔離原則 Interface-segregation principles - D -> 依賴反轉原則 Dependency inversion principle -->
{"metaMigratedAt":"2023-06-15T01:41:04.198Z","metaMigratedFrom":"Content","title":"步入SOLID - 觀念與實作","breaks":true,"contributors":"[{\"id\":\"6b0a7d24-7415-4c47-ab47-05e04b441880\",\"add\":4692,\"del\":1496}]"}
    257 views