既然「把錯誤從定義中消除」合理,其他特殊情況也該被一併消除

特殊情況常導致程式碼充斥 if 判斷 → 難讀又容易出 bug。

通則#

能消除的特殊情況就消除——讓「正常情況」的設計自動涵蓋它,無需額外程式碼。

範例:編輯器的「無選取」狀態#

第 6 章的編輯器專案:要實作選取機制(複製或刪除選取範圍)。

反例:用狀態變數區分有 / 無選取#

多數學生引入一個布林變數表示「目前是否有選取」:

  • 螢幕上有時看不到選取,自然在實作中也想反映這點
  • 結果:所有處理選取的程式碼都得先檢查「沒有選取」這個特例
  • 大量 if 判斷散布各處

改善:選取「總是存在」#

讓選取永遠存在,當螢幕看不到時 → 以一個空選取(起點 = 終點)來表示

效果:

  • 選取管理碼不需要任何「無選取」檢查
  • 複製空選取 → 在新位置插入 0 個位元組(若實作得當,連「插入 0 位元組」這個特例也不必檢查)
  • 刪除空選取 → 例:對於單行內的選取,把選取前的部分與選取後的部分串起來形成新行;空選取會自然重新生成原行

同時體現了「不同層次、不同抽象」#

「無選取」這個概念在使用者介面中合理,這不代表它必須在應用內部也明確存在。

  • 對外:使用者看到「沒有選取」
  • 對內:永遠存在一個選取,只是有時為空、不可見

內部實作因此更簡單。