面向對象設計的目标
可擴充性
Extensibility
系統可以很容易增加功能,而對原有的系統影響很小
靈活性
Flexibility
子產品相對獨立,通信盡可能少
當一個子產品修改時,對别的子產品影響很小
可替換性
Pluggability
當一部分不在滿足需要時,可以将舊的部分用新的輕松替換
系統“線上更新”功能就是很好的說明
面向對象的總體原則
1.針對接口程式設計,而不是針對實作程式設計
客戶無需知道所使用的的對象的特定類型
隻需要知道對象擁有客戶所期望的接口
2.優先使用對象組合,而不是類繼承
對象組合:一個含有其他對象的類稱為組合類,比如使用的擴充實體
繼承在某種程度上破壞了封裝性、子類父類耦合度高,父類修改後會影響子類
而對象組合隻要求被組合的對象具有良好定義的接口。耦合度降低,一個類的修改對于其他類影響很小
3.封裝變化點
使用封裝建立對象之間的分界層,讓設計者可以在分界層的一側進行修改,而不影響另一側,進而實作層次鍵的松耦合
同一層如果某個接口不固定也可以通過多态封裝變化點,簡單工廠的使用就是例子
面向對象的常用原則
1.“開-閉”原則(Open-Close Principle OCP)
限制對象如何對可變性封裝問題
一個軟體系統應當對擴充開放,對修改關閉
添加新功能時應該隻是向代碼集中添加新的代碼,不應該修改原本的代碼
2.裡氏替代原則(Liskov Substitution Principle LSP)
限制子類和父類如何替換的問題
要求子類可以無條件的替代父類,例如多态的時候使用父類類型作為參數,但是實際傳遞的還是子類對象
3.依賴倒轉原則(Dependence Inversion Principle DIP)
要求開發中針對接口程式設計(業務依賴于接口,而不是實作)
在進行業務設計時,應盡量在接口或抽象類中定義業務方法,并且通過具體的實作類(或子類)來實作業務方法
業務方法的修改将不會影響到運作時業務方法的調用
4.聚合複用原則(Composite/Aggregate Reuse Principle CARP)
盡量使用組合/聚合、盡量不要使用繼承
在一個新的對象裡面使用一些已有的對象,使之成為新的對象的一部分
新的對象通過向這些對象的委派達到複用這些對象的目的
5.迪米特法則(Law Of Demeter LOD)
耦合度問題:盡量“不要和陌生人說話”
一個軟體實體應當盡可能少的與其他實體發生互相作用
初衷在于降低類之間的耦合。由于每個類盡量減少對其他類的依賴,是以,很容易使得系統的功能子產品獨立,互相之間不存在依賴關系
6.接口隔離原則(Interface Separate Principle ISP)
要求接口的職責單一
使用多個專門的接口比使用單一的總接口要好,也就是說,一個類對另外一個類的依賴性應當是建立在最小的接口上
7.其他原則:類的職責明确原則等。。。