2017-04-21 92 views
-1

這聽起來很愚蠢。但每次我開始創建一個新的API時,我發現自己陷在這個問題上。可以說,我正在編寫一個接受輸入的作者,將其寫入數據庫或文件並返回布爾變量true/false。錯誤輸入時的返回值

如果作者返回true,則表示寫入成功。 如果作者返回false,則表示寫入失敗。

現在讓我們說輸入爲空或空字符串,在這種情況下應該寫作者返回false還是應該返回True?

一個明顯的解決方案是拋出一些異常(可能是非法的)。但是如果我不想拋出異常呢?讓我們假設,我只是解析一些日誌條目,並試圖寫入一個文件。每次我寫數據時,我都期待着真/假。

+0

你可以認爲它是「假」,因爲它相當於什麼都不寫。 –

+0

取決於你,以及虛假回報的定義,但如果這些是無效投入,你可以(也應該)拋出異常。 – AxelH

+3

返回'false'而不是關於問題的正確信息是舊的File API被認爲是不好的原因之一。更多信息:http://java7fs.wikia.com/wiki/Why_File_sucks。 – Pshemo

回答

2

這取決於你想用返回值做什麼,以及輸入是否可以被合理處理。

如果null或空字符串不是有效輸入,通常會拋出一些異常,因爲您的API的用戶不尊重其合同。但對於諸如日誌記錄等成功可能不重要的事情,您可能只希望忽略它,不寫任何內容並返回布爾值。

然後取決於布爾值應該傳達給用戶的內容。如果它必須聲明寫入了某些內容,則只有成功寫入的有效輸入纔會返回true,失敗或不正確的輸入false。如果要聲明處理輸入是成功的,無論它是否有效,如果寫入內容或像null/empty這樣的情況正確處理,則返回true,僅在處理明智輸入的實際失敗時返回false。您的API的用戶可能希望在返回值爲false時重試該操作,但如果問題是由於輸入本身導致的,而不是某些暫時性故障(如連接被丟棄),則它將保持失敗。

也許真正的問題是布爾值可以有兩個值,而我們有兩個以上的情況。返回一些值表示成功,失敗或錯誤的輸入會更好。在許多較舊的API中,您經常會發現整數返回值來指示結果(例如在許多命令行程序中)。在Java中,使用Enum是有意義的。值可以是SUCCESS,FAILUREINVALID_INPUT。然後API的用戶可以確定如何處理每個案例。更重要的是,它可以擴展到覆蓋其他情況,例如不同的故障模式。

但請記住,在某些時候,這只是開始類似於替代檢查的異常。最終,正確的答案取決於API以及應該如何使用,討論可能不僅僅是技術問題,而且也是風格和偏好問題。