C# 實例解釋面向對象編程中的依賴反轉原則

在面向對象編程中,SOLID?是五個設計原則的首字母縮寫,旨在使軟件設計更易于理解、靈活和可維護。這些原則是由美國軟件工程師和講師羅伯特·C·馬丁(Robert Cecil Martin)提出的許多原則的子集,在他2000年的論文《設計原則與設計模式》中首次提出。

SOLID 原則包含:

  • S:單一功能原則(single-responsibility principle)

  • O:開閉原則(open-closed principle)

  • L:里氏替換原則(Liskov substitution principle)

  • I:接口隔離原則(Interface segregation principle)

  • D:依賴反轉原則(Dependency inversion principle)

本文我們來介紹依賴反轉原則

依賴反轉原則

在面向對象編程領域中,依賴反轉原則(Dependency inversion principle,DIP)是指一種特定的解耦形式,使得高層次的模塊不依賴于低層次模塊的實現細節,依賴關系被顛倒(反轉),從而使低層次模塊依賴于高層次模塊的需求抽象。傳統的依賴關系創建在高層次上,而具體的策略設置則應用在低層次的模塊上

39ad2b7a1d1fe39b99f4cce78d955589.png

圖1 中,高層 對象A 依賴于低層 對象B 的實現;圖2 中,把高層 對象A 對低層對象的需求抽象為一個 接口A,低層 對象B 實現了 接口A,這就是依賴反轉。

依賴反轉原則約定:

  • 高層次的模塊不應該依賴于低層次的模塊,兩者都應該依賴于抽象接口。

  • 抽象接口不應該依賴于具體實現。而具體實現則應該依賴于抽象接口。

該原則顛倒了一部分人對于面向對象設計的認識方式(如高層次和低層次對象都應該依賴于相同的抽象接口)。

依賴注入是該原則的一種實現方式。

C# 示例

先定義一個商品信息類:

public class ProductInfo
{public int ID { get; set; }public string ProductName { get; set; }public string ProductSpec { get; set; }public int Stock { get; set; }
}

§糟糕的示范

新建一個數據訪問類?ProductDataAccess?和業務邏輯類?ProductBusinessLogic

public class ProductDataAccess
{public ProductInfo GetDetail(int id){ProductInfo product = new(){ID = id,ProductName = "白糖",ProductSpec = "500g",Stock = 100};return product;}
}public class ProductBusinessLogic
{private readonly ProductDataAccess _productDataAccess;public ProductBusinessLogic(){_productDataAccess = new ProductDataAccess();}public ProductInfo GetProductDetails(int id){return _productDataAccess.GetDetail(id);}
}

在上面的代碼中,高層次的類?ProductBusinessLogic?直接依賴于低層次的類?ProductDataAccess,這明顯違反了?依賴反轉原則

§正確的示范

根據?依賴反轉原則?的要求,我們把高層對象?ProductBusinessLogic?對低層對象的需求抽象為一個接口?IProductDataAccess

public interface IProductDataAccess
{ProductInfo GetDetail(int id);
}

在低層對象?ProductDataAccess?中實現接口?IProductDataAccess,然后在高層對象?ProductBusinessLogic?中引用(注入)接口?IProductDataAccess

public class ProductDataAccess : IProductDataAccess
{public ProductInfo GetDetail(int id){ProductInfo product = new(){ID = id,ProductName = "白糖",ProductSpec = "500g",Stock = 100};return product;}
}public class ProductBusinessLogic
{private readonly IProductDataAccess _productDataAccess;public ProductBusinessLogic(IProductDataAccess productDataAccess){_productDataAccess = productDataAccess;}public ProductInfo GetProductDetails(int id){return _productDataAccess.GetDetail(id);}
}

這樣,這些類的設計便遵守了依賴反轉原則

其實,ASP.NET Core 中服務的依賴注入正是遵循了依賴反轉原則

總結

本文我介紹了 SOLID 原則中的依賴反轉原則(Dependency inversion principle),并通過 C# 代碼示例簡明地詮釋了它的含意和實現,希望對您有所幫助。

作者 :技術譯民
出品 :技術譯站(https://ITTranslator.cn/)

參考文檔:

  • https://en.wikipedia.org/wiki/SOLID

  • https://www.c-sharpcorner.com/blogs/dependency-inversion-principle-in-c-sharp

  • https://flylib.com/books/en/4.444.1.71/1/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284358.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284358.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284358.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux學習筆記之一————什么是Linux及其應用領域

1.1認識Linux 1)什么是操作系統 2)現實生活中的操作系統 win7 Mac Android iOS 3) 操作系統的發展史 (1)Unix 1965年之前的時候,電腦并不像現在一樣普遍,它可不是一般人能碰的起的,…

Flex中寬度計算

flex 有三個屬性值,分別是 flex-grow, flex-shrink, flex-basis,默認值是 0 1 auto。 發現網上詳細介紹他們的文章比較少, 今天就詳細說說他們,先一個一個看。 flex-grow 定義項目的放大比例,默…

Lucene詳解

一.lucene原理 Lucene 是apache軟件基金會一個開放源代碼的全文檢索引擎工具包,是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎。它不是一個完整的搜索應用程序,而是為你的應用程序提供索引和搜索功能…

.NET 6.0中使用Identity框架實現JWT身份認證與授權

原文作者:Sarathlal Saseendran原文鏈接:https://www.c-sharpcorner.com/article/jwt-authentication-and-authorization-in-net-6-0-with-identity-framework/翻譯:沙漠盡頭的狼(谷歌翻譯加持)介紹微軟于 2021 年 11 …

adb devices 里面有很多 emulator-XXXX的解決方法

2019獨角獸企業重金招聘Python工程師標準>>> adb kill-server 轉載于:https://my.oschina.net/sfshine/blog/700354

MQ(Message Queue)簡介

一、何為MQ? MQ全稱為Message Queue, 消息隊列(MQ)是一種應用程序對應用程序的通信方法。應用程序通過讀寫出入隊列的消息(針對應用程序的數據)來通信,而無需專用連接來鏈接它們。消息傳遞指的是程序之間通…

【GlobalMapper精品教程】015:矢量面圖層的創建及數字化操作

本文講解在Globalmapper中文23.0中創建矢量面狀數據(政區數據),并進行面狀數據采集及編輯的詳細操作流程,數據為配套案例數據包中的data015.rar。 參考閱讀: ArcGIS實驗教程——實驗三:矢量數據采集與編輯(矢量化) 文章目錄 一、認識工具條1. 數字化(創建)工具條2. 選…

Blazor University (39)JavaScript 互操作 —— 更新 document title

原文鏈接:https://blazor-university.com/javascript-interop/calling-javascript-from-dotnet/updating-the-document-title/更新 document title源代碼[1]在創建 Blazor 布局[2]部分中,我們看到了 Blazor 應用程序如何存在于 HTML(或 cshtm…

IIS 日志文件位置

IIS 6 Log files location IIS 6中日志文件的位置%windir%\System32\LogFilesIIS 7 Log files location IIS的日志文件的位置%SystemDrive%\inetpub\logs\LogFiles用戶每打開一次網頁,iis 都會記錄用戶IP、訪問的網頁地址、訪問時間、訪問狀態等信息,這些…

APP測試流程和測試點

1 APP測試基本流程 1.1流程圖 1.2測試周期 測試周期可按項目的開發周期來確定測試時間,一般測試時間為兩三周(即15個工作日),根據項目情況以及版本質量可適當縮短或延長測試時間。正式測試前先向主管確認項目排期。 1.3測試資源 測…

39所強基計劃試點高校已全部公布招生簡章

截至目前(4月8日下午) 39所強基計劃試點高校 已全部公布招生簡章 各高校招生要求是什么? 招生專業有哪些? 什么時候報名? 一起來看 北京大學 招生對象及報名條件 各省(區、市)符合2022年全國普通高等學校招生統…

【ArcGIS錯誤異常100問】之001:License服務無法啟動權威解決辦法

測試環境: 操作系統:Windows10ArcGIS版本:10.X結果:通過測試 文章目錄1. 錯誤提示2. 問題分析3. 解決辦法3.1 關閉Windows Defender3.2 關閉系統防火墻3.3 刪除邁克菲(McAfee)殺毒軟件3.4 在系統服務中啟動…

Appium wait等待的三種方法

1、sleep()方法Thread.sleep(60000)強制等待60s2、隱式等待implicitlyWait()driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);全局等待30s不管元素是否已經加載1) 當使用了隱式等待執行測試的時候,如果WebDriver沒有在DOM中…

ASP.NET Core 技術內幕與項目實戰讀后感

前幾天拿到了楊中科老師的新書《ASP.NET Core 技術內幕與項目實戰》,迫不及待的“兩”口氣讀完了。用一句話來總結,這是一本寫給.NET開發者的非常實用的接地氣的好書,感覺有必要自發為這本書宣傳一波。楊老師在 .NET 開發者社區中的知名度非常…

avalon2學習教程15指令總結

avalon的指令在上一節已經全部介紹完畢,當然有的語焉不詳,如ms-js。本節主要總結我對這方面的思考與探索。 MVVM的成功很大一語分是來自于其指令,或叫綁定。讓操作視圖的功能交由形形式式的指令來代勞。VM,成了一個大管家。它只一…

【ArcGIS錯誤異常100問】之002:Error 000735 簡化容差:值是必需的(簡化線、簡化面工具)

測試環境: 操作系統:windows7ArcGIS版本:10.2結果:通過測試 文章目錄1. 錯誤提示2. 問題分析3. 解決辦法4. 問題驗證1. 錯誤提示 在ArcGIS中使用簡化面或者簡化線工具時,點擊確定會提示Error 000735:簡化容…

mybatis中mysql轉義講解

本文為博主原創,未經允許不得轉載: 在mybatis中寫sql的時候,遇到特殊字符在加載解析的時候,會進行轉義,所以在mybatis中 寫sql語句的時候,遇到特殊字符進行轉義處理。 需要注意的是,轉義的字符為…

用Python執行js文件代碼并獲取返回結果

js代碼(myjs.js): /** Title: This is a file for ……* Author: JackieZheng* Date: 2022-04-12 09:24:13* LastEditTime: 2022-04-12 09:40:55* LastEditors: Please set LastEditors* Description:* FilePath: myjs.js*/function hello(…

.NET桌面開發的一些思考

在22日,我在公眾號上發布了一條短文字,內容如下:其實在.NET開發大軍中,還有一股力量,那就是桌面程序的開發者們。他們很少發聲,可能技術成熟,可能太企業化了,也可能我沒關注到。最近…

【ArcGIS錯誤異常100問】之003:屬性表中文亂碼解決辦法總結

測試環境: 操作系統:windows7ArcGIS版本:10.X、Pro結果:通過測試 文章目錄1. 錯誤提示2. 原因分析3. 解決方法4. 問題驗證1. 錯誤提示 如圖所示,安裝完ArcGIS Pro后,由于計算機系統和應用軟件字符編碼的問…