DIP - Dependency Inversion Principle(依賴反轉原則)說:
- 高層次的模組不應該
依賴
於低層次的模組,兩者都應該依賴
於抽象介面。 - 抽象介面不應該
依賴
於具體實現。而具體實現則應該依賴
於抽象介面。
如果是初次接觸到這段說明的朋友可能會有一個感覺,就是裡面每個字都看得懂,但是它在講什麼?要了解 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(反轉)這篇先談依賴。