# 步入SOLID - 觀念與實作
---
# 今日主題
- Why "SOLID"?
- SRP 單一職責
- OCP 開放封閉
- LSP, ISP, DIP???
- 推薦網站
---
## SOLID 提出者
**Robert C. Martin**

- 敏捷開發、軟體工程
- 開發幾種軟體設計原理而聞名(單一職責、介面隔離、依賴反轉)
---
# 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();
}
```
----
### 依照單一職責原則我們可以改成這樣

----
## 建議
___
- 檢查一個類別或方法的職責有哪些(盡量少)。
- 是否只能有一種需求變動能改變它?
---
# OCP 開放-封閉原則
----
- 對於擴展是 開放的 (open for extension)
- 對於修改是 封閉的 (closed for modification)
----

---
## 在準備好接受這些以前...
- 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(設計模式)
----
### 推薦

----
### 推薦

----
## 謝謝大家
<!--
- 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}]"}