既然「把錯誤從定義中消除」合理,其他特殊情況也該被一併消除。
特殊情況常導致程式碼充斥 if 判斷 → 難讀又容易出 bug。
通則#
能消除的特殊情況就消除——讓「正常情況」的設計自動涵蓋它,無需額外程式碼。
範例:編輯器的「無選取」狀態#
第 6 章的編輯器專案:要實作選取機制(複製或刪除選取範圍)。
反例:用狀態變數區分有 / 無選取#
多數學生引入一個布林變數表示「目前是否有選取」:
- 螢幕上有時看不到選取,自然在實作中也想反映這點
- 結果:所有處理選取的程式碼都得先檢查「沒有選取」這個特例
- 大量
if判斷散布各處
改善:選取「總是存在」#
讓選取永遠存在,當螢幕看不到時 → 以一個空選取(起點 = 終點)來表示。
效果:
- 選取管理碼不需要任何「無選取」檢查
- 複製空選取 → 在新位置插入 0 個位元組(若實作得當,連「插入 0 位元組」這個特例也不必檢查)
- 刪除空選取 → 例:對於單行內的選取,把選取前的部分與選取後的部分串起來形成新行;空選取會自然重新生成原行
同時體現了「不同層次、不同抽象」#
「無選取」這個概念在使用者介面中合理,但這不代表它必須在應用內部也明確存在。
- 對外:使用者看到「沒有選取」
- 對內:永遠存在一個選取,只是有時為空、不可見
內部實作因此更簡單。