2016-11-24 143 views
0

我想知道當您進行驗證時,最好的方法或組織代碼是什麼?組織驗證方法驗證方法的最佳方法/練習C#

嵌套如果或返回在第一個地方你的驗證失敗?

這是我做的第一方式,專注於成功的情況下,使用嵌套如果

protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     if (value!= null && value.GetType().Equals(typeof(string))) 
     { 
      var text = value.ToString(); 
      if (Regex.IsMatch(text, "^[-+]?[0-9]{1,2}.?[0-9]{0,6}?,[-+]?[0-9]{1,3}.?[0-9]{0,6}?$")) 
      { 
       var cordinations = text.Split(','); 
       if (cordinations.Length == 2) 
       { 
        decimal latitude = 0; 
        decimal longitude = 0; 
        if (decimal.TryParse(cordinations[0].Replace(" ", string.Empty), out latitude) && decimal.TryParse(cordinations[1].Replace(" ", string.Empty), out longitude)) 
        { 
         if ((latitude >= -90 && latitude <= 90) && (longitude >= -180 && longitude <= 180)) 
          return ValidationResult.Success; 
        } 
       } 
      } 
     } 
     return new ValidationResult(Admin.ResourceManager.GetString(ErrorMessageResourceName)); 
    } 

這是我做的第二種方式,專注於失敗的情況下

protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     if (value==null) 
      return new ValidationResult(Admin.ResourceManager.GetString(ErrorMessageResourceName)); 
     if (!value.GetType().Equals(typeof(string))) 
      return new ValidationResult(Admin.ResourceManager.GetString(ErrorMessageResourceName)); 

     var text = value.ToString(); 
     if (!Regex.IsMatch(text, "^[-+]?[0-9]{1,2}.?[0-9]{0,6}?,[-+]?[0-9]{1,3}.?[0-9]{0,6}?$")) 
      return new ValidationResult(Admin.ResourceManager.GetString(ErrorMessageResourceName)); 

     var cordinations = text.Split(','); 
     if (cordinations.Length != 2) 
      return new ValidationResult(Admin.ResourceManager.GetString(ErrorMessageResourceName)); 

     decimal latitude = 0; 
     decimal longitude = 0; 
     if (!decimal.TryParse(cordinations[0].Replace(" ", string.Empty), out latitude) || 
      !decimal.TryParse(cordinations[1].Replace(" ", string.Empty), out longitude)) 
      return new ValidationResult(Admin.ResourceManager.GetString(ErrorMessageResourceName)); 

     if (!(latitude >= -90 && latitude <= 90) || !(longitude >= -180 && longitude <= 180)) 
      return new ValidationResult(Admin.ResourceManager.GetString(ErrorMessageResourceName)); . 
     return ValidationResult.Success; 
    } 

這一天將被認爲是最佳做法。或者任何其他方式來做到這一點。我會非常感謝你的想法,可能是微軟建議的任何參考?

+0

第二種方式更容易閱讀,然後第一種 – Fabio

+0

首先,如果'value'爲'null',則代碼將拋出NRE - 'value is string'就足夠了。 – Dennis

+1

當你讀第二種方式你可以認識到,每一個驗證都可以在自己的方法中提取,那麼閱讀會更容易,無需閱讀驗證的所有細節 – Fabio

回答

0

在我看來,第二種方式更好,因爲它可以防止嵌套,並且是更友好的代碼,這意味着代碼可以很容易地維護。但是,您可以改進它,可以在頂部添加ValidationResult,並在每次驗證時更新該實例,最終在底部只有一個返回語句。

我的意思是這樣的:

protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
{ 
    var rtn = new ValidationResult(); 

    if (value==null) 
     rtn = ValidationResult(Admin.ResourceManager.GetString(ErrorMessageResourceName)); 
    if (!value.GetType().Equals(typeof(string))) 
     rtn = ValidationResult(Admin.ResourceManager.GetString(ErrorMessageResourceName)); 

    var text = value.ToString(); 
    if (!Regex.IsMatch(text, "^[-+]?[0-9]{1,2}.?[0-9]{0,6}?,[-+]?[0-9]{1,3}.?[0-9]{0,6}?$")) 
     rtn = ValidationResult(Admin.ResourceManager.GetString(ErrorMessageResourceName)); 

    var cordinations = text.Split(','); 
    if (cordinations.Length != 2) 
     rtn = ValidationResult(Admin.ResourceManager.GetString(ErrorMessageResourceName)); 

    decimal latitude = 0; 
    decimal longitude = 0; 
    if (!decimal.TryParse(cordinations[0].Replace(" ", string.Empty), out latitude) || 
     !decimal.TryParse(cordinations[1].Replace(" ", string.Empty), out longitude)) 
     rtn = ValidationResult(Admin.ResourceManager.GetString(ErrorMessageResourceName)); 

    if (!(latitude >= -90 && latitude <= 90) || !(longitude >= -180 && longitude <= 180)) 
     rtn = ValidationResult(Admin.ResourceManager.GetString(ErrorMessageResourceName)); . 

    if(rtn.HasNoError) rtn = ValidationResult.Success; // or something of the like 

    return rtn; 
} 

這有助於你在調試通過阻止代碼的方法的中間從什麼地方回來。希望它有幫助

+0

頂部的初始化實例是無用的,因爲每個驗證都會用新實例重新初始化它。您可以在頂部聲明變量'ValidationResult結果;' – Fabio

+0

在「中間」返回驗證是更好的方法,因爲它會刪除已驗證結果的值的冗餘驗證。 – Fabio

+0

謝謝@Hisham 這不會創建驗證結果對象,哪怕不需要?我的意思是什麼時候驗證是成功的。 另外如果也有使用。 當有人從頂部讀取時,他/她必須閱讀方法的結尾才能知道返回的內容。 – Geeganage