OOP - 2 什麼是物件導向程式設計


Posted by tsungtingdu on 2021-09-17

什麼是物件導向程式設計?

物件導向程式設計 (Object-oriented programming) 是眾多程式設計典範 (Programming paradigms) 當中的其中一種。

什麼是典範?

「典範」的概念來自於孔恩科學革命的結構一書,其原本的意義是指

在一研究社群裡,為各個會員分子所認同接受的整體性信念、價值和研究方法

而根據【跨科際閱讀】 典範 (Paradigm) 的解釋

廣義地說,它代表一個科學社群整體的理論、信念、價值、方法、目標、專業與教育結構

「典範」來自科學研究上,如果來到了程式設計的領域,簡單來說「典範」就是一群人所相信的理論、價值與方法。

所以「典範」不是標準答案,也不是唯一的真理。因為不同群的人,就會有不同對於程式設計的理論、價值、方法。

還有其他哪些程式設計典範?

除了物件導向程式設計之外,另外常聽到的是函式程式設計 (Functional programming),而這兩者又分別隸屬於程式設計典範的兩大類:

  • 函式程式設計 -> 宣告式程式設計 (Declarative programming)
  • 物件導向程式設計 -> 指令式程式設計(Imperative programming)

在宣告式和指令式之外,還有

  • 語言導向程式設計(Language-Oriented programming)
  • 元程式設計 (Metaprogramming)
  • 事件驅動程式設計 (Event-driven programming)
  • 資料驅動程式設計 (Data-driven programming)
  • ...

等等。

不過要注意的是,這些典範並非互斥 (譬如使用了 A 就不能用 B),而是針對相同、或不同問題而產生出來的解決方法。

同時,沒有絕對優勢的設計典範,也並非某種問題只能依賴某種典範來解決,面對一個問題的時候,只有相對優勢的方法 (甚至沒有優勢的方法,只能期待未來有人針對該問題發展出新的方法),就看當下我們想要採用哪種方式來解決問題。

關於常見的宣告式程式設計和指令式程式設計的比較,可以參考這篇文章的介紹。

所以到底什麼是物件導向程式設計?

回過頭來,我們來看看物件導向程式設計究竟是個什麼樣的設計典範。

The basic idea of OOP is that we use objects to model real world things that we want to represent inside our programs, and/or provide a simple way to access functionality that would otherwise be hard or impossible to make use of.

Objects can contain related data and code, which represent information about the thing you are trying to model, and functionality or behavior that you want it to have.

根據 MDN 的解釋,物件導向程式設計的基本概念是「透過物件 (object) 來模擬真實世界的事物」,並提供方法來操作它。

物件本身包含了「資料」和「方法」,如果以真實世界的事物來說,「資料」就是事物的特質、資訊或屬性,而「方法」就是該事物與其他事物互動的方式。

譬如這裡有個物件叫做大谷翔平,他的資料可能就包含

  • 出生年:1994 年
  • 身高:193 公分
  • 年薪:3百萬美金
  • ...

他與世界互動的方法可能就包含

  • 打擊
  • 投球
  • 笑死
  • ...

可以看到資料以「屬性」和「值」的方式配對出現。另外一提的是,在真實世界中,「值」通常帶有單位,才能展現其真實意義。如果只說

  • 年薪:300萬

可能就不知道是 300萬新台幣還是美金。然而在程式設計的過程中,單位有時候不見得這麼「外顯」,所以需要特別留意。

物件導向程式設計的概念與特徵

很快提一下在物件導向程式設計當中,常常會提到的概念與特徵,像是

  • 概念:類別、介面
  • 特徵:封裝、抽象、繼承、多型

會在後續的文章中陸續介紹。

最後,為什麼是物件導向程式設計?

最後,回過頭來看,為什麼要討論「物件導向程式設計」?

剛剛有提到,其實一路以來有許多的程式設計典範,來協助我們處理各種問題。雖然每個典範都有他的優缺點與適用性,不過「物件導向程式設計」還是被廣為使用和討論,因為它在面對真實世界複雜問題的時候,擁有較好的

  • 維護性 - 不會因為新的需求出現,而影響到其他的程式碼的既有功能
  • 擴展性 - 不會因為新的需求出現,而需要大幅修改原有的程式碼
  • 重複使用性 - 避免不必要重複的程式碼出現

在需求快速變動的現在,物件導向程式設計成為許多人解決問題的利器。

當然它也是有缺點的,像是程式碼的 size 相對較大,以及需要投入較多的時間與心力來建構它。


最後,來分享以前看過的影片 4 Programming Paradigms In 40 Minutes

Yes


鐵人賽發表網址:幫自己搞懂物件導向和設計模式


#OOP #Object-oriented programming #TypeScript #2021-ironman







Related Posts

Vue3 起手式

Vue3 起手式

權限-Token-加密

權限-Token-加密

Git error -> fatal: the remote end hung up unexpectedly

Git error -> fatal: the remote end hung up unexpectedly


Comments