參考博文:http://www.cnblogs.com/shaosks/category/351488.html 面向對象設計的原則主要有:單一職責原則,開放封閉原則,里氏替換原則,依賴倒置原則,迪米特法則,合成/聚合復用原則。下面將對每個原則做一個學習理解與總結,加深對面向對象的理解,促進工作中對這些原則的運用。 1、單一職責原則(Single Responsibility Principle SRP)一個類只做一件事情 There should never be more than one reson for a class to change。也就是說引起一個類改變的原因只能有一個,一個類承擔的職責過多應進行分離,使程序設計達到高內(nèi)聚低耦合的原則。從而使一個功能的改變只需要修改一個類而不影響到其他的功能。例如作者所說的調(diào)制解調(diào)器,應該將連接和數(shù)據(jù)傳送兩個功能分開抽象出兩個接口,而調(diào)制解調(diào)器同時實現(xiàn)這兩個接口實現(xiàn)鏈接和數(shù)據(jù)傳送的功能,因此當鏈接的功能改變時對數(shù)據(jù)傳送功能沒有產(chǎn)生任何影響。 單一職責原則優(yōu)點:降低類的復雜性,提高可維護性,提高可讀性,降低需求變化帶來的風險。 2、開放封閉原則(Open-Closed Principle OCP)面向抽象編程 開放封閉原則是所有面向對象原則的核心,要求軟件實體應對擴展開放,對修改封閉。軟件設計本身追求的目標就是封裝變化,降低耦合,而開放封閉原則正是對這一目標的直接體現(xiàn)。 開放封閉原則的實現(xiàn):實現(xiàn)思想就是對抽象編程,而不是對具體編程,因為抽象相對穩(wěn)定。讓類依賴于固定的抽象,所以對修改就是封閉的;通過面向對象的繼承和多態(tài)機制,可以實現(xiàn)對抽象體的繼承,通過重寫其方法來改變固定的行為,實現(xiàn)新的擴展方法,所以對于擴展就是開放的。 開放封閉主要是兩方面,對擴展開放,意味著有新的需求或變化時,可以對現(xiàn)有代碼進行擴展,以適應新的情況;對修改封閉,意味著一旦設計完成,就可以獨立其工作,而不要對類進行任何修改。 如何實現(xiàn)耦合度和靈活性兼得呢?那就是抽象,將業(yè)務功能抽象為接口,當業(yè)務依賴于固定的抽象時,對修改就是封閉的,而通過繼承和多態(tài),從抽象體中擴展出新的實現(xiàn),這就是對擴展的開放。這樣當業(yè)務變成時,只需要修改對應的業(yè)務實現(xiàn)類即可,其他不相干的業(yè)務就不必修改。當業(yè)務增加時,只需要增加業(yè)務的實現(xiàn)就可以了。 拒絕濫用抽象,只將經(jīng)常變化的部分進行抽象。 3、里氏替換原則,(Liskov Substitution Principle LSP)子類可以替代父類 里氏替換原則講的是基類和子類的關系,指任何基類可以出現(xiàn)的地方,子類一定可以出現(xiàn)。繼承必須保證超類中所擁有的性質在子類中仍然成立,也就是說子類必須能夠替換成它們的基類。Liskov替換原則主要用來約束繼承的泛濫問題。 如果子類不能完整的實現(xiàn)父類的方法,建議斷開父子繼承關系,使用依賴,聚合,組合等關系。 采用里氏替換原則的目的時增加程序的健壯性,需求變更時也可以保持良好的兼容性和穩(wěn)定性,即使增加子類,原有的子類可以繼續(xù)運行。在實際項目中,每個子類對應不同的業(yè)務含義,使用父類作為參數(shù),傳遞不同的子類完成不同業(yè)務邏輯。
4、依賴倒置原則(Dependence Inversion Principle DIP)依賴于抽象不依賴于具體 依賴倒置原則就是高層模塊不應該依賴于底層模塊,而這都應該依賴其抽象。抽象不應該依賴細節(jié),細節(jié)應該依賴抽象。 抽象:即抽象類或接口,是不能實例化的 細節(jié):即具體的實現(xiàn)類,實現(xiàn)接口或者繼承抽象類所產(chǎn)生的累,可通過關鍵字new 實例化。
在實際編程中我們需要做到三點:
面向過程的開發(fā)是上層調(diào)用下層,上層依賴于下層,當下層劇烈變化時,上層也要跟著變化,這樣導致模塊的復用性降低而大大提高了開發(fā)成本。面向對象開發(fā)解決了這個問題,一般情況下,抽象的變化概率較小,讓用戶依賴于抽象,實現(xiàn)細節(jié)也一倆與抽象。即使實現(xiàn)細節(jié)不斷變化,只要抽象不變,客戶程序就不需要變化,這就大大降低了客戶域實現(xiàn)細節(jié)的耦合度。 總之,一個應用的主要策略及業(yè)務往往集成咋高層模塊中,但是這些模塊依賴于底層模塊時,底層的修改將直接影響到高層模塊,迫使它們也改變,這是不科學的。應該時處于高層的模塊迫使底層的模塊發(fā)生改變,處于高層的模塊應該優(yōu)先于底層的模塊,無論如何高層模塊也不應該依賴于底層模塊,而且我們能夠服用的時高層的模塊,只有高層模塊獨立于底層模塊時,服用才有可能。最終,高層次的模塊不依賴于底層的模塊,它們都應該依賴于抽象。抽象不應該依賴于具體,具體應該依賴于抽象。 5、迪米特原則(Law of Demeter)又叫最少知識原則(Least Knowlege Principle LKP)對象與對象之間盡可能少的交互 面向對象來說,一個軟件實體應盡可能少的與其他實體發(fā)生相互作用,降低類之間的耦合,每個類都盡量減少對其他類的依賴,這樣做的結果是很容易實現(xiàn)模塊的相互獨立,但可能造成一個后果,系統(tǒng)中存在大量的中介類,這些類用來傳遞類之間的相互調(diào)用關系,一定程度增加了系統(tǒng)復雜度。 迪米特法則在設計模式中的門面模式(Facade)和中介模式(Mediator)中得到應用。
6、合成復用原則又稱組合/聚合服用原則(Composite Reuse Principle CRP)復用時盡量使用組合/聚合關系(關聯(lián)關系),少用繼承。 合成復用原則就是在一個新的對象里通過關聯(lián)關系來使用一些已有的對象,使之成為新對象的一部分,新對象通過委派調(diào)用已有對象的方法達到服用功能的目的。 在面向對象的程序設計中,可以通過兩種方法在不同的環(huán)境中服用已有的設計和實現(xiàn),即通過組合/聚合或通過繼承,但首先應考慮使用組合/聚合,組合/聚合使系統(tǒng)更加靈活,降低類與類之間的耦合度,一個類的變化對其他類造成的影響相對較少,其實考慮繼承,使用繼承時嚴格遵循里氏替換原則,有效使用繼承會有助于對問題的理解,降低復雜度,而濫用繼承反而增加系統(tǒng)構建與維護難度以及系統(tǒng)的復雜度,因此需要謹慎使用繼承復用。 一般而言,如果兩個類之間時“Has-a”的關系應使用組合或聚合,如果是“Is-a”的關系使用繼承。 合成復用可以在運行時動態(tài)進行,新對象可以動態(tài)的引用與成員對象類型相同的其他對象。
總結,通過以上對面向對象程序設計中原則的梳理,希望以后代碼過程中能得到更廣泛的應用,提高代碼質量。
|
|