前言
這篇開始前可以先搭配前面的介面、內聚、耦合一同觀看。
- 1、Object Oriented物件導向-4:抽象類別(Abstract)與介面(Interface)
- 2、Object Oriented物件導向-5:內聚(Cohesion)、耦合(Coupling)
本文
介面隔離原則 Interface Segregation Principle(ISP)
最重要的精神:
不應該強迫用戶去依賴他們未使用的方法。
意及應該要最小化類別與類別之間的介面。
基本原則:
- 1、interface 功能盡量少:達到一個介面只服務一個子模組/商業邏輯。 但有可能會與單一職責原則有衝突,比如已經拆成最仔細但功能還是很多,此時要以單一職責原則為優先。
- 2、不應該強迫實作沒用到的方法。
舉例:今天我們有個車子的設計圖,我們可以用來設計車子,於是我們創造了特斯拉以及 Gogoro。
public interface 車子
{
public string 引擎();
public string 後照鏡();
public string 車門();
}
public class 特斯拉 : 車子
{
public string 引擎()
{
return "3秒內時速100公里的引擎";
}
public string 後照鏡()
{
return "左右後視鏡+駕駛座後視鏡+電腦雷達感應周邊";
}
public string 車門()
{
return "側開敞篷車門";
}
}
public class Gogoro : 車子
{
public string 引擎()
{
return "5秒內時速100公里的引擎";
}
public string 後照鏡()
{
return "左右後視鏡";
}
public string 車門()
{
return "痾沒有車門";
}
}
private static void Main(string[] args)
{
var 特斯拉 = new 特斯拉();
Console.WriteLine($"特斯拉有 : {特斯拉.引擎()}");
Console.WriteLine($"特斯拉有 : {特斯拉.後照鏡()}");
Console.WriteLine($"特斯拉有 : {特斯拉.車門()}");
Console.WriteLine("=====================");
var gogoro = new Gogoro();
Console.WriteLine($"Gogoro有 : {gogoro.引擎()}");
Console.WriteLine($"Gogoro有 : {gogoro.後照鏡()}");
Console.WriteLine($"Gogoro有 : {gogoro.車門()}");
}
這時候會發現我們設計稿並不適用於 Gogoro,思考一下特斯拉與 Gogoro 的種類,一種為電動車、一種為電動機車,兩者的配件也不同不可互用;所以我們應該拆分兩種不同的設計稿,程式修改如下。
public interface 電動車
{
public string 電動車引擎();
public string 電動車後照鏡();
public string 電動車門();
}
public interface 電動機車
{
public string 電動機車引擎();
public string 電動機車後照鏡();
}
public class 特斯拉 : 電動車
{
public string 電動車引擎()
{
return "3秒內時速100公里的引擎";
}
public string 電動車後照鏡()
{
return "左右後視鏡+駕駛座後視鏡+電腦雷達感應周邊";
}
public string 電動車門()
{
return "側開敞篷車門";
}
}
public class Gogoro : 電動機車
{
public string 電動機車引擎()
{
return "5秒內時速100公里的引擎";
}
public string 電動機車後照鏡()
{
return "左右後視鏡";
}
}
private static void Main(string[] args)
{
var 特斯拉 = new 特斯拉();
Console.WriteLine($"特斯拉有 : {特斯拉.電動車引擎()}");
Console.WriteLine($"特斯拉有 : {特斯拉.電動車後照鏡()}");
Console.WriteLine($"特斯拉有 : {特斯拉.電動車門()}");
Console.WriteLine("=====================");
var gogoro = new Gogoro();
Console.WriteLine($"Gogoro有 : {gogoro.電動機車引擎()}");
Console.WriteLine($"Gogoro有 : {gogoro.電動機車後照鏡()}");
}