面向對象的七大設計原則(點滴的感悟與總結)
點滴感悟與總結!
1.單一職責原則:一個對象一個只包含單一的職責,並且該職責被完整的封裝在一個類中(盡量降低系統耦合)
(實現高內聚,低耦合的指導方針)
分析:一個類(大到模塊,小到方法)承擔的職責越多,它被復用的可能性就越小,而一個類承擔的職責越多,相當於將這些職責耦合在一起,當其中一個職責發生變化的時候會影響其他職責的運作,因此要將這些職責進行分離,將不同的職責分裝在不同的類中,如果多個職責總是發生改變,則可將他們封裝在同一類中
2.開閉原則:軟件實體應該對擴展開發,對修改關閉(盡量在不修改原有代碼的基礎上進行擴展)
(可復用的基石)
分析:定義一個相對穩定的抽象層,而將不同的實現行為轉到實現層中完成,方便復用與擴展
3.裏氏代換原則:所有引用基類的地方必須能夠透明的使用其子類對象
(實現開閉原則的重要方式之一)
分析:裏氏代換原則表明:在軟件中將一個基類對象替換成它的子類對象,程序將不會產生任何錯誤和異常,反過來則不成立,如果一個軟件實題使用的是一個子類對象,那麽它不一定能夠使用基類對象,所以為了符合裏氏代換原則我們應該:在程序中盡量使用基類對象來進行定義,而在運行時再確定其子類類型,用子類對象來代替父類對象,比如將父類設計為抽象類或者接口,讓子類基礎父類或者實現父類接口,並實現在父類中聲明的方法,在運行時子類實例替換父類實例,可以很方便的擴展系統功能,無須修改原有子類的代碼,增加的新功能可以通過一個新的子類實現
4.依賴倒轉原則:高層模塊不應該依賴低層模塊,他們都應該依賴抽象,抽象不應該依賴細節,細節應該依賴抽象(就是要求針對接口編程,而不是針對實現編程)
分析:依賴倒轉原則要求在代碼中傳遞參數或者關聯關系中盡量引用層次高的抽象層類,即使用接口和抽象類進行變量類型聲明,參數類型聲明,方法返回類型聲明以及數據類型轉換等,而不要用具體類來做這些事情
在引入抽象層後,系統將具有很好的靈活性,在程序中盡量使用抽象層進行編程,而將具體類寫在配置文件中,這樣如果系統的行為發生變化,只需要對抽象層進行擴展,並修改配置文件,而無需修改原有的系統代碼,在不修改的情況下擴展系統功能,滿足開閉原則的要求
在實現依賴倒轉原則時需要針對抽象層進行編程,而將具體類的對象通過依賴註入的方式註入到其他對象當中,依賴註入是指當一個對象要與其他對象發生依賴關系時采用抽象的形式來註入鎖依賴的對象,常用的註入方式有3種,分別是構造註入,設值註入和接口註入
5.接口隔離原則:客戶端不應該依賴那些它不需要的接口
分析:根據接口隔離原則,當一個接口太大時需要將他分割成一些更細小的接口,使用該接口的客戶端僅需指導與之相關的方法即可,每一個接口承擔一種相對獨立的角色,不幹不該幹的事,該幹的事都要幹
這裏接口含義的定義有兩種:
1).指一個類型所具有方法特征的集合,邏輯上的抽象
2).指某種語言具體的接口,比如java
當理解成第一種含義時,可以把接口理解為角色,即每個角色都有它特定的一個接口,此時該原則可以叫做角色隔離原則
當理解成第二種含義時,就是為客戶端提供盡可能小的單獨接口,因為實現一個接口需要實現該接口中定義的所有方法,因此大的接口使用起來不一定方便,接口應該盡量細化,接口中的方法也應該盡量少,每個接口中只包含一個客戶端所需的方法即可,這種機制也叫做定制服務
6.合成復用原則:優先使用對象組合,而不是通過繼承來達到復用的目的
分析:在面向對象的設計中可以通過兩種方法在不同的環境中復用已有的設計和實現,即通過組合/聚合或通過繼承,但應該首先考慮組合/聚合,組合/聚合可以使系統更加的靈活,降低類與類之間的耦合度,一個類的變化對其他類造成的影響相對比較小,其次才考慮繼承,在使用繼承時要嚴格遵循裏氏代換原則,有效使用繼承會有助於對問題的理解,降低復雜度,而濫用繼承反而會增加系統構建和維護的難度以及系統的復雜度,因此要謹慎使用繼承復用
7.迪米特法則:每一個軟件單位對其他單位都只有最少的知識,而且局限於那些與本單位密切相關的軟件單位
(降低單位間通信的寬帶與深度)
分析:迪米特法則要求一個軟件實體應當盡可能少地與其他實體發生相互作用,如果一個系統符合迪米特發則,那麽當其中一個模塊發生修改時就會盡量少地影響其他模塊,擴展會相對容易,這是對軟件實體之間的通信限制,迪米特法則就是要降低系統的耦合度,保持類與類之間松散的耦合關系
如果一個對象必須要調用另一個對象的方法,可以通過第三者轉發這個調用,簡而言之,就是通過引入一個合理的第三者來降低現有對象間的耦合度(中間件)
需要註意的地方:
1.在類的劃分上,應該盡量創建松耦合的類,這樣改類被修改時對關聯的類不會造成太大的影響
2.在類的結構設計上,每個類都應該降低其成員變量和成員函數的訪問權限
3.在類的設計上,一個類應該設計成不變類
4.對其他類的引用上,一個對象對其他對象的引用應該降到最低
總結:7大發則,歸根結底還是要實現高內聚低耦合,方便復用與擴展。。。。。
目前沒有大型項目的經驗,對7大法則的理解還比較淺顯(2019/03/15)
面向對象的七大設計原則(點滴的感悟與總結)