第 23 課以 C 語言實現隊列 ADT 為載體,證明抽象數據類型(ADT)非 OOP 專利。通過「循環數組」與「鏈表」兩種截然不同的實現對比同一接口,生動展示數據抽象的核心價值:接口穩定、實現可替換、開發時空分離、人員分離。並澄清 ADT 與數據結構、具體類型、OOP 類的關係。
| 概念 | 關注點 | 例子 |
|---|---|---|
| 數據結構 | 具體實現、組織效率 | 數組隊列、鏈表隊列、B 樹 |
| 抽象數據類型 (ADT) | 抽象接口、數學模型、契約 | Queue (FIFO)、Stack (LIFO)、Set、Map |
| 具體數據類型 | 數據存儲、透明字段、無行為邏輯 | Address (省/市/街道/郵編)、DTO/VO |
ADT = 接口(契約)+ 實現(隱藏)。具體類型 = 透明數據容器。
typedef char ItemType;
typedef struct QueueType* Queue;
int queue_initialize(Queue);
void queue_finalize(Queue);
int queue_add(Queue, ItemType);
int queue_remove(Queue, ItemType*);
int queue_empty(Queue);
int queue_length(Queue);
int queue_head(Queue, ItemType*);
用戶只見接口,不知 QueueType 內部結構——這就是數據抽象。
data[]、first、last、count、sizequeue_resize)、隨機訪問快、緩存友好head、tail、count + 節點 item、next客戶代碼完全相同,無感知切換實現。
class (引用類型/ADT) 與 struct (值類型/具體類型)
3. C++ class/struct 機制同,約定俗成前者做 ADT
4. Java 無值類型,全部 class;C 無類只有 struct
「抽象——接口與實現相分離;數據——以數據為中心組織邏輯;類型——單純而定義良好的概念。」
數據抽象是 OOP 的起源與核心。沒有 ADT 思維,封裝/繼承/多態皆成無本之木。設計「萬人迷」類的三要素:優雅外形(抽象)、豐富內涵(數據)、鮮明個性(類型)。