「不同層次、不同抽象」的另一個應用:類別的介面通常應與其實作不同。
若兩者抽象相似 → 類別不夠深。
反例:行導向的文字 API#
第 6 章的編輯器專案,多數團隊把文字內部以「行」為單位儲存(每行獨立保存)。
問題是:他們把 API 也設計成行導向:
getLine(...)
putLine(...)這讓 UI 程式碼很難寫:
- UI 常見操作是「在一行中間插入文字」、「跨越多行刪除一段」
- 行導向 API 強迫呼叫端自己拆行、合行
- 這段邏輯既不簡單,又會散布在 UI 各處
改善:字元導向的 API#
把介面改成字元導向:
insert(position, string) // 任意位置插入字串(可含換行)
delete(start, end) // 任意位置範圍刪除- 內部仍以「行」儲存
- 拆行 / 合行的複雜度封裝在文字類別內
- 文字類別變得更深,UI 程式碼變得更簡單
設計判準#
介面與實作之間的差異 = 類別提供的價值。
介面與內部表示越「不同」,類別把多少實作複雜性藏起來就越多——這正是好抽象的來源。