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
關于作者
?? 讀書城南,?? 在未來面前,我們都是孩子~
- ?? 一個熱衷于探索學習新方向、新事物的智能產品經理,閑暇時間喜歡coding??、畫圖??、音樂??、學習ing~
?? Social Media
??? Blog: http://oceaneyes.top
? PM導航: https://pmhub.oceangzy.top
?? CNBLOG: https://www.cnblogs.com/oceaneyes-gzy/
?? AI PRJ自己部署的一些演算法demo: http://ai.oceangzy.top/
?? Email: [email protected]
?? WeChat: OCEANGZY
- ?? 公眾號: UncleJoker-GZY
?? 感謝打賞~


轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/499003.html
標籤:其他
上一篇:Python設計模式-結構型:配接器模式,裝飾者模式,代理模式,組合模式,外觀模式
下一篇:幾步看懂晶閘管的結構和作業原理
