iT邦幫忙

DAY 12
5

軟體路上不孤單,給我SSD,學習之路狂飆系列 第 12

軟體路上不孤單Day12-物件導向原則介紹5[ISP]

如果介面放太多無關的資訊,就像是被污染一樣,很容易出問題的。
目前在寫程式這方面,大部分使用的都是物件導向(Object Oriented),在連續介紹了四個原則之後,今天在介紹的是第五個-ISP(Interface Segregation Principle) 介面分割原則。雖然這些原則感覺很枯燥,不過忍耐一下,這些原則如果看過了之後,多少都會在心裡有個底。對於程式開發也一定會有幫助的!

所謂的介面分離原則就是:『用戶不應該被迫相依於他們用不到的函示』

其實這個我昨天提到的Liskov替換原則有點相近,如果我實做的介面有三個函示,而我只實做了兩個,另一個我根本不能用或者是不要用。那這時候就違反了這個ISP(介面分割原則),此時我這個類別也等於無法相容於基礎類別,那又違反了Liskov替換原則了。

所以寧願多用幾個介面,也不要將很多個方式全部放到一個介面當中讓來實做的類別誤用,污染了這個介面。

來看一下這個範例:

interface I工人介面 {
    public void 吃飯();
    public void 工作();
}

class 工人 : I工人介面 {
    public void 工作() {
        Console.WriteLine("工作~工作~");
    }

    public void 吃飯() {
        Console.WriteLine("吃飯休息囉~");
    }
}

class 超級賽亞工人 : I工人介面 {
    public void 工作() {
        Console.WriteLine("工作*3~工作*3~");
    }

    public void 吃飯() {
        Console.WriteLine("吃飯休息囉~");
    }
}

class 總管 {
    I工人介面 工人;

    public void 安排工人(I工人介面 被安排的工人) {
        工人 = 被安排的工人;
    }

    public void 開始工作() {
        工人.工作();
    }
}

看起來好像沒什麼問題吧!但是,如果我的工人裡有機器人呢?那怎麼辦?如果讓機器人直接實做I工人介面,那機器人就會被強迫實做「吃飯()」這個函示,這時候鐵定是行不通的。讓我們將程式碼修改如下:

interface I可以吃{
    public void 吃飯();
}

interface I可以工作{
    public void 工作();
}

class 工人 : I可以吃, I可以工作 {
    public void 工作() {
        Console.WriteLine("工作~工作~");
    }

    public void 吃飯() {
        Console.WriteLine("吃飯休息囉~");
    }
}

class 超級賽亞工人 : I可以吃, I可以工作 {
    public void 工作() {
        Console.WriteLine("工作*3~工作*3~");
    }

    public void 吃飯() {
        Console.WriteLine("吃飯休息囉~");
    }
}

class 機器人 : I可以工作 {
    public void 工作() {
        Console.WriteLine("工作*3~工作*3~");
    }
}

class 總管 {
    I可以工作 工人;

    public void 安排工人(I可以工作 被安排的工人) {
        工人 = 被安排的工人;
    }

    public void 開始工作() {
        工人.工作();
    }
}

看到了嗎?我將工人的介面拆成「可以吃()」和「可以工作()」這兩個介面。這樣一來機器人只要實做可以工作就好了,也就不會違反ISP(介面分割原則)了。

後記:
這幾天在寫文章的時候發覺,用中文寫真的好不習慣喔。感覺滿怪的!大家覺得這樣可讀性真的有比較好嗎?

文章導覽
全系列
上一篇
下一篇


上一篇
軟體路上不孤單Day11-物件導向原則介紹4[LSP]
下一篇
軟體路上不孤單Day13-物件導向原則介紹6[LoD]
系列文
軟體路上不孤單,給我SSD,學習之路狂飆31
0
Albert
iT邦高手 1 級 ‧ 2012-10-05 22:26:50

拜託你麼幫幫忙。。。。。

怎麼都是教學的片斷例子。。。。。

看更多先前的回應...收起先前的回應...
ted99tw iT邦高手 1 級‧ 2012-10-05 22:54:50 檢舉

不是有邦友要阿伯分享什麼亞當皮爾嗎?相信不少邦友也都想知道這個阿伯一直在推的東西,而不是每次都只看到片斷的....我們是台灣最大的!@#$%

kradark iT邦好手 1 級‧ 2012-10-05 23:04:13 檢舉

若都寫出來了
顧問費怎麼收???

Albert iT邦高手 1 級‧ 2012-10-05 23:07:08 檢舉

寫這些 OpenSource Adempiere 都有實作 不收費 你放心好了

pajace2001 iT邦研究生 1 級‧ 2012-10-06 02:29:07 檢舉

請問所謂的片段是指什麼啊~~
另外,亞當皮爾又是什麼??
阿伯又是誰呢??
我糊塗了~~怎麼都看不懂失神

0
ted99tw
iT邦高手 1 級 ‧ 2012-10-05 22:51:33

pajace2001提到:
大家覺得這樣可讀性真的有比較好嗎?

我覺得重點不是中文或英文,而是樓主對主題有沒有體會,能不能用自己的話來說....以此篇與前幾篇來說,很明顯的樓主很清楚所分享的內容,所以咱一定要按推才行。

至於分享的內容,不管是偏觀念或偏實作,都很好,但一次不要太多,像此篇長度剛好,若能更短些更讚啦!!
讚讚讚

0
pajace2001
iT邦研究生 1 級 ‧ 2012-10-06 02:30:15

謝謝前輩的鼓勵GOGOGO臉紅

我要留言

立即登入留言