大量的閱讀源代碼時的時候,我看到這樣的事情:我通常不檢查功能輸入是否無效。我錯了嗎?
public void Foo(Bar bar)
{
if (bar == null) return;
bar.DoSomething();
}
我不喜歡這樣,但我似乎是錯誤的,因爲這形式的防禦性編程的被認爲是好的。是不是?例如,爲什麼bar null開頭?是不是像這樣的檢查類似於將繃帶應用於問題而不是解決真正的解決方案?它不僅使功能與其他代碼行復雜化,而且還防止程序員看到潛在的錯誤。
再舉一例:
public void Foo(int x)
{
int clientX = Math.Max(x, 0); // Ensures x is never negative
}
別人看是看防禦性編程,但我看到了未來的錯誤,當一個程序員無意中傳遞一個負值,程序突然爆發,沒有人知道爲什麼,因爲這一點點的邏輯吞噬了可能暴露的例外。
現在,請不要混淆檢查,如果用戶輸入有效的對我要求什麼,我在這裏。顯然用戶輸入應該被檢查。我所要求的只涉及不與用戶或他或她的輸入交互的代碼。
防守性編碼就像是防守性的駕駛 - 因爲你不相信自己的能力,所以你不會開車防守,因爲你不相信其他車手。 – Tim
另外,您必須絕對確定在任何情況下,錯誤都不會導致Bar爲空(創建Bar時內存不足?)。 – grimmig
@Tim,很好地說,但即使在我個人的項目中,我也是在防守編碼,因爲我也不相信自己。 – JBSnorro