型別 = 一組操作。ADT = 操作集合 + 具體實作。設計 ADT 時,先問「能用這物件做什麼?」而非「如何實作?」。
若問題域涉及員工、合約、薪資單,解決域應直接對應 Employee、Contract、PayrollRecord 型別。這樣問題域↔解決域雙向轉換無「轉換噪音」,程式碼更簡潔、精確。
通用語言無法內建業務型別,但 C++ 給予建構複雜 ADT 的便利設施(類別、模板、運算子多載、RAII)。本質上:ADT 將程式語言延伸至特定問題域。
Employee 而非 EmpRec)。難以命名 = 理解不清,需再思考。| 原則 | 錯誤示範 | 正確示範 |
|---|---|---|
| 語意清晰 | void set(int x, int y); | void moveTo(Point p); |
| 防呆 | void deleteUser(int id); | bool tryDeleteUser(UserId id); |
| 最小驚訝 | operator+ 修改左運算元 | operator+ 回傳新物件 |
| RAII | 手動 init()/cleanup() | 建構子獲取資源,解構子釋放 |
資料抽象是 C++ 核心價值所在。優秀的 ADT 讓業務邏輯直觀表達,將複雜性封裝在介面之後。掌握「命名→操作→介面→實作」流程,是從寫代碼進化為做工程的關鍵一步。