---
# System prepended metadata

title: '[學習筆記] SOLID (物件導向設計)'

---

# [學習筆記] SOLID (物件導向設計)

![](https://hackmd.io/_uploads/SJpvKZrMT.png)

## SRP（單一功能原則）
Single Responsibility Principle(單一職責原則)，又稱 [SRP](https://www.instagram.com/p/Ct6gvOgokS1/?img_index=1)。
1. 一個類別應該只有一個改變的原因
1. 一個類別只有一個職責

:::info
很多人寫一個 function 會讓他做很多事，隨著 function 不停的成長，他從一個參數變成五個參數傳進來，通常也意味著這個 function 負責的職責過於龐大。
而每一個 class 或每一個 function ，都應該遵守著一個原則，就是單一職責的任務。

譬如今天有一輛汽車他的煞車踏板，就是讓汽車在行進間停止使用的，所以不會有讓踩煞車踏板會開冷氣或調整座椅，甚至開大燈和播放音樂，這就表示煞車踏板負責的功能太多了。
:::

## OCP（開閉原則）
Open-Closed Principle(開放封閉原則)，又稱 [OCP](https://www.instagram.com/p/CurQv-uyTe5/?img_index=1)。
1. 軟體的可擴展性
1. 軟體的可維護性

:::success
一般來說，「開放新增」、「封閉修改」主要是為了要降低程式碼的耦合變動，會希望開放擴充功能，但是封閉修改原有的功能。

譬如希望一輛汽車可以在雪地上行走，那我只要對輪胎加裝雪鍊即可，這就是屬於對輪胎的開放擴充，在輪胎上面新增了雪鍊，沒有改動到輪胎所有的功能，也不是把整個輪胎換掉。
:::

## LSP（里氏替換原則）
Liskov Substitution Priciple(單一職責原則)，又稱 [LSP](https://www.instagram.com/p/Cv4XE2GsmcB/?img_index=1)。
子型態必須遵從父型態的行為進行設計

:::danger
如果你有一個基類（例如父類別）和一個派生類別（例如子類別），你應該能夠將子類別的物件替換掉並正常工作，而不需要修改程式碼。
:::

## ISP（介面隔離原則）
Interface Segregation Principle(介面隔離原則)，又稱 [ISP](https://www.instagram.com/p/CwuiFPyyxaL/?img_index=1)。
子型態必須遵從父型態的行為進行設計

:::warning
如果你有一個基類（例如父類別）和一個派生類別（例如子類別），你應該能夠將子類別的物件替換掉並正常工作，而不需要修改程式碼。
:::

## DIP（依賴反轉）
Dependency-Inversion Principle(依賴反轉)，又稱 [DIP](https://www.instagram.com/p/Cxk1ESsru9_/?img_index=10) 。
:::info
今天想要找人來打掃房間，找了王阿姨來幫忙，這時候就是耦合了王阿姨，一旦王阿姨請假，房間髒亂就沒辦法打掃，如果此時我做了依賴反轉，耦合的對象換成清潔公司，無論王阿姨請假與否，只要聯絡清潔公司，他就會自動派一個阿姨來清理家庭。
:::