同樣的程式碼模式不斷重複出現,是該重新組織程式碼的訊號。
紅旗:重複(Red Flag: Repetition)#
同一段程式碼(或幾乎一樣的程式碼)反覆出現 → 表示你還沒找到正確的抽象。
處理方式 1:抽出方法#
把重複片段抽成單一方法,原本各處改為呼叫該方法。
何時最有效:
- 重複片段長
- 替代方法的簽章簡單
何時效果有限或反而更糟:
| 情境 | 說明 |
|---|---|
| 片段只有一兩行 | 替換的好處不大 |
| 片段與環境互動複雜 | 例如要存取大量區域變數,導致替代方法簽章臃腫(一堆 by-reference 參數),價值降低 |
處理方式 2:重組讓片段只執行一次#
範例:一個方法在多個位置會回傳錯誤,每個錯誤回傳前都要做相同的清理動作。

Figure 9.1: 處理多種封包類型——若封包過短就 LOG;此版本中 LOG 敘述被重複多次
- 把清理程式碼移到方法最尾端
- 在每個錯誤點
goto到該段(在支援 goto 的語言)

Figure 9.2: Figure 9.1 的重組——只剩下單一 LOG 敘述(用 goto 從各錯誤點跳到尾端統一處理)
goto 普遍被認為是壞東西,濫用會讓程式碼難以解讀。
但用於「從巢狀程式碼中跳脫」這類情境,它仍是可用的工具。
設計判斷#
去除重複的正確姿勢,不是「機械式抽方法」,而是找到能讓重複自然消失的更好結構。