SOLID 是 Robert C. Martin 提出物件導向系統的五個設計原則,套用這些原則開發的系統,能夠更容易被維護與擴充功能。
S: Single Responsibility Principle 單一功能原則
O: Open-Close Principle 開放封閉原則
L: Liskov’s Substitution Principle 里氏替換原則
I: The Interface Segregation Principle 介面隔離原則
D: The Dependency Inversion Principle 依賴反轉原則
有些文件提供了六個設計原則,另外一個是
L: Law of Demeter 迪米特原则
單一功能原則
每個物件,不管是類別、函數,都只負責一項功能。
每個函數都只能有一種功能,這邊比較直覺,但類別的部分比較難判斷,什麼時候必須把有相近功能的函數放在同一個類別裡面。
可先利用使用/呼叫這個類別的其他類別的角色來判斷,例如網頁 rest Command,資料庫存取介面,然後在因應不同的 rest url 或是不同的 table 區分類別。
開放封閉原則
對功能擴充開放,對修改封閉。
要增加新的程式碼,擴充原有系統的新功能,而不是修改既有功能的程式碼。
已經正常運作的東西沒有壞掉,就不要任意修改的意思。這個方法最常用在維護舊系統程式碼的狀況,有時會遇到要修改其他人寫的程式,或雖然是自己寫的程式,但已經很久沒有看過,已經忘記當時的實作細節的時候,就要用擴充的方式去修改舊系統的程式。
開放封閉原則在大部分的情況下是正確的,但有時候一些舊系統的程式碼,已經很確定有明顯的錯誤或設計問題時,還是必須要狠心用力去修改,如果還是以擴充的方式去做,只會讓專案更亂。
里氏替換原則
程式中的物件可以在不改變程式正確性的前提下被它的子類別所替換的。
實作了 Interface 或是繼承了某個 class,在其他程式中,如果出現該 Interface 或是父類別時,都可以用 sub-class 取代。
如果類別繼承錯誤,父類別通過的測試,子類別未必可以通過。
介面隔離原則
針對不同的使用端,開放不同的使用介面。
類別之間,透過最小的介面互相溝通。
如果只使用一個介面,可能會造成 Fat Interface,產生很多多餘的程式碼,不容易維護。
依賴反轉原則
當 A 模組在內部使用 B 模組的情況下,我們稱 A 為高階模組,B 為低階模組。高階模組不應該依賴於低階模組,兩者都該依賴抽象介面。
透過介面,讓各類別的實作分開獨立,降低類別之間的耦合度。
迪米特原则
也被稱為最小知識原則
一個物件應該對其他物件保持最小的了解,也就是低耦合,高內聚
類別之間的耦合度越高,當一個類別改變時,對另一個類別的影響越多。
總結
S: 單一類別單一功能 O: 開放擴充,封閉修改 L: 父類別可用子類別替換 I: 類別之間以最小介面互相溝通 D: 利用介面抽象化
L(LoD): 類別之間低耦合
References
09. 物件導向設計原則—SOLID - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天
沒有留言:
張貼留言