我已經分配了一個項目來開發一組充當存儲系統接口的類。要求是該類支持GET方法具有以下簽名:如何避免在流量控制中使用異常?
public CustomObject get(String key, Date ifModifiedSince)
基本方法應該返回與key
相關的CustomObject
當且僅當對象被ifModifiedSince
後修改。如果存儲系統不包含key
,那麼該方法應該返回null。
我的問題是這樣的:
如何處理其中關鍵的存在,但該對象的情景已經沒有被修改?
這是重要的,因爲一些使用此類應用將Web服務和Web應用程序。這些應用程序需要知道是否返回404(未找到),304(未修改)或200(確定,這裏是數據)。
我衡器解決方案是:
- 引發自定義異常時 存儲系統不包含
key
- 引發自定義異常時
ifModifiedSince
失敗。 - 將狀態屬性添加到CustomObject。要求呼叫者檢查財產。
我不開心的任何這三個選項。我不喜歡選項1和2,因爲我不喜歡使用異常來控制流量。當我的意圖是指示存在沒有值時,我也不喜歡返回值。
不過,我傾向於選擇3
有沒有我不考慮的選項?有沒有人對這三種選擇有強烈的感受?
這個問題的答案,意譯:
- 提供一個
contains
方法和要求呼叫者呼叫get(key, ifModifiedSince)
之前調用它 ,拋出 異常,如果鍵不存在, 返回NULL如果對象未被修改,則修改爲 。 - 裹的響應和數據(如果有的話) 在複合對象。
- 使用預定義常量表示某個狀態(
UNMODIFIED, KEY_DOES_NOT_EXIST
)。 - 調用者實現接口爲 用作回調。
- 設計很糟糕。
爲什麼我不能選擇答案#1
我同意這是理想的解決方案,但它是一個我已經(勉強)被解僱。這種方法的問題在於,在大多數使用這些類的情況下,後端存儲系統將是第三方遠程系統,如Amazon S3。這意味着,一個contains
方法將需要往返存儲系統,在大多數情況下,這個過程需要再次往返。因爲這將花費時間和金錢,它不是一個選項。
如果不是這個限制,這將是最好的方法。
(我知道我沒有提到的問題的重要元素,但我試圖保持它簡短顯然,這是相關的。)
結論:
在閱讀完所有答案後,我得出結論:在這種情況下,包裝是最好的方法。本質上我會模仿HTTP,元數據(頭文件)包括響應代碼和內容主體(消息)。
這確實會引入一系列if,then,else檢查每次調用此方法都必須仔細考慮。除了Exceptions之外,你幾乎變得更好,至少它們是強制執行的,並且更加結構化。 – 2008-12-08 04:39:26
是的,但例外引入了一系列try/catch/finally,所以淨收益只是執行,而不是性能的代價?異常處理更加冗長,並且與使用代碼更加遙遠。所以......這要看...... OP問及如何避免例外。 – 2008-12-08 20:08:31