# [學習筆記] 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 今天想要找人來打掃房間,找了王阿姨來幫忙,這時候就是耦合了王阿姨,一旦王阿姨請假,房間髒亂就沒辦法打掃,如果此時我做了依賴反轉,耦合的對象換成清潔公司,無論王阿姨請假與否,只要聯絡清潔公司,他就會自動派一個阿姨來清理家庭。 :::