單一功能原則
就一個類而言,應該僅有一個引起它變化的原因。
類被修改的機率很大,因此應該專注於單一的功能。如果你把多個功能放在同一個類中,功能之間就形成了關聯,改變其中一個功能,有可能中止另一個功能,這時就需要新一輪的測試來避免可能出現的問題。
開閉原則
軟件實體(類,模塊,函數)應該可以擴展,但是不可修改。
對於擴展是開放的,對於更改是封閉的。
怎樣的設計才能面對需求的改變卻可以保持相對穩定,從而使得系統可以在第一個版本以後不斷推出新的版本呢?
無論模塊是多麼的封閉,都會存在一些無法對之封閉的變化。既然無法完全封閉,設計人員必須對於他設計的模塊應該對哪種變化封閉作出選擇。他必須先猜測出最有可能發生的變化種類,然後構造抽象來隔離那些變化。我們希望儘快知道可能發生的變化,查明可能發生的變化所等待的時間越長,要創建正確的抽象就越困難。
開放封閉原則是面向對象設計的核心所在。遵循這個原則可以帶來面向對象設計所聲稱的巨大好處,也就是可維護、可擴展、可服用、靈活性好。開發人員應該僅對程序中呈現出頻繁變化的那部分作出抽象,要知道對於應用程序中的每個部分都刻意的進行抽象同樣不是一個好主意,謹記拒絕不成熟的抽象和抽象本身一樣重要。
迪米特法則(最少知道原則)
如果兩個類不必彼此直接通信,那麼兩個類就不應該發生直接的相互作用。如果其中一個類需要調用另一個類的某一個方法的話,可以通過第三者轉發這個調用。
迪米特法則首先強調的前提是在類的結構設計上,每一個類都應該儘量降低成員的訪問權限,強調類之間的松耦合。
里氏替換原則
子類型必須能夠替換掉它們的父類型。
只有當子類可以替換掉父類,軟件單位的功能不受影響時,父類才能真正被複用,而子類也能夠在父類的基礎上增加新的行爲。正是由於子類的可替換性才使得父類類型的模塊在無需修改的情況下就可以擴展。
依賴倒轉原則
高層模塊不應該依賴底層模塊。兩個都應該依賴抽象。抽象不應該依賴細節,細節應該依賴抽象。總之就是針對接口編程,不要對實現編程。
接口分離原則
一個接口不需要提供太多的行爲,一個接口應該只提供一種對外的功能,不應該把所有的操作都封裝到一個接口當中
合成複用原則
繼承關係是強耦合,組合關係是低耦合