????????根據大量程序員和編程大師的實踐,總結出了面向對象編程的六大設計原則。設計原則是面向對象編程過程中需要遵守的一些規則,遵守這些規則,能增強代碼的復用性、可維護性、可擴展性和靈活性,同時根據這些設計規則能衍生出好的設計模式。
一、單一職責原則
????????單一職責原則:就一個類而言,應該僅有一個引起它變化的原因。
? ? ? ? 軟件的編碼就是設計出各種各樣的類去完成特定的工作。但是,如果一個類承擔的職責過多,就等于把這些職責耦合在一起,一個職責的變化可能會削弱或抑制這個類完成其他職責的能力。這種耦合會導致脆弱的設計,當變化發生時,設計會遭受意想不到的破壞。所以,軟件設計真正要做的許多內容就是發現職責并把這些職責相互分離。
? ? ? ? 根據單一職責原則,如果你能想到多于一個動機去改變一個類,那么這個類就具有多于一個職責,就應該新建一個新的類去分離其他的職責。
二、開放--封閉原則
????????開放--封閉原則:是說軟件(類、模塊、函數等)應該可以擴展,但是不可修改。即對擴展時開放的,對修改是封閉的(open for extension? closed for modification)。
? ? ? ? 軟件的開發是一個長期的過程,需求會隨著時間不斷地出現,無論你的前期設計是多么完美都無法逃脫需要進行修改的命運。也就是說,無論模塊是多么封閉,都會存在一些無法對之封閉的變化。既然不可能完全封閉,設計人員必須對于他設計的模塊應該對于哪種變化封閉做出選擇。他必須先猜測出最有可能發生的變化種類,然后構造抽象來隔離那些變化。
? ??????在我們最初編寫代碼時,假設變化不會發生。當變化發生時,我們就創建抽象類來隔離以后發生的同類變化。使軟件的擴展性更好。
三、依賴倒轉原則(依賴倒置原則)
? ?????依賴倒轉原則:抽象不應該依賴細節,細節應該依賴抽象。高層模塊不應該依賴底層模塊,兩個都應該依賴抽象。要針對接口編程,不要對實現編程。
????????依賴倒轉其實可以說是面向對象設計的標志,用哪種語言來編寫程序不重要,如果編寫時考慮的都是如何針對抽象編程而不是針對細節編程,即程序中所有的依賴關系都是終止于抽象類或者接口,那就是面向對象的設計,反之那就是過程化的設計了。
四、里氏代換原則
? ??????里氏代換原則:一個軟件實體如果使用的是一個父類的話,那么一定適用于其子類,而且覺察不出父類對象和子類對象的區別。也就是說,在軟件里面,把父類都替換成它的子類,程序的行為沒有發生變化。子類型能夠替換掉他的父類型。
? ? ? ? 因為子類繼承了父類,所以子類可以以父類的身份出現。只有當子類可以替換掉父類,軟件單位的功能不受影響時,父類才能真正被復用,而子類也能夠在父類的基礎上增加新的行為。
????????正式由于子類型的可替換性才使得用父類類型的模塊在無需修改的情況下就可以擴展。
????????java中多態性很好地詮釋了里氏代換原則。
五、迪米特法則(最少知識原則)
? ???????迪米特法則:如果一個類不必彼此直接通信,那么這兩個類就不應當發生直接的相互作用。如果一個類需要調用另一個類的某一個方法的話,可以通過第三者轉發這個調用。
? ??????迪米特法則首先強調的前提是在類的結構設計上,每一個類都應當盡量降低成員的訪問權限。其根本思想是強調了類之間的弱耦合。
????????在程序設計中,類之間的耦合越弱,越有利于復用,一個處在弱耦合的類被修改,不會對有關系的類造成波及。也就是說信息的隱藏促進了軟件的復用。
六、合成/聚合復用原則????????
? ??????合成/聚合復用原則:盡量使用合成/聚合,盡量不要使用類繼承。
? ??????合成和聚合都是關聯的特殊種類。聚合表示一種“弱”的擁有關系,體現的是A對象可以包含B對象,但B對象不是A對象的一部分;合成則是一種強的擁有關系,體現了嚴格的整體和部分的關系,部分和整體的生命周期一樣。
? ??????優先使用對象的合成/聚合將有助于你保持每個類被封裝,并集中在單個任務上。這樣類和類繼承層次會保持較小的規模,并且不太可能增長為不可控制的龐然大物。