在軟件工程與面向?qū)ο笤O(shè)計(OOD)領(lǐng)域,SOLID 原則被廣泛視為構(gòu)建可維護、可復(fù)用、可擴展、易測試的軟件系統(tǒng)的核心指導(dǎo)規(guī)范。無論是大型工程架構(gòu),還是日常 Python 項目,只要涉及類與對象,SOLID 原則都能幫助你減少耦合、提高代碼質(zhì)量。
本系列將以 Python 為主要語言,從實用角度講解 SOLID 五大原則的設(shè)計動機、適用場景、常見誤用以及標準示例。
一、什么是 SOLID?
SOLID是五個英文字母的首字母縮寫,代表五項經(jīng)典的面向?qū)ο笤O(shè)計原則,由 Robert C. Martin(Uncle Bob)提出。
字母
英文全稱
中文譯名
S
Single Responsibility Principle
單一職責原則
O
Open–Closed Principle
開閉原則
L
Liskov Substitution Principle
里氏替換原則
Interface Segregation Principle
接口隔離原則
D
Dependency Inversion Principle
依賴倒置原則
盡管 Python 是動態(tài)語言,不依賴接口聲明,也不限制繼承方式,但這些原則依然是判斷一個對象體系設(shè)計是否健壯的重要標準。
為什么在 Python 中仍然需要 SOLID?
Python 靈活、動態(tài)、語義自由,但這也意味著:
? 更容易產(chǎn)生隱性耦合
? 更容易無意重寫行為、破壞預(yù)期
? 更容易在運行時暴露錯誤(而非編譯期)
? 缺少強類型約束,因此設(shè)計思想比語法更重要
SOLID 提供一組可實踐的“設(shè)計約束”,幫助 Python 程序在動態(tài)特性下仍然保持結(jié)構(gòu)清晰。
二、SOLID 五大原則
下面對五項原則做簡要總結(jié),便于建立整體認知。
一個類應(yīng)該只有一個引起其變化的原因。
SRP 是整個 OOP 的基礎(chǔ):
? 避免“萬能類”(God Object)
? 提高可測試性
? 避免更改一個功能影響另一個功能
在 Python 項目中尤其常見于:日志混入業(yè)務(wù)邏輯、數(shù)據(jù)庫操作混入模型類、視圖層混入數(shù)據(jù)驗證等。
軟件實體應(yīng)當對擴展開放,對修改關(guān)閉。
意味著,新功能應(yīng)通過新增類和方法來實現(xiàn),而不是頻繁修改已有穩(wěn)定代碼
Python 中 OCP 常通過:
? 抽象基類(ABC)
? Duck Typing
? 策略模式、適配器模式
? 插件化架構(gòu)
來實現(xiàn)。
只要父類可以使用的地方,子類也必須能夠安全地替代父類,而不會破壞程序功能。
LSP 是保證繼承體系正確性的根基:
? 子類不能弱化父類的行為契約
? 子類不能改變父類方法的語義
? 子類不能突然返回新的類型或拋出額外異常
違反 LSP 會讓繼承成為“反模式”,導(dǎo)致不可維護的 bug。
客戶端不應(yīng)依賴它不需要的方法。
適用于 Python 時,主要體現(xiàn)在:
? 避免把大量不相關(guān)的方法塞入一個類
? 使用多個小型接口(抽象基類)而不是臃腫的大接口
? 通過協(xié)議(Protocol)或抽象類拆分能力
Python 雖然沒有傳統(tǒng)接口,但使用 ABC、mixins、協(xié)議等方式完全能表達 ISP。
高層模塊不應(yīng)依賴低層模塊;二者都應(yīng)依賴抽象。
簡單說:
? 代碼應(yīng)依賴抽象接口,而非具體實現(xiàn)
? 用“可替換組件”構(gòu)建系統(tǒng)
? 提高可測試性與靈活性
Python 中 DIP 很常見于:
? 將具體實現(xiàn)注入(依賴注入 DI)
? 使用抽象基類隔離邏輯
? 在模塊之間抽離協(xié)議(Protocol)
三、SOLID 之間的關(guān)系與整體作用
SOLID 不是五條孤立的規(guī)則,而是一套整體性的設(shè)計體系:
?SRP決定“一個類應(yīng)該做什么”
?OCP決定“如何擴展系統(tǒng)而不破壞舊代碼”
?LSP決定“繼承結(jié)構(gòu)是否穩(wěn)固可靠”
?ISP決定“類暴露出的接口是否合理簡潔”
?DIP決定“系統(tǒng)組件是否松耦合、可替換”
最終目標是:
構(gòu)建靈活、高內(nèi)聚、低耦合、可擴展的對象系統(tǒng)。
四、一個簡單的綜合示例
以下示例構(gòu)建了一個簡單日志系統(tǒng),體現(xiàn) SOLID 各原則的作用:
Processor(FileLogger()).run()這個例子展示:
? 想擴展新的日志方式,只需新增類(OCP)
? Processor 依賴 Logger 抽象而非實現(xiàn)(DIP)
? 每個類職責單一(SRP)
? 所有 Logger 子類行為一致、可替換(LSP)
? Logger 專注單一功能、接口簡單(ISP)
一個小例子即展示了 SOLID 五大原則協(xié)同工作的效果。
小結(jié)
SOLID 是面向?qū)ο笤O(shè)計中最核心、最廣泛應(yīng)用的五大原則,它們共同構(gòu)成評估一個系統(tǒng)是否具備良好設(shè)計的重要標準。在 Python 中,雖然語言動態(tài)且靈活,但依然需要遵守 SOLID 以減少耦合、提升可維護性和擴展性。
![]()
“點贊有美意,贊賞是鼓勵”
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.