以下示例顯然是虛構的,但它恢復了在我正在使用的代碼基礎上完成驗證的方式。提高數據驗證的性能
類型A有兩個方法,具有以下特徵:
public void FirstMethod(TypeB param)
public ValidationResult TryFirstMethod(TypeB param)
當FirstMethod被調用,它需要對參數進行驗證。
因此,它調用TryFirstMethod來檢索表示驗證結果的對象。
如果ValidationResult的實例表示一切正常,則繼續執行,否則引發異常。
TryFirstMethod的實用工具是調用者,一個假設的TypeC,可以執行此方法並檢查實際方法是否會拋出。通過檢查ValidationResult上的屬性。
此外,ValidationResult的實例包含有關輸入錯誤的原因,如何解決該錯誤等信息。
這證明了這種類型的需要,而不是僅僅使用布爾值。
實際上,這種方法運行得很好,驗證數據並將本地化的錯誤消息返回給用戶非常容易。
唯一的問題是,由於某些檢查相當複雜,執行它們兩次變得有點貴。
它們最初由調用者完成,以確保實際的方法不會拋出。
然後再通過有問題的方法檢查輸入是否有效。
我找不到乾淨的方法來避免必須執行兩次檢查。
爲了使事情更加複雜,事實上解決方案應該使用標準方法,構造函數以及TypeB是「原始」類型,比如string或int。
是的,你完全理解。事實上,異常本身就很昂貴,並且來自外部世界的數據可能經常失效。再次,性能問題。另外,我更願意儘可能避免異常。 – RobSullivan
異常比較昂貴?如果驗證過程如您所述那樣複雜,那麼拋出異常的成本可能相比可以忽略不計。如果拋出一個異常的代價會產生有意義的影響,那麼就像在TryFirstMethod中那樣返回一個ValidationResult。 – akmad