iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 8
1
Software Development

保持前進、持續優化程式碼內涵系列 第 8

08. 物件導向的特性—封裝、繼承、多型、抽象(撰寫中)

提到物件導向設計(Object-Oriented Programming, OOP),一定會提到它的三大特性,分別是封裝繼承多型。此外,還有一個東西,筆者覺得很重要,在實務經常使用,所以一定要特別拿出來討論的就是抽象

為了產出這篇文章,筆者想了很久,抽象到底是要放到三大特性之中那一個特性呢?如果看倌們去 google 「OO 三大特性」,一定可以找到很多的資料,在這些資料中,有些文章將抽象放到封裝繼承之中。有些資料則是單獨拿出來說明。

筆者本身比較傾向後者,將抽象視為一個特性,因為封裝繼承兩個特性,都可以配合抽象一同使用。

1. 看故事,懂 OO。

常常看到說明物件導向的例子,是使用車子啊、動物啊。筆者來挑戰不一樣的做法,讓我們看故事,懂 OO。

小陳是個超級業務,經常代表公司跟各種客戶周旋。他總是帶著笑臉,面對客戶們各種千奇百怪的要求,總是能夠在公司角度與客戶角度之間,取得平衡點,成功獲得客戶的訂單。
同事們跟他請教成功取得訂單的訣竅,雖然他不吝指教同仁的疑惑,但有些事卻也是輕輕的帶過。
私底下,對於客戶與公司的種種要求,也是有著滿肚子的苦水,這時,他的妻子就是最好的聽眾,總是靜靜聆聽他的訴苦。
十多年過去了,小陳的兒子也出社會,成為一個業務。在小小陳遇到業務的問題,小陳總是站在後面給他最大的支援,提供自己多年的業務經驗。

1.1 封裝(Encapsulation)

朕賜給你的,才是你的﹐朕不給﹐你不能搶。

筆者覺得出上面這句話,真的滿貼切封裝特性。

封裝,就是把想要表現在他人面前的,才表現出來(Public)。不想要讓別人知道的,就通通藏起來(Private, Protected)。

這樣說有點抽象,我們來分析一下上面的故事,學封裝的概念吧。

Public

小陳是個超級業務,經常代表公司跟各種客戶周旋。他總是帶著笑臉,面對客戶們各種千奇百怪的要求,總是能夠在公司角度與客戶角度之間,取得平衡點,成功獲得客戶的訂單。

對業務而言,與客戶溝通、送出估價單、取得訂單,這三個動作就是必要,且公開的行為。

我們把業務視為一個物件時,對客戶這個外部元件而言,業務物件必需提供溝通、取得估價單、下訂單 的功能。

public class 業務
{
    public void 溝通(...);
    public object 取得估價單();
    public void 下訂單(...);
}

而小陳是個業務,所以業務必需會的,小陳必需也要會。

public class 小陳 : 業務
{
    public void 溝通(...);
    public object 取得估價單();
    public void 下訂單(...);
}

同事們跟他請教成功取得訂單的訣竅,雖然他不吝指教同仁的疑惑,但有些事卻也是輕輕的帶過。

對於指點同事的疑惑。是小陳個人跟同事的公開行為。所以……

public class 小陳 : 業務
{
    public void   溝通(...);
    public object 取得估價單();
    public void   下訂單(...);

    public object 指點同事(...);
}

private

私底下,對於客戶與公司的種種要求,也是有著滿肚子的苦水,這時,他的妻子就是最好的聽眾,總是靜靜聆聽他的訴苦。

因為小陳肚子內的苦水,不可能對客戶或公司內部同事公開,所以這是小陳自己的私下的事情。

public class 小陳 : 業務
{
    public void   溝通(...);
    public object 取得估價單();
    public void   下訂單(...);

    public object 指點同事(...);
    
    private object 吐苦水();
}

1.2 繼承(Inheritance)

十多年過去了,小陳的兒子也出社會,成為一個業務。在小小陳遇到業務的問題,小陳總是站在後面給他最大的支援,提供自己多年的業務經驗。

待補上

1.3 多型(Polymorphism)

同事們跟他請教成功取得訂單的訣竅,雖然他不吝指教同仁的疑惑,但有些事卻也是輕輕的帶過。

待補上

1.4 抽象(Abstraction)

待補上

2.後言

待補上

3. 推薦

3.1 文章分享


上一篇
07. 持續優化碼概念篇回顧
下一篇
09. 物件導向設計原則—SOLID
系列文
保持前進、持續優化程式碼內涵24
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0

很生動的說明 ,期待後續文

我要留言

立即登入留言