[小菜一碟] 談談物件導向設計原則中 DIP(依賴反轉原則)中的 Dependency(依賴)

DIP - Dependency Inversion Principle(依賴反轉原則)說:

  1. 高層次的模組不應該依賴於低層次的模組,兩者都應該依賴於抽象介面。
  2. 抽象介面不應該依賴於具體實現。而具體實現則應該依賴於抽象介面。

如果是初次接觸到這段說明的朋友可能會有一個感覺,就是裡面每個字都看得懂,但是它在講什麼?要了解 DIP 要先清楚它這邊提到的依賴是什麼?我就以我個人的理解來分享我的心得。

我直接以程式碼為範例,讓我所理解的依賴再具體一點,這兩行 Code 你我應該都很熟悉,這是一段建立 SQL Server 連線具體實例並開啟連線的程式碼。

var conn = new SqlConnection(ConnectionString);

conn.Open();

我們已經知道 conn 的型別會是 SqlConnection,那我們再把視野拉寬一點會看到,建立 SQL Server 連線具體實例並開啟連線的這段程式碼是被放在 Program 類別的 Main 方法中,而 Open() 方法是從 SqlConnection 具體類別當中參考而來的,因此這件事我們就可以說「Program 類別依賴了 SqlConnection 類別」。

internal class Program
{
    private static readonly string ConnectionString = "...";

    private static void Main(string[] args)
    {
        var conn = new SqlConnection(ConnectionString);

        conn.Open();
    }
}

另一種依賴也是我們常見的叫做「繼承」,繼承也是一種依賴,下面這段程式碼 CustomDictionary 類別繼承自 Dictionary<string, string>,我們就可以說「CustomDictionary 類別依賴 Dictionary<string, string>」。

internal class CustomDictionary : Dictionary<string, string>
{
}

依賴無所不在,到處都是依賴,DIP 跟我們說要反轉它,下一篇再來談 Inversion(反轉)這篇先談依賴。

參考資料

相關資源

C# 指南
ASP.NET 教學
ASP.NET MVC 指引
Azure SQL Database 教學
SQL Server 教學
Xamarin.Forms 教學