1) 單一職責原則 (The Single Responsiblity Principle,簡稱SRP)
2) 開放-封閉原則 (The Open-Close Principle,簡稱OCP)
3) Liskov 替換原則(The Liskov Substitution Principle,簡稱LSP)
4) 依賴倒置原則(The Dependency Inversion Pricinple,簡稱DIP)
5) 介面隔離原則 (The Interface Segregation Principle,簡稱ISP)
一、單一職責原則(SRP)
就一個類而言,應該僅有一個引起它變化的原因。軟體設計真正要做的許多內容,就是發現職責並把那些職責相互分離。測試驅動的開發實踐常常會在設計出現臭味之前就迫使我們分離職責。
二、開閉原則(OCP)
軟體實體(類、模組、函數)應該是可擴充的,但是不可修改的。也就是說:對於擴充是開放的,對於更改是封閉的。怎樣可能在不改動模組原始碼的情況下去更改它的行為呢?怎樣才能在無需對模組進行改動的情況下就改變它的功能呢?關鍵是抽象!因此在進行物件導向設計時要盡量考慮介面封裝機制、抽象機制和多態技術。該原則同樣適合於非物件導向設計的方法,是軟體工程設計方法的重要原則之一。
三、替換原則(LSP)
子類應當可以替換父類並出現在父類能夠出現的任何地方。這個原則是Liskov於1987年提出的設計原則。它同樣可以從Bertrand Meyer 的DBC (Design by Contract〔基於契約設計〕) 的概念推出。
四、依賴倒置原則(DIP)
1、高層模組不應該依賴於低層模組。二者都應該依賴於抽象。2、抽象不應該依賴於細節。細節應該依賴於抽象。在進行業務設計時,與特定業務有關的依賴關係應該盡量依賴介面和抽象類別,而不是依賴於具體類。具體類只負責相關業務的實現,修改具體類不影響與特定業務有關的依賴關係。在結構化設計中,我們可以看到底層的模組是對高層抽象模組的實現(高層抽象模組通過調用底層模組),這說明,抽象的模組要依賴具體實現相關的模組,底層模組的具體實現發生變動時將會嚴重影響高層抽象的模組,顯然這是結構化方法的一個"硬傷"。物件導向方法的依賴關係剛好相反,具體實作類別依賴於抽象類別和介面。
五、介面分離原則(ISP)
採用多個與特定客戶類有關的介面比採用一個通用的涵蓋多個業務方法的介面要好。 ISP原則是另外一個支援諸如COM等組件化的使能技術。缺少ISP,組件、類的可用性和移植性將大打折扣。這個原則的本質相當簡單。如果你擁有一個針對多個客戶的類,為每一個客戶建立特定業務介面,然後使該客戶類繼承多個特定業務介面將比直接載入客戶所需所有方法有效。
以上五個原則是物件導向中常常用到的原則。此外,除上述五原則外,還有一些常用的經驗諸如類結構層次以三到四層為宜、類的職責明確化(一個類對應一個具體職責)等可供我們在進行物件導向設計參考。但就上面的幾個原則看來,我們看到這些類在幾何分布上呈現樹型拓撲的關係,這是一種良好、開放式的線性關係、具有較低的設計複雜度。一般說來,在軟體設計中我們應當盡量避免出現帶有閉包、迴圈的設計關係,它們反映的是較大的耦合度和設計複雜化。