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

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

這影片真的很棒，對於 Object-Oriented Programming 給了一個從未有過的觀點和概念。如果可以個人強烈推薦點進這[影片](https://youtu.be/TbP2B1ijWr8)來看。

講者在影片中提出了以下五個她對於 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](https://cdn.hashnode.com/res/hashnode/image/upload/v1646545448535/S0Z66To-n.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

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

```python
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')
```

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

```python
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 都需要使用 `class`、`interface`等。但是有了新的概念後，講者開始在 Java 寫一些所謂的 "非 OOP 程式碼"。

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


## 閱後想法

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

學習從生活中發現。

### Reference

- [物件導向程式設計](https://zh.wikipedia.org/wiki/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1)
- [指令式程式設計](https://zh.wikipedia.org/wiki/%E6%8C%87%E4%BB%A4%E5%BC%8F%E7%B7%A8%E7%A8%8B)
- [宣告式程式設計](https://zh.wikipedia.org/wiki/%E5%AE%A3%E5%91%8A%E5%BC%8F%E7%B7%A8%E7%A8%8B)
- [程序式程式設計](https://zh.wikipedia.org/wiki/%E8%BF%87%E7%A8%8B%E5%BC%8F%E7%BC%96%E7%A8%8B)
- [Late-Binding](https://en.wikipedia.org/wiki/Late_binding)
- [Alan Kay](https://zh.wikipedia.org/wiki/%E8%89%BE%E4%BC%A6%C2%B7%E5%87%AF)
- [早期和晚期繫結 (Visual Basic)](https://docs.microsoft.com/zh-tw/dotnet/visual-basic/programming-guide/language-features/early-late-binding/)
