前言

這篇開始前可以先搭配前面的介面、內聚、耦合一同觀看。

本文

介面隔離原則 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.電動機車後照鏡()}");
        }

參考連結