2016-11-24 7 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

第2の方法は最初の方が読みやすく、 – Fabio

+0

まず、あなたのコードはNREを投げるだろう。もし 'value'が' null'なら 'value is string'で十分だろう。 – Dennis

+1

2番目の方法を読むと、すべての検証が独自の方法で抽出できることを認識することができます。読み込みはより簡単になり、検証のすべての詳細を読む必要はありません – Fabio

答えて

0

私の意見では、2番目の方法は入れ子を防止してより親切なコードなので、コードを簡単に維持できるということです。しかし、それを改善して、上部にValidationResultを追加し、各検証時にそのインスタンスを更新して、最終的に一番下のreturnステートメントだけを持つようにすることができます。

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 result;で変数を宣言するだけです。 – Fabio

+0

すでに検証結果を持っている値の冗長なバリデーションを削除するので、"中 "のバリデーションを返す方が良い方法です。 – Fabio

+0

ありがとう@Hisham これは検証結果オブジェクトを作成しませんが、それは必要ありません。検証が成功したときを意味します。 さらに使用する必要がある場合は追加してください。 誰かがトップから読んでいるときに、返されていることを知るためにメソッドの最後まで読む必要があります。 – Geeganage

関連する問題