2011-09-22 100 views
8

幾天前,我對考試有以下理論問題: (a)解釋在處理 程序時可能發生的特殊情況時防禦性編程的含義。您可以參考在課堂上看到的示例或使用僞代碼來描述在嘗試讀取文件時防止發生某些情況 所採取的步驟。 (b)簡要描述Java中異常處理 的含義,以及這與防禦性編程有何不同。 [5 marks]防禦性編程和異常處理

我一直認爲防禦性編程是編程的全部範例,異常處理是其中的一部分。 在考試期間,我在「防守性編程」中寫道,程序員在執行邏輯代碼之前嘗試找出所有可能的問題,並在稍後返回來自此函數的錯誤值(例子0),而在異常處理中發生潛在錯誤並且被特殊機制捕獲,其中直接解釋這些錯誤。這樣對嗎?什麼應該是正確的答案?

+0

有人已經投票決定關閉的題外話。 WTF?這個問題是根據「我應該在考試中寫什麼」的方式來表達的,但這是不是一個關於編程的問題? –

回答

1

對我而言,防禦性編程意味着編寫代碼來處理您認爲不會或甚至可能發生的情況,因爲您認爲自己的信仰不可靠。

例如(未編譯或測試,條款和條件適用):

private String findSmallestString(Collection<String> strings) { 
    if (strings == null || strings.isEmpty()) return null; 
    Iterator<String> stringsIt = strings.iterator(); 
    try { 
     String smallestString = stringsIt.next(); 
     while (stringsIt.hasNext()) { 
      String candidateString = stringsIt.next(); 
      if (candidateString == null) continue; 
      if (candidateString.compareTo(smallestString) < 0) { 
       smallestString = candidateString; 
      } 
     } 
     return smallestString; 
    } 
    catch (NoSuchElementException e) { 
     return null; 
    } 
} 

在那裏,可以說是防禦功能包括:

  • 頂部的空值或空後衛子句;這是一種私有方法,因此您應該確保它永遠不會被調用爲空或空集合。
  • NoSuchElementException的try-catch;你可以證明它所包含的代碼在迭代器履行合同時不會拋出這個異常。
  • 從迭代器出來的字符串(不是第一個!)的無效保護子句;再次,由於這是一種私人方法,因此您應該可以確保收集參數不包含空值(並且無論如何您會將空值置入收藏中?)

不是所有人都會同意null檢查是防禦性的。嘗試抓住是完全沒有意義的。

對我來說,防守編程的酸性測試就是你不認爲防守會被使用。

2

對我來說,防禦性編程是最壞的情況:你的用戶是完全瘋狂的人,你必須爲他們的瘋狂投入辯護自己和你的程序。我相信在這篇報價中有很多的智慧:

每一天,軟件行業都在製造更大更好的傻瓜式軟件,而且每一天,大自然都在變得越來越愚蠢。到目前爲止,大自然正在贏得大獎

永遠不要忘記,你的用戶不僅是你的客戶。如果您對圖書館API負責,則您的用戶可能是其他部門。在這種情況下,大多數恆星之一笙歌我聽說過在我的生活是:

即使我們刪除所有失敗的單元測試,程序沒有工作

+1

簡潔而有力地擺放。然而,我會走得更遠:假設你的用戶是瘋狂的人,瘋狂的投入不是防禦性的,這是正常的;假設*你自己*是一個瘋狂的人,使瘋狂的投入是防禦性的。 –