Python設計模式-六大設計原則 單一職責原則 (Single Responsibility Principle) 顧名思義,單一職責的原則是說一個類只負責一項職責(操作)。如果一個類負責多個職責,其中一項職責發生變化就需要修改整個類,這可能會導致其他的職責運行錯誤。一個類,只應該有一個引起它變化 ...
Python設計模式-六大設計原則
單一職責原則 (Single Responsibility Principle)
顧名思義,單一職責的原則是說一個類只負責一項職責(操作)。如果一個類負責多個職責,其中一項職責發生變化就需要修改整個類,這可能會導致其他的職責運行錯誤。一個類,只應該有一個引起它變化的原因。
其優點有:
- 可以降低類的複雜度,一個類只負責一項職責,其邏輯肯定要比負責多項職責簡單的多;
- 提高類的可讀性,提高系統的可維護性;
- 變更引起的風險降低,變更是必然的,如果單一職責原則遵守的好,當修改一個功能時,可以顯著降低對其他功能的影響。
里氏替換原則 (Liskov Substitution Principle)
里氏替換的意思是說所有引用基類的地方必須能透明地使用其子類的對象。這種情況在代碼中隨處可以,我們在類中使用基類進行定義,而在運行時使用子類對象,為了確保代碼運行正常,在實現子類時要註意以下一些地方:
- 子類可以實現父類的抽象方法,但不能覆蓋父類的非抽象方法;
- 子類中可以增加自己特有的方法;
- 當子類的方法重載父類的方法時,子類方法的輸入參數要比父類方法的輸入參數更寬鬆;
依賴倒置原則 (Dependence Inversion Principle)
定義:抽象不應該依賴於細節,細節應當依賴於抽象。換言之,要針對介面編程,而不是針對實現編程。依賴倒置原則要求我們在程式代碼中傳遞參數時或在關聯關係中,儘量引用層次高的抽象層類,即使用介面和抽象類進行變數類型聲明、參數類型聲明、方法返回類型聲明,以及數據類型的轉換等,而不要用具體類來做這些事情。依賴倒置原則的本質就是通過抽象(介面或抽象類)使各個類或模塊的實現彼此獨立,不互相影響,實現模塊間的松耦合。在編寫代碼中落到實處,需要註意以下一些地方:
每個類儘量都有介面或抽象類,或者抽象類和介面兩者都具備;
- 變數的表名類型儘量是介面或者抽象類;
- 儘量不要覆寫基類的方法;
- 結合里氏替換原則使用。
由於 Python 是一門動態語言,在傳遞參數時不需要定義具體類型,所以依賴倒置原則其實一定程度上已經內嵌在了 Python 語言中。
介面隔離原則 (Interface Segregation Principle)
介面隔離原則提示我們客戶端不應該依賴它不需要的介面,一個類對另一個類的依賴應該建立在最小的介面上。根據介面隔離原則,當一個介面太大時,我們需要將它分割成一些更細小的介面,使用該介面的客戶端僅需知道與之相關的方法即可。每一個介面應該承擔一種相對獨立的角色,不幹不該乾的事,該乾的事都要乾。
看到這裡你們或許認為介面隔離原則與單一職責原則是相同的。其實介面隔離原則與單一職責原則的審視角度是不相同的,單一職責原則要求的是類和介面職責單一,註重的是職責,這是業務邏輯上的劃分,而介面隔離原則要求介面的方法儘量少。在使用介面隔離原則時,我們需要註意控制介面的粒度,介面不能太小,如果太小會導致系統中介面泛濫,不利於維護;介面也不能太大,太大的介面將違背介面隔離原則,靈活性較差,使用起來很不方便。一般而言,介面中僅包含為某一類用戶定製的方法即可,不應該強迫客戶依賴於那些它們不用的方法。
迪米特原則 (Law of Demeter)
定義:一個對象應該對其他對象有最少的瞭解。通俗地講,一個類應該對自己需要耦合或調用的類知道得最少,你(被耦合或調用的類)的內部是如何複雜都和我沒關係,那是你的事情,我就知道你提供的公開方法,我就調用這麼多,其他的我一概不關心。迪米特法則指導我們在設計系統時,應該儘量減少對象之間的交互,如果兩個對象之間不必彼此直接通信,那麼這兩個對象就不應當發生任何直接的相互作用,如果其中的一個對象需要調用另一個對象的某一個方法的話,可以通過第三者轉發這個調用。簡言之,就是通過引入一個合理的第三者來降低現有對象之間的耦合度。可以看到迪米特原則在代理模式和外觀模式中都有被使用。
開閉原則 (Open Closed Principle)
軟體實體應該對擴展開放,對修改關閉,其含義是說一個軟體實體應該通過擴展來實現變化,而不是通過修改已有的代碼來實現變化。根據開閉原則,在設計一個軟體系統模塊(類,方法)的時候,應該可以在不修改原有的模塊(修改關閉)的基礎上,能擴展其功能(擴展開放)。遵循開閉原則的系統設計,可以讓軟體系統可復用,並且易於維護。這也是系統設計需要遵循開閉原則的原因:
- 穩定性:開閉原則要求擴展功能不修改原來的代碼,這可以讓軟體系統在變化中保持穩定。
- 擴展性:開閉原則要求對擴展開放,通過擴展提供新的或改變原有的功能,讓軟體系統具有靈活的可擴展性。
本文來自博客園,作者:OCEANEYES.GZY,轉載請註明原文鏈接:https://www.cnblogs.com/oceaneyes-gzy/p/16462983.html