「不同層次、不同抽象」的另一個應用:類別的介面通常應與其實作不同

若兩者抽象相似 → 類別不夠深。

反例:行導向的文字 API#

第 6 章的編輯器專案,多數團隊把文字內部以「行」為單位儲存(每行獨立保存)。

問題是:他們把 API 設計成行導向:

getLine(...)
putLine(...)

這讓 UI 程式碼很難寫:

  • UI 常見操作是「在一行中間插入文字」、「跨越多行刪除一段」
  • 行導向 API 強迫呼叫端自己拆行、合行
  • 這段邏輯既不簡單,又會散布在 UI 各處

改善:字元導向的 API#

把介面改成字元導向:

insert(position, string)   // 任意位置插入字串(可含換行)
delete(start, end)         // 任意位置範圍刪除
  • 內部仍以「行」儲存
  • 拆行 / 合行的複雜度封裝在文字類別內
  • 文字類別變得更深,UI 程式碼變得更簡單

設計判準#

介面與實作之間的差異 = 類別提供的價值。

介面與內部表示越「不同」,類別把多少實作複雜性藏起來就越多——這正是好抽象的來源。