資料型態 (Data Type)
Def:
A data type is a collection of objects and a set of operations that act on those objects。
資料型態,是一組 物件 (objects),及作用於這些物件的 操作 (operations) 集合。
例如:
int 是一 Data Type
Data Objects 是由語言規格定義的有限整數值集合;正負號與 0~9 是人類常用的十進位文字表示,不是 int 物件本身
Operations + – * / = > < ≥ ≤ …
抽象資料型態 (Abstract Data Type, ADT)
抽象資料型態,是一種組織過的資料型態,
提供 『物件 (objects)』 與 『作用於這些物件的 操作 (operations)』的 規範,
而非 實際表示法 與 具體實現 的方式。
操作規範 (The specification of the operation)
基本上,包含了:
- 函式名稱 (Function Name)
- 參數型態 (The type of its argument)
- 結果型態 (The type of its result)
- 函式功能的描述 (不必說明內部表示法或實作細節)
ADT 是 Implementation-Independent。
ADT 規範每個操作 要做什麼 (what),而非 如何做 (how)。
在物件導向程式中,ADT 可以用 介面 (interface) 來表示,
介面通常可表達 ADT 的操作集合;但完整規格還可能包含前置條件、不變量與錯誤語意,不能只看介面名稱。
C 語言沒有 interface 關鍵字,仍可用 opaque struct、header 與函式建立資料型態的抽象邊界。

優點
使用 ADT 的好處是,使用者僅需操作其所提供的函式。
如 依賴倒置原則 (Dependency Inversion Principle, DIP) 所述:
介面的中心思想是: "封裝隔離",
也就是外部類別只需要呼叫介面提供的方法,不用也不需要知道內部如何實作。
依據『介面導向程式設計』,善用介面的好處,使得系統具有高維護性與彈性,
不論是擴充或重構,外部呼叫類別僅會受到最小幅度的影響 (甚至不受影響)。
舉例
Stack 堆疊的 ADT 描述(以下採用有容量上限的 bounded stack 變體):
Data Objects: 一個含有零個或多個元素的有限有序串列。
Operations,[回傳型態] [操作名稱] ::= [規格內容]:
- Stack Create(n) ::= 建立一個容量為 n 的空 Stack 並回傳,其中 n 為非負整數
- Boolean IsFull(stack) ::= 回傳堆疊是否已滿
- Boolean IsEmpty(stack) ::= 回傳堆疊是否為空
- Void Push(stack, item) ::= 若堆疊未滿,插入元素 item 至堆疊頂端;滿時的行為(例如回報錯誤、丟出例外或擴容)必須由規格明定
- Element Pop (stack) ::= 若堆疊非空,移除並回傳堆疊頂端的元素;空堆疊時的行為同樣要由規格明定
每種語言 (或每個人) 對 ADT 的描述不盡相同,
以上僅為 Stack 的常見 ADT 之一。
例如有些會補充:
Integer Size() ::= 回傳此堆疊中,元素的個數。
Element Top() ::= 回傳堆疊頂端的元素,但是不移除
總結
在資料結構設計上,
應用抽象化 (Abstraction),引出了 抽象資料型態 (Abstract Data Type, ADT) 的概念,
運用 ADT 的觀點,可以更精確的 (mathematical) 了解資結。
範例原始檔
在〈抽象資料型態 (Abstract Data Type, ADT)〉中有 2 則留言
很淺顯易懂的說明,謝謝!
很易懂的介紹,非常感謝