面向對象設計原則

1、單一職責原則

    在軟件系統總,一個類只負責一個功能領域中的相應職責,僅有一個引起它變化的原因。在一個類中,承擔的職責越多,職責就會被耦合在一起,需要修改某個職責時會造成其它的職責受到影響,而且它被複用的可能性越小。類的職責主要體現在了數據和行爲,在代碼設計上數據體現在了類的屬性上,行爲體現在了類的方法中,這就要求了設計人員需要把類中的涉及到的職責進行分析,把不同的職責進行分離,從而在類的屬性和方法中體現出來。

2、開放-封閉原則

    開放是對軟件擴展的開放,封閉式對修改的封閉。在現有的模塊或功能在不修改的前提下進行擴展,實現了不修改原有的代碼而改變了這個模塊或功能的行爲。這個開放大到系統,小到一個類甚至是一個方法。在設計中,實現這一原則關鍵的一步就是抽象化,這個是面向對象設計的目標,從而做到系統的靈活性和拓展性

3、里氏替換原則

    在系統中,能夠使用基類對象的地方,也一定能夠使用其子類對象,而且程序不會產生任何的錯誤異常。但是子類對象替換成基類對象就不一定能夠使用基類對象,子類有可能存在不同的行爲方式。在我們設計時,儘可能使用基類類型對象進行定義,在運行時再確定其子類類型,這樣子類類型發生變化時避免對引用的地方造成大的影響。

4、依賴倒置原則

    高層模塊不應該依賴於底層模塊,它們都應該依賴於抽象。而抽象不應該依賴於細節,細節應該依賴於抽象。即針對接口抽象類編程,不針對實現過程的具體類編程,從抽象化中導出具體的實現類,這個是面向對象的主要的手段。實現的方式在代碼中是使用抽象類,在配置文件中放的具體類。具體的代碼實現方式是依賴注入,其中包括構造注入(通過構造函數注入實例變量)、設值注入(通過Setter方法注入實例變量),接口注入(通過接口方法注入實例變量),以抽象方式耦合是當前原則的關鍵。

5、接口隔離原則

    調用方不應該依賴那些他不需要的接口,及調用方僅需要知道它們需要知道與之相關的方法即可。這樣就要就我們定義的接口不要太大,如果太大,就應該把他分解成多個專門的接口,每個接口承擔一種相對獨立的角色,承載的方法行爲恰到好處,滿足單一職責的原則,將相關的操作定義在一個接口中,滿足高內聚。把調用方不需要的行爲方法隱藏起來,提供的接口單獨儘可能小,有必要時可以考慮定製服務接口的方式,把調用方需要的行爲進行封裝定義。

6、合成複用原則

    儘量使用對象組合,而不是繼承來達到複用的目的。對象通過關聯關係來使已知對成爲對象的一部分,通過委派調用已知對象的方法達到複用,在這種情況下,要儘量使用組合/聚合關係,少用繼承。但這個與我們面向對象特性繼承是不衝突的,在不同的情況下複用已有的設計和實現,可以通過繼承和關聯關係(組合/聚合關係)來實現。繼承從基類繼承的實現是靜態的,在運行時不能發生變化,實現簡單易於擴展,但會破壞了封裝,組合/聚合耦合對相對較低,可以選擇的調用對象的行爲操作,在運行時動態的進行,在使用的場景有所不一樣。一般情況下對現有類型進行重複使用時,是優先考慮使用組合/聚合來實現複用,它類於類的耦合度減小,再考慮繼承,繼承有助於對問題理解,降低了複雜度,但也會造成系統構建和維護的困難。

7、迪米特原則

    一個軟件實體應當儘可能少的與其它實體發生相互作用,主要的用途控制信息的過載。在狹義上,兩個類不應該發生直接的相互作用,可以通過第三者轉發這個調用,每個類不會和遠距離的對象有直接關聯,通過大量的小方法簡化系統的局部設計,但也會造成模塊間的通訊效率和不易協調。廣義上,對對象之間的信息流量、流向以及信息的影響控制,主要是對信息隱藏的控制。每個模塊不依賴其它的模塊,每個模塊可以獨立的使用,到達這一目的通過的是信息隱藏,使得模塊之間脫耦。在類設計結構上,應當儘量降低其成員變量和成員方法的訪問權限,一個類型應當設計成不變的類,對其它類型對象的應用減少到最低。對象的合理引用是當前對象本身、以參數形式傳入到當前對象方法中的對象、當前對象成員對象、集合中的元素、當前對象所創建的對象。

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章