非防禦性編程:不做邊界判斷,不假設用戶輸入會出現極端情況。說白一點就是寫代碼沒有考慮邊界。
防禦性編程:考慮代碼有極端情況,以及有邊界存在。
防禦性有兩種手段:
1.一個是利用if語句將外部用戶輸入進行檢查,或者實時對用戶變量進行檢查,確保任何參與外部數據計算的過程變量都是合法的。這種做法就是會產生很多if。
2.另一種手段,就是修改輸入,使其不再可能出現異常情況,常見的做法就是拷貝用戶輸入,然後對用戶輸入進行補全(截斷,這個比較少用)。比如鏈表變量的哨兵僞節點等。
至於,進攻性編程,比較少用到,多數用於防止自己犯糊塗,然後給代碼加 assert 斷言。相信在座的各位都足夠有信心寫出用不到assert的代碼。
總結:
防禦性編程的第二個手段,就是修改輸入,使其不再可能出現異常情況,常見的做法就是拷貝用戶輸入,然後對用戶輸入進行補全(截斷,這個比較少用)。比如鏈表變量的哨兵僞節點等。
這個手段纔是高手常用的。劃重點。