面向對象程序設計5大原則
- 單一職責原則(Single Responsibility Principle)
- 開放封閉原則(Open Close Principle)
- 里氏替換原則(Liskov Substitution Principle)
- 接口分離原則(Interface Segregation Principle)
- 依賴倒置原則(Dependency Inversion Principle)
各原則首字母組成單詞SOLID
單一職責原則S
一個類應該只有一個引起其變化的原因
人類進入工業化時代,每個人有各自的分工,不再像農民,不僅需要耕種還需要澆水收割等一系列工作。在工作中,每個人都有各自的分工,程序員、產品、售前、售后等等,這樣當一個環節需要修改時,其他環節不需要改變。代碼需要修改、產品設計發生變化、售前售后過程改變等等,只需要一類人或者說一個類進行改變,其他人并不關注這種變化。
開放封閉原則O
對于擴展是開放的,對于修改是封閉的。修改需求不可避免,而對代碼的修改又是容易出錯的。
永遠不變的就是變化。無論是客戶還是產品,都有極大的可能需要修改需求,為了減少工作量,或者說為了保證質量,不應該對源代碼就行修改,而是要在其上進行擴展。
里氏替換原則L
子類可以替換父類并且出現在父類出現的任何地方,子類 is a 父類。
父類應該盡量以接口或抽象類的形式出現
父類的實現應該交給對應的子類來處理,調用者調用的是父類的接口,而實際上是子類的對象在做處理。因此,要求子類能夠替換父類出現的所有地方。按照這個要求,擴展父類得到新的子類時,可以不影響調用者的使用。
接口分離原則I
使用多個專門的接口,而不要使用單一的總接口
可能本來一類事物都可以繼承自一個單一的總接口,但是當需求改變的時候,可能此類中的新事物不能繼承其中某些功能,則需要將接口分為幾個專門的接口。比如,汽車都有加油和行駛的功能,而新出現的特斯拉則不再需要加油,因此應該將加油與行駛兩個接口進行分離,再為特斯拉增加充電接口。
依賴倒置原則D
高層模塊不應該依賴底層模塊,兩者都應該依賴于抽象。具體應該依賴于抽象,而不應使抽象依賴于具體。
要求對抽象進行編程,而不是對實現進行編程。
司機要開車,司機屬于高層模塊,而汽車屬于底層模塊。如果,汽車型號確定了,那么司機的操作需要依賴于汽車型號,而當型號改變時,則需要對高層的司機類進行修改,簡直令老司機無法忍受。可以由司機類依賴ICar汽車類的接口,這樣就可以變換汽車型號而不影響司機的駕駛;或者司機類依賴IDriver接口,汽車類依賴ICar接口,而由IDriver調用ICar中的操作。
避免了實現類之間的相互依賴,當有新的子類出現時,可以通過添加少量代碼來實現。
PS.迪米特法則
有時候有人會說面向對象程序設計有6大法則,迪米特法則說的是類直接應該保持低耦合。盡量減少類直接的通信,從而減少相互之間的耦合度。