Item 45: Minimize the Differences between a Working Example and the Failing Code#
有時你手邊會有有缺陷的程式碼和一個運作正常的相關範例。這常發生在除錯複雜的 API 呼叫或演算法時。運作範例可能來自 API 文件、Q&A 網站、open-source 軟體或教科書。這兩者之間的差異可以引導你找到缺陷。
前置作業#
在用範例程式碼修復問題之前,你必須先編譯並測試它,驗證它確實能運作。如果範例本身無法運作,問題可能不在你的程式碼,而是出在你的環境(compiler、runtime、OS)、你對 API 或演算法的理解,或者(較不可能)第三方元件中的 bug。
兩種收斂方法#
確認範例可運作後,有兩種修復方法,都是逐步最小化差異:
方法一:在範例上逐步建構
- 適用於你的程式碼簡單且自包含的情況
- 小步地將你的程式碼元素加入範例中
- 每一步都驗證範例是否仍然運作
- 導致範例停止運作的那次加入,就是問題的元兇
方法二:削減你的程式碼以接近範例
- 適用於你的程式碼有大量依賴阻礙其獨立運作的情況
- 小步地移除或調整你的程式碼以匹配範例
- 每次修改後確認程式碼仍然失敗
- 讓你的程式碼開始運作的那次修改,就指向了你需要修復的地方
根據定義,當運作範例和你的程式碼之間沒有差異時,你的程式碼就會運作。
重點回顧#
- 為了找到導致故障的元素,逐步削減失敗程式碼以匹配運作範例,或讓運作範例逐步匹配失敗程式碼