国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁(yè) > 網(wǎng)易號(hào) > 正文 申請(qǐng)入駐

Python:依賴倒置原則(DIP)

0
分享至

依賴倒置原則(Dependency Inversion Principle,DIP)是 SOLID 原則之一,由 Robert C. Martin 提出。它強(qiáng)調(diào):

1、高層模塊(High-level module)不應(yīng)該依賴低層模塊(Low-level module)。兩者都應(yīng)該依賴抽象(Interface/抽象類)。

2、抽象不應(yīng)該依賴細(xì)節(jié)。細(xì)節(jié)應(yīng)該依賴抽象。

換句話說(shuō),DIP 的核心理念是面向抽象編程,而非面向?qū)崿F(xiàn)編程。這樣可以讓系統(tǒng)更靈活、可擴(kuò)展,同時(shí)降低模塊間耦合度。

一、為什么需要依賴倒置原則?

在傳統(tǒng)設(shè)計(jì)中,高層業(yè)務(wù)模塊直接依賴低層實(shí)現(xiàn),容易出現(xiàn)以下問(wèn)題:

? 修改低層模塊會(huì)直接影響高層模塊,破壞系統(tǒng)穩(wěn)定性。

? 系統(tǒng)難以擴(kuò)展新功能,需要改動(dòng)多個(gè)類。

? 測(cè)試?yán)щy,無(wú)法輕松替換依賴(例如單元測(cè)試中替換數(shù)據(jù)庫(kù)或網(wǎng)絡(luò)模塊)。

舉例:違反 DIP 的設(shè)計(jì)

        print(f"添加用戶 {name}")

問(wèn)題:

? UserService 直接依賴 MySQLDatabase 具體實(shí)現(xiàn)。

? 如果改用 PostgreSQL 數(shù)據(jù)庫(kù),必須修改 UserService 類的代碼。

? 單元測(cè)試無(wú)法用 Mock 對(duì)象替代真實(shí)的數(shù)據(jù)庫(kù)連接。

這種設(shè)計(jì)違反了依賴倒置原則,導(dǎo)致系統(tǒng)僵化、難以維護(hù)。

二、依賴倒置原則的核心思想

DIP 的基本要求:

1、高層模塊不依賴低層模塊,二者都依賴抽象

2、抽象不依賴具體實(shí)現(xiàn),實(shí)現(xiàn)依賴抽象

換句話說(shuō):

? 依賴于接口(抽象),而非具體類

? 通過(guò)抽象隔離高層與低層

? 將控制權(quán)從低層模塊轉(zhuǎn)移到高層模塊

在 Python 中,這通常通過(guò)抽象基類(ABC)或協(xié)議(Protocol)實(shí)現(xiàn)。

三、Python 中實(shí)現(xiàn) DIP 的方法

(1)使用抽象基類(ABC)

service.add_user("小艾")

優(yōu)勢(shì):

? 高層模塊 UserService 不依賴具體數(shù)據(jù)庫(kù)實(shí)現(xiàn)

? 可以輕松替換數(shù)據(jù)庫(kù)實(shí)現(xiàn)(例如 PostgreSQL 或 SQLite)

? 單元測(cè)試時(shí)可替換為 Mock 對(duì)象

(2)使用協(xié)議(Protocol)實(shí)現(xiàn)輕量抽象

process_user(postgres, "小艾")

優(yōu)勢(shì):

? Pythonic 風(fēng)格,符合鴨子類型

? 不需要顯式繼承 ABC,只要"實(shí)現(xiàn)所需方法"即可

? 更靈活,支持結(jié)構(gòu)化類型注解

四、違反 DIP 的典型場(chǎng)景

(1)高層直接依賴低層實(shí)現(xiàn)

        self.sender = EmailSender()  # ? 依賴具體實(shí)現(xiàn)

(2)修改低層實(shí)現(xiàn)破壞高層模塊

例如,當(dāng) EmailSender 改為使用第三方 SDK 時(shí),Notification 類也需要相應(yīng)修改。

(3)單元測(cè)試?yán)щy

高層模塊難以替換依賴,導(dǎo)致測(cè)試變得復(fù)雜、脆弱。

(4)工廠方法返回具體類型

    return MySQLDatabase()  # ? 返回具體類型,限制了擴(kuò)展性

五、遵守 DIP 的設(shè)計(jì)建議

(1)依賴抽象,不依賴具體類

高層模塊與低層模塊都依賴接口或抽象類,而非具體實(shí)現(xiàn)。

(2)通過(guò)構(gòu)造函數(shù)或依賴注入傳入依賴

避免在高層模塊內(nèi)部直接創(chuàng)建低層對(duì)象,使用依賴注入模式。

(3)接口盡量小而精

與接口隔離原則(ISP)配合,每個(gè)抽象只暴露必要方法,避免高層模塊依賴多余功能。

(4)輕量抽象優(yōu)先

Python 中可以使用 Protocol、ABC 或鴨子類型,不必追求復(fù)雜的接口層次結(jié)構(gòu)。

(5)便于測(cè)試和替換

單元測(cè)試中可以用 Mock 對(duì)象替換依賴,實(shí)現(xiàn)無(wú)侵入測(cè)試。

(6)使用依賴注入容器(可選)

對(duì)于大型項(xiàng)目,可以使用依賴注入容器來(lái)管理依賴關(guān)系。

示例:日志系統(tǒng)

service2.process()

? AppService 不依賴具體日志實(shí)現(xiàn)

? 可自由替換不同的 Logger 實(shí)現(xiàn)

? 高層與低層模塊完全解耦

? 符合依賴倒置原則

小結(jié)

依賴倒置原則是構(gòu)建靈活、可維護(hù)系統(tǒng)的基石。它要求高層模塊不依賴低層實(shí)現(xiàn),而是共同依賴抽象,從而降低耦合度、提高擴(kuò)展性。在 Python 中,通過(guò) ABC、Protocol 或鴨子類型可以自然實(shí)現(xiàn) DIP,讓系統(tǒng)在面對(duì)需求變化時(shí)保持穩(wěn)定。遵循 DIP 不僅能提升代碼的可測(cè)試性和可維護(hù)性,還能促進(jìn)更好的模塊劃分與團(tuán)隊(duì)協(xié)作。


點(diǎn)贊有美意,贊賞是鼓勵(lì)

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(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.

相關(guān)推薦
熱點(diǎn)推薦
廣東108-78遼籃!球員評(píng)分:3人滿分,3人良好,1人不合格

廣東108-78遼籃!球員評(píng)分:3人滿分,3人良好,1人不合格

多特體育說(shuō)
2026-01-11 21:39:19
蔬菜市場(chǎng)遇冷,這3種菜便宜卻沒(méi)人買,攤販:現(xiàn)在老百姓太精明了

蔬菜市場(chǎng)遇冷,這3種菜便宜卻沒(méi)人買,攤販:現(xiàn)在老百姓太精明了

三農(nóng)雷哥
2026-01-11 17:28:07
萬(wàn)萬(wàn)沒(méi)想到!李晨會(huì)因?yàn)槔先宋兜巧蠠崴眩杏X(jué)他這輩子很難結(jié)婚了

萬(wàn)萬(wàn)沒(méi)想到!李晨會(huì)因?yàn)槔先宋兜巧蠠崴?,感覺(jué)他這輩子很難結(jié)婚了

樂(lè)悠悠娛樂(lè)
2025-12-02 11:01:18
打平就出線!U23國(guó)足成亞洲杯大黑馬:賽后澳大利亞球員低下頭顱

打平就出線!U23國(guó)足成亞洲杯大黑馬:賽后澳大利亞球員低下頭顱

足球大腕
2026-01-11 22:02:43
羽壇名將李宗偉:36歲患癌喉嚨全爛,花近1000萬(wàn)續(xù)命,現(xiàn)狀如何?

羽壇名將李宗偉:36歲患癌喉嚨全爛,花近1000萬(wàn)續(xù)命,現(xiàn)狀如何?

豐譚筆錄
2026-01-07 10:59:38
遼寧78-108廣東1喜3憂!小將罕見(jiàn)暴走,姜宇星仍崩,2將難打強(qiáng)隊(duì)

遼寧78-108廣東1喜3憂!小將罕見(jiàn)暴走,姜宇星仍崩,2將難打強(qiáng)隊(duì)

籃球資訊達(dá)人
2026-01-11 22:32:21
2026年春節(jié),要暖到離譜?大年初一撞上七九,老輩人:60年頭回見(jiàn)

2026年春節(jié),要暖到離譜?大年初一撞上七九,老輩人:60年頭回見(jiàn)

叮當(dāng)當(dāng)科技
2026-01-07 13:58:49
愛(ài)奇藝、騰訊、優(yōu)酷三大平臺(tái)“王炸劇”紛紛登場(chǎng),誰(shuí)能登頂劇王?

愛(ài)奇藝、騰訊、優(yōu)酷三大平臺(tái)“王炸劇”紛紛登場(chǎng),誰(shuí)能登頂劇王?

鄉(xiāng)野小珥
2026-01-12 05:57:22
乒球世界排名更新:朱雨玲第5獲28萬(wàn),陳幸同重返第3

乒球世界排名更新:朱雨玲第5獲28萬(wàn),陳幸同重返第3

民哥臺(tái)球解說(shuō)
2026-01-12 05:20:12
氧氣要火了?科學(xué)家發(fā)現(xiàn)寶藏:吸100%純氧3個(gè)月,生理倒拔20歲

氧氣要火了?科學(xué)家發(fā)現(xiàn)寶藏:吸100%純氧3個(gè)月,生理倒拔20歲

科學(xué)認(rèn)識(shí)論
2026-01-11 17:13:05
開(kāi)國(guó)大將次子羅宇,89年攜香港女星叛逃出國(guó),晚年在美國(guó)黯然離世

開(kāi)國(guó)大將次子羅宇,89年攜香港女星叛逃出國(guó),晚年在美國(guó)黯然離世

搜史君
2025-12-31 13:00:10
形勢(shì)突變!別了,北約!美國(guó)這次玩真的!

形勢(shì)突變!別了,北約!美國(guó)這次玩真的!

李榮茂
2026-01-12 07:03:16
哈梅內(nèi)伊開(kāi)始大范圍斷網(wǎng),革命衛(wèi)隊(duì)將與中俄軍演,伊朗進(jìn)入關(guān)鍵期

哈梅內(nèi)伊開(kāi)始大范圍斷網(wǎng),革命衛(wèi)隊(duì)將與中俄軍演,伊朗進(jìn)入關(guān)鍵期

溫讀史
2026-01-10 07:33:53
拉菲尼亞雙響鎖定勝局,巴薩3-2皇馬衛(wèi)冕西超杯

拉菲尼亞雙響鎖定勝局,巴薩3-2皇馬衛(wèi)冕西超杯

浮萍足球
2026-01-12 07:24:06
廣西又有2名干部向紀(jì)委投案自首!

廣西又有2名干部向紀(jì)委投案自首!

嶺南美玉
2026-01-12 00:08:15
我只認(rèn)出了萬(wàn)梓良 ,你們呢 ?

我只認(rèn)出了萬(wàn)梓良 ,你們呢 ?

小椰的奶奶
2026-01-12 01:45:27
為保護(hù)馬杜羅夫妻戰(zhàn)死的古巴桑切斯上校,被曝光家人都住在美國(guó)!

為保護(hù)馬杜羅夫妻戰(zhàn)死的古巴桑切斯上校,被曝光家人都住在美國(guó)!

阿龍聊軍事
2026-01-09 20:20:47
伊朗政府宣布全國(guó)哀悼三天

伊朗政府宣布全國(guó)哀悼三天

界面新聞
2026-01-12 07:03:21
沒(méi)想到竟然這么多工作需要保密的!網(wǎng)友:不讓看非看被一槍斃了

沒(méi)想到竟然這么多工作需要保密的!網(wǎng)友:不讓看非看被一槍斃了

另子維愛(ài)讀史
2025-12-08 20:58:22
汪小菲為什么發(fā)瘋,發(fā)瘋背后是流量斷崖式的下跌

汪小菲為什么發(fā)瘋,發(fā)瘋背后是流量斷崖式的下跌

調(diào)侃國(guó)際觀點(diǎn)
2026-01-11 18:41:24
2026-01-12 08:04:49
MediaTea
MediaTea
專業(yè)的數(shù)字媒體、新媒體技術(shù)
1701文章數(shù) 72關(guān)注度
往期回顧 全部

科技要聞

“我們與美國(guó)的差距也許還在拉大”

頭條要聞

李獻(xiàn)林學(xué)習(xí)教育期間違規(guī)吃喝:5人喝4瓶酒 1人酒后死亡

頭條要聞

李獻(xiàn)林學(xué)習(xí)教育期間違規(guī)吃喝:5人喝4瓶酒 1人酒后死亡

體育要聞

U23國(guó)足形勢(shì):末輪不負(fù)泰國(guó)即確保晉級(jí)

娛樂(lè)要聞

留幾手為閆學(xué)晶叫屈?稱網(wǎng)友自卑敏感

財(cái)經(jīng)要聞

外賣平臺(tái)"燒錢搶存量市場(chǎng)"迎來(lái)終局?

汽車要聞

2026款宋Pro DM-i長(zhǎng)續(xù)航補(bǔ)貼后9.98萬(wàn)起

態(tài)度原創(chuàng)

本地
游戲
時(shí)尚
公開(kāi)課
軍事航空

本地新聞

云游內(nèi)蒙|“包”你再來(lái)?一座在硬核里釀出詩(shī)意的城

這款帥到掉渣的GBA神作《洛克人ZERO》,被模仿無(wú)數(shù)次仍是巔峰

當(dāng)一個(gè)57歲的女人,決定從零開(kāi)始

公開(kāi)課

李玫瑾:為什么性格比能力更重要?

軍事要聞

俄大使:馬杜羅夫婦被控制時(shí)身邊沒(méi)人

無(wú)障礙瀏覽 進(jìn)入關(guān)懷版