Skip to main content

Command Palette

Search for a command to run...

知識閱讀 - 物件導向程式設計不是我所想的那樣

Object-Oriented Programming is not what I thought - Talk by Anjana Vakil

Published
知識閱讀 - 物件導向程式設計不是我所想的那樣

此篇完全是個人理解和想法,歡迎討論。

這影片真的很棒,對於 Object-Oriented Programming 給了一個從未有過的觀點和概念。如果可以個人強烈推薦點進這影片來看。

講者在影片中提出了以下五個她對於 OOP 的概念上的轉換

  1. biological metaphors:
    • What I thought: inheritance & taxonomy
    • What it is: cells & organs
  2. big ideas:
    • What I thought: objects & classes
    • What it is: messaging & late-binding
  3. beings vs. behaviors:
    • What I thought:objects are nouns
    • What it is:
  4. boundaries:
    • What I thought:imperative, object-otd // functional
    • What it is:imperative // object-otd, functional
  5. belief structures:
    • What I thought:dogmatics restrictive
    • What it is:built for change(* or should be)

I'm sorry that I long ago coined the term "objects" for this topic because it gets many people to focus on the lesser idea. The big idea is "messaging". -- Alan Kay

Biological metaphors 生物學隱喻

  • What I thought: inheritance & taxonomy
  • What it is: cells & organs

講者之前認為 OOP 就是繼承和分類,著重的地方在於物件與物件之間的怎麼繼承怎麼去,後來才領悟 OOP 背後關鍵的概念其實是細胞和器官。講者這邊的比喻是,比較所謂的程序式程式設計和指令式程式設計,可以想像成是精密的發條齒輪機器,每個元件都至關重要,缺少了任何一個都會造成損壞。OOP 的話就像是細胞和器官一樣,每個細胞都不是重要的,組合再一起會成為一個器官或組織。但是每個細胞都會損壞、生病、死亡,而這些改變對於整體來說都是可容許的,這讓一切變得有更多的彈性。更具體的描述的話,可以想像一台電腦,在 Alan Kay 的想象中,電腦不是像精密齒輪機器,反而是許多更小程序的遞歸組合,而這些被稱為 Object

Big ideas 大概念

  • What I thought:objects & classes
  • What it is:objects are verbs

講者早前認為 OOP 的重要概念在於 Object 和 Class,畢竟 Object 就在 OOP 的命名上,應該就是至關重要的東西了吧,但是 Alan Kay 解答了真正 OOP 的大概念 -- Messaging。Messaging 就像是膠水,將 Object 這些細胞貼合在一起去溝通它們。重要的不是 Object,而是透過傳遞 Messaging 讓這些 Object 可以建造這些大型且彈性的系統。

以下是常見的 OOP 寫法:

thing.do(some, stuff)

轉換成 Messaging 的概念:

to: thing
subject: pretty please? :D
message: "do", some, stuff

截圖 2022-03-06 13.43.58.png

在這概念下,我們可以想像下其他的可能狀況

thing.do(some, stuff)
thing.do(other, stuff)
child.do(some, stuff)

我們其實就可以看作是傳遞訊息給 method,而這些 method 去決定到底要如何反應,這樣的概念相較有如精密機器的指令式系統所使用需要在編譯時就鎖定好的 early binding(static binding)。Late binding 提供了更高的彈性,可以容許更多樣的變化。而這樣的特性是更好的,因為我們都知道變化是必然的。

beings vs. behaviors 他是什麼 vs. 他做什麼

  • What I thought:objects are nouns
  • What it is:objects are verbs

重要的不是物件它看起來怎樣,它裡面有什麼,這個細胞裡面的小細胞有什麼。而是它對系統的其他部分做了什麼,它怎麼接收訊息和如何回傳訊息。所以重要的不是它們怎麼實現,而是它們彼此間怎麼溝通。

程式解說

class Friend:
    def __init__(self, friends):
        self.friends = friends

    def is_friend_of(self, name):
        return name in self.friends

buddy = Friend(['alan', 'alonzo'])
buddy.is_friend_of('guy') => False

以上這段程式,我們重要的是當我們跟 buddy 傳送訊息 is_friend_of guy。同樣的概念下,以下的寫法我們其實都可以看作是一樣的。

buddy.is_friend_of('guy')
buddy.send(:is_friend_of, 'guy')
buddy('is_friend_of', 'guy')

最後我們可以看到我們甚至可以把這一切都看作是一個簡單的函數

def Friend(friend_names):
    my_friends = friend_names

    def is_my_friend(name):
        return name in friend_names

    def responder(method_name, *args):
        if method_name == 'is_friend_of':
            return is_my_friend(*args)

    return responder

buddy = Friend(['alan', 'alonzo'])
buddy('is_friend_of', 'guy') => False

boundaries 邊界

  • What I thought:imperative, object-otd // functional
  • What it is:imperative // object-otd, functional

這邊主要講的是對於 OOP 與其他規範的認知邊界。過去講者認為可以把 OOP 看作是一種特別的指令式程式設計,因為兩者都有狀態,而與 functional programming 有區別。因為常見的會說 OOP 是有狀態的,而 functional programming 是無狀態的。但是把 Messaging 看為重點後,覺得 OOP 比起 imperative 反而是更接近 functional。

這邊講者有提出一下程式的範例講解,歡迎到影片去看(對我有點懶)

belief structures 概念結構

  • What I thought:dogmatics restrictive
  • What it is:built for change(* or should be)

以前講者認為 OOP 有相當多的限制和教條,就是所有的一切都需要是個 object 都需要使用 classinterface等。但是有了新的概念後,講者開始在 Java 寫一些所謂的 "非 OOP 程式碼"。

講者在這邊認為在開發上,應該更專注地在於彼此怎麼傳遞訊息,而不是過去所謂的 OOP 寫法,這樣更可以建造可以接受變化富有彈性的系統。

閱後想法

這些觀點真的是給我了另一個層面的想法,過去真的覺得 OOP 就是所謂的 Class、interface、inheritable 等。轉換成 Messaging 的概念,也讓我想到 Machine Learning 在做的就是這樣的概念吧,把每個神經元看作就是一個 cell 一個 object,重要的是資料的傳遞。還有現在所謂的分散式系統架構,Service 之間 API 怎麼互相的傳遞。生物真的就是一個完美的系統,多少的概念從生物上找到其概念和解決方法。

學習從生活中發現。

Reference

More from this blog

如何開始入門軟體工程領域 - 名詞解釋(長期更新)

現在應該開始有很多人想要踏入軟體工程的領域,但在進入這個領域之前,覺得先了解一些名詞,可以在入門時更有方向也更知道要用什麼關鍵字去找尋有用的資訊。這篇文章就是想要幫助想要入門的人理解一些軟體工程裡的專有名詞。 作業系統 這一區塊主要解釋跟作業系統層面相關的名詞 英文中文解釋 Operation system 簡稱 OS | 作業系統 | 就是電腦的作業系統,是三大作業系統分別是:Linux、Windows、macOS | | Linux | | 自由和開放原始碼的 UNI...

May 10, 2023

我的 MacBook Pro (Apple Silicon) 設定

現在開始因為 ChatGPT 的出現,各種 AI 助手的功能都跑出來了。想想自己用了許久的環境設定也應該要來重新審視和建立新的開發環境了,僅此紀錄我個人的環境配置步驟和設定。 環境前置步驟 還原 MacBook Pro 至全新環境 macOS(全部資料刪除) 設定好初始設定後,登入 Apple ID 進入 App Store 確定 macOS 版本和預設 APP 都更新到最新 macOS 版本 到系統設定調整所有設定至個人習慣的設定 三指拖移 觸控板手勢開啟 防火牆開啟 輸入法設定...

Apr 25, 2023

ChatGPT 下的發展預想

從 ChatGPT 問世到現在,有許許多多的文章和討論出來。先從最早的 Google 要完蛋了,到後來的工作要被取代了,工程師失業了。 我就比較沒有想要馬上出來評論一下,我喜歡讓子彈飛一會兒。跟討論一下我自己比較在意的討論點。 Google 為什麼慢了? 結論:因為他需要更小心 很多人說 Google 怎麼被微軟搶先了一步。剛開始 Bing 說要加上 AI 的時候大家都在說 Google 怎麼慢了。我就馬上跑去看 OpenAI 的網站,靠北呀啊就 Azure 贊助的。那當然在正式上線 ChatG...

Mar 23, 2023

不工程的攻城獅

223 posts

I am not a programmer because I am not good at programming. But I do programming. Love to learn new things. An animal lover and a dancer. My oshi is 潤羽るしあ.