2011-01-05 97 views
1

如果驗證東西在代碼中你可以用返回值工作表明什麼是錯的,或者你可以拋出一個異常。在我的控制器我有特殊的驗證這樣的:「驗證可能拋出異常」 - 命名規範和語義

void DoSomething() 
{ 
    Validate(); // throws exception if something is wrong 
    ..... 
} 

我不知道是否有一個共同的命名約定,其言下之意是,這樣我就不需要添加註釋有異常時,什麼是錯的拋出// throws exception if something is wrong和區別於if (!IsValid())

注意:validation-naming-conventions不回答我的問題。接受答案後

更新:我已經從這個問題

  • AssertValid()或VerifyAndThrow()瞭解到的好名字(TNX @hacktick)
  • 驗證必須與上下文區別(警告或錯誤)
  • 例外驗證是一種合同或第二道防線,可能只存在於調試模式下,以確保周圍的if (IsValid(...))不會錯過任何東西(TNX科迪@灰)
+1

你爲什麼選擇拋出異常?似乎並不明顯,驗證失敗是一個真正的例外情況。返回值有什麼問題? – 2011-01-05 09:46:31

+0

我使用Exceptional Verification作爲第二道防線,以防if-s缺少某些東西 – k3b 2011-01-05 09:58:49

回答

2

通常你會用:

// for a validations that returns just plain yes no (true|false). in the case of a property use caching for the last validationresult. 
bool IsValid 

// for a validation that returns a list of errors of some sort (messagelist, id list, custom objects, whatever you need). 
object Validate(); 

// validates and throws an exception if one or more error occured. 
void ValidateAndThrow(); 

同時一定要考慮,如果你需要某種形式的警告。例如,如果您驗證了您的註冊DTO模型,並且想要在用戶密碼較弱時提醒用戶,但是不想阻止用戶在他選擇時保存它。

+0

Thanks ** ValidateAndThrow()**即使對於非母語者也很簡單直觀。在此期間,我發現只有在調試版本中才存在的Microsoft-C++ -mfc-Method ** AssertValid **。我不知道哪個更好。驗證上下文(警告,錯誤)也是一個好點。 – k3b 2011-01-05 10:03:54