OOP - 6 關於抽象


Posted by tsungtingdu on 2021-09-22

前面分別聊完了什麼是「物件」、「類別」、「介面」,接下來,就要來聊聊物件導向程式設計當中的四大概念:「抽象」、「封裝」、「繼承」、「多型」

什麼是抽象

In software engineering and computer science, abstraction is:

  • the process of removing physical, spatial, or temporal details or attributes in the study of objects or systems to focus attention on details of greater importance; it is similar in nature to the process of generalization;
  • the creation of abstract concept-objects by mirroring common features or attributes of various non-abstract objects or systems of study – the result of the process of abstraction.

在軟體工程和電腦科學中,廣義來說「抽象」代表

  • 一種移除物件或系統細節、專注在真正重要的事情上的過程。像是一種歸納的過程
  • 一種為實際物件建立「映射(相對應)的概念」的過程

關於「歸納」和「建立概念」這兩件事情,其實我們在日常生活中就已經常常使用到。

舉例來說,當我們將「可以被握在手中、盛裝食物或飲料的東西」歸納起來,並建立一個叫做「杯子」的概念。之後當我們談到杯子的時候,就會知道杯子是什麼、可以做什麼。

另一方面,當我們看到一個從來沒有看過,但同樣可以被握在手中、盛裝食物或飲料的東西,就會將它歸類在「杯子」這個概念之中。

In object-oriented programming theory, abstraction involves the facility to define objects that represent abstract "actors" that can perform work, report on and change their state, and "communicate" with other objects in the system.

在物件導向程式設計當中,「抽象」代表一種能力,一種可以定義物件的抽象角色,以及這個抽象角色所可以完成的工作、改變狀態、與其他物件溝通的能力。

如果以實際的例子來看,我們將全世界的生物依據「界門綱目科屬種」的方法來分類,就是一種抽象。當我們提到「靈長目」的時候,它並不是一個實際的動物或個體,它只是一種「描述」,描述在這個分類之下的所有動物,具備什麼樣的特徵或能力。

先前提到的「抽象類別」和「介面」也是抽象的一種。它們自己本身不是一個實際的物件,也無法產生實例,它們只是一種「描述」,描述實際執行 (extends or implements) 它們的物件,具備什麼樣的屬性或方法。

為什麼要抽象

看到這裡,就會發現先前所提到的「抽象類別」或「介面」,其實就是實現「抽象」的方式。

而實現抽象的好處是什麼呢?由於抽象提取了概念、移除(或隱藏)實作細節,只關注在重要的部分,讓我們更有能力去面對眾多的事物。

譬如我們開始為事物分類,分類的方式本身就「抽取」不同事物共同的特性,然後將它們歸類成同類。接者,我們繼續在不同的類別當中尋找相同的特性,「抽取」出來成為 parent 類別。就像是科學家用「界門綱目科屬種」整理世界千千萬萬種生物。

抽取共同特性、將事物分類整理完之後可以做什麼呢?接下來我們就可以很容易進行溝通。

譬如我們在討論杯子的時候,可以直接根據杯子這個「概念」進行討論,不需要特別針對某一個實際存在的杯子來討論。當你跟朋友說「我早上用杯子喝了一杯咖啡」,你的朋友不需要知道你實際用的杯子的顏色、大小、重量,而會直接知道那是一個可以盛裝液體的容器。所以當我們使用杯子這個概念時,就已經在

  • 隱藏細節(顏色、大小、重量等)
  • 專注在重點(可以盛裝液體的容器)

另一方面,有了抽象概念之後,我們就很容易可以進行延伸。譬如發明一個全新材質的杯子 (延伸使用杯子的概念),或是討論晚餐餐具的組合 (討論杯子的 parent 類別與其 child 類別) 等等。

抽象與物件導向

所以回到物件導向程式設計上,我們要用物件來模擬世界上的事物,但我們無法完整模擬所有存在的事物,因此需要抽象概念,來幫助我們快速建構、模擬世界運作的方式。並且「隔離其他不重要的事情,只專注在重要的事物上」。

抽象可以說是物件導向程式設計的開始。


最後,來看看 CS50 的 Professor David J. Malan 怎麼解釋抽象這件事情

Yes


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


#OOP #Object-oriented programming #2021-ironman







Related Posts

MTR04_0625

MTR04_0625

Valid Parentheses

Valid Parentheses

[Week2] - JavaScript :邏輯 & 位元運算子

[Week2] - JavaScript :邏輯 & 位元運算子


Comments