[Swift] 物件導向程式設計 (Object-oriented Programming)

Roy Hsu
7 min readJun 21, 2018

--

Object-oriented Programming
小劇場

我想很多人在談到物件導向的時,都會像上面的小劇場一樣,用乏善可陳的口氣唸完從維基百科上面硬背的內容。

希望各位在看完這篇文章後,不會再講出這麼無聊的解釋。눈_눈 (眼神死

首先,假設在「沒有」物件導向的情況下,我們該怎麼用程式碼描述一隻 4 條腿,會喵喵叫的公貓呢?

OK,看起來還算直覺,但如果改用物件導向的方式描述呢?

例子中我們可以明顯看出,採用物件導向的方法不僅將邏輯依照功能及特性進行詳細的描述與歸類,還可以擁有良好的閱讀性與維護性。

另外我們還會搭配一些術語輔助,包含:

  • 被定義在物件內部的 Variable (變數) ,又稱為 Property (屬性),如: numberOfLegs 即為 Property。
  • 被定義在物件內部的 Function (方法) ,又稱為 Method (行為),如:makeSounds() 即為 Method。

但說穿了,這就只是在某些情境使用不同的代稱而已,不要用感到困惑。

就好比,在學校你會稱自己為國家未來的棟樑,但回到家會改稱米蟲是一樣的概念 (誤

Class (類別)

在物件導向裡面,我們會使用 Class 型別去描述事情 (Thing)

而 Class 經過 Initializer 產生出來的東西,我們稱之為物件 (Object)。

那既然談到了 Class,當然要探討一下它所具備的特性。

Reference Type (參考型別)

Class 屬於 Reference Type 的型別,在 Swift 裡面,只有 Class、 Subclass 與 Closure 是 Reference Type,其他的都是 Value Type。

Reference Type 是「不同指標,指向同一個實體」的概念, 很抽象對吧? 不懂沒關係,最起碼你要知道 Class 擁有這個性質。

我們會在別的章節再詳細介紹 Reference Type 和 Value Type 的差異,本篇文章重點還是放在物件導向。

Inheritance (繼承)

在上述程式碼中 ,因為 Lion 繼承自 Cat,我們會稱 Lion 是 Cat 的 Subclass,反過來說,Cat 則是 Lion 的 Superclass。

  • 好處:Subclass 因為自動獲得 Superclass 擁有的 Property 和 Method,可以大幅減化程式碼,但如果不滿意也可以部分 Override (覆寫) 掉,改用自已的實作。
  • 壞處:一旦繼承就沒辦法拔掉不想要的 Property 和 Method。

Polymorphism (多型)

多型的種類及應用相當廣泛,光維基百科上面就列出了 5 種,

  1. Ad hoc polymorphism
  2. Parametric polymorphism
  3. Subtyping
  4. Row polymorphism
  5. Polytypism

Parametric polymorphism 在 Swift 中,我們稱之為 Generic (泛型),但因為 Generic 已經複雜到可以獨立寫成一篇文章,這邊暫時不會介紹,我們打算專注在更常見的 Subtyping。

所謂的 Subtyping 就是利用 Subclass 共同的 Superclass 來實現多型。

直接看例子吧,假設我們定義一個 Animal 類別,並讓 Cat 和 Dog 分別繼承 Animal,再利用多型創造出同時可以存放 Cat,也可以存放 Dog 的陣列。

另一個常見的 Subtyping 應用是,我們可以將 Superclass Casting (轉型) 變回原始型別,最典型的例子莫過於 UITableViewDataSource 在tableView(:cellForRowAt:) 中,拿取客製化的 UITableViewCell。

好的,到這邊算是把最基礎部分介紹了一輪,希望有幫助各位更加理解物件導向的核心觀念。

最後我想再補充一點,實際上,Swift 是以 Protocol-oriented Programming 為核心設計的語言,各種 Value Type 因此強勢掘起,所以我們不會再強迫自己一定要使用 Class 去描述任何事情 (Thing),而是更傾向於 Struct 或 Enum。

例如:使用 Struct 來描述 City (城市) ,你會發現即使不用 Class 也可以達成類似的效果。

註:這僅限於 Swift,其他物件導向的語言還是比較常使用 Class。

註:當事情 (Thing) 不是用 Class 描述時,請不要稱其為物件 (Object),避免造成誤會。

// 錯誤的講法
(X): 我有一個 taipei 的 Object。
// 正確的講法
(O): 我有一個 taipei 的 Struct。

常見的迷思

Q1: 一定要會物件導向才能寫程式嗎?

A1: 當然不用,很多程式語言壓根就沒有物件導向的概念,例如:萬年經典的 C 語言。但我們還是推薦新手先學會物件導向比較好。

Q2: 你說 Swift 是 Protocol-oriented programming (POP) 的語言,那我還需要學 Object-oriented Programming (OOP) 嗎?

A2: Swift 雖然弱化了 OOP,但當我們需要 Reference Type 的特性時,Class 便會派上用場。所以建議新手先學會 Class,畢竟 POP 概念太新穎了,教學資源較少。

Q3: 你說 Struct, Enum 和 Class 都可以用來描述事情 (Thing),所以我到底該怎麼選?

A3: 你應該先考慮到底要描述什麼事情 (Thing),再來考慮用哪個型別,不要反過來思考得出錯誤的結論。當然也需要對 Struct, Enum 和 Class 都有足夠理解才能做出正確的判斷。建議新手先單純使用 Class 學習物件導向,等你融會貫通後 (一般來說要花個幾年),再來煩惱 Struct 或 Enum。

練習再練習

今天要將貓或狗形容成物件時,大家普遍都可以接受,因為我們曾經看過真實的貓和狗。

但如果我們跟你說:「UIViewController、UserManager …等等,全部也都是物件。」你可能就難以接受,因為這些東西是虛擬出來的。

在程式開發中,描述虛擬物件是很多新手無法駕馭物件導向的障礙之一。可以先從描述現實中存在的物件開始練習,再慢慢進階到描述虛擬物件。

下面我們準備了一些練習讓各位挑戰看看,請在文章的留言區貼上你的 Gist 答案與大家交流 🤓

Q1. 請描述一本書,包含它的標題、封面圖、作者、語言、出版社等資訊。(現實中有的物件)

Q2. 請描述如何為一本書按讚的行為。(虛擬的物件)

覺得實用不彷替這篇文章拍拍手,或是分享文章連結到 Facebook、Twitter 給身邊同樣在學習程式的朋友 ~

我們會定期在 Facebook 粉絲頁 分享許多 Swift 相關資訊,可以按讚追蹤我們哦!

如果看完上述的文章,在實行時感到學習困難,你可以考慮來參加我們的 Swift 課程。

此外,我們也提供免費的諮詢服務,舉凡課程細節、個人學習規劃、未來的就職可能性及待遇,我們很樂意為您提供一個明確方向與建議,不會強迫參加課程。

更多詳細資訊可以到我們的官網瞧瞧,

課程傳送門在此:http://bit.ly/2MGmPGu

參考資料

--

--

Roy Hsu

不斷追求美麗的事物是我人生的價值。 從事 iOS App 開發、App UI / UX 設計。 興趣是手繪和籃球。 蘋果迷。https://www.facebook.com/tinyworld.cc/