どのように優雅な検証ができますか?

26129 ワード

背景
ENTLIBはVAIBがあることを知っています.大量のXMLが視力を損なうことを気にしないとVAIBはとても優雅です.でも、あまり大きくない項目の中で、多くの場合はまだ自分で検証コードを書いています.
NETは一年半以来、検証コードの各段階を書いて、個人的に優雅だと思う検証コードの書き方を展示しています.もし他の方案があれば、皆さんと共有してください.
 
第一段階--強写
強く書くということは、もちろん強制的に書いています.パラメータ検証が必要だと知ってから(恥ずかしいです.勉強しました.NETはまる1ヶ月でこのことを知っています.)、長い間検証コードを書いています.いつからこんなに書きにくいと思ったかは覚えていません.いつから他の方法に変えられました.つまり初期コードにはこのような断片が溢れています.
public
 
void
 SomeMethod(
ストリングス
 s){    
if
 (s) 
==
 
null
)    {        
throw
 
new
 AgmentNull Exception(

s

)0    }     
if
 (s.Length 
==
 
0
)    {        
throw
 
new
 Agment Exception(

s cannot be empty 

)0    } }
最終的な結果は、一つ.csファイルにはまる1/2の内容が含まれています.これらのかわいいif、throwとかっこです.
この案は評価しなくてもいいです.自分で彼を卑下します.いくらなんでも、これらのもののために書いて、痙攣しました.つらいです.
 
 
第二段階--Gard類
 
うん、MSの多くの項目の中にこのGard類があります.いくつかの主要な検証の方法をクラスに書いて、方法は直接に異常を投げます.大体このようです.
public
 
クラス
 Gard{    
public
 
void
 NotNull(
object
 value、 
ストリングス
 argName)    {        
if
 (value 
==
 
null
)        {            
throw
 
new
 AgmentNull Exception(argName);        }     }     
//
その他の検証方法
)
 
コールの仕方は大体こんな感じです.
public
 
void
 SomeMethod(
ストリングス
 s){    Gard.NotNull(s、 

s

)0    Gard.NotEmpty(s、 

s

)0    Gard.ShoterThan(s、 
10
を選択します. 

s

)0    Gard.LongerThan(s 
3
を選択します. 

s

)0    
//
その他のロジック
)
爽やかに見えます.if、throwと綺麗な括弧がありません.おめでとうございます.
 
しかし、すべてが素晴らしいわけではないです.毎回の呼び出し方法はパラメータの名前を表す文字列が必要です.ここには4つの「s」が書いてあります.もちろん4つの「s」は大丈夫です.でも、4つの「user.Name」を書いて、6つの「user.ration Date」を書きます.
何を感じていますか?手酸?NO~NO~これは一番重要ではないです.重要なのは文字列を書く時VS自動提示がないことです.10個のいい文字を保証できますか?
実はこの段階はとても感情的で、なんといっても「似たような機能を一緒にする」というコンセプトの試みです.
 
第三段階--拡張方法
そして、Cハ3.0があります.拡張方法があります.そして、Gardの方法の最初のパラメータにはthisが追加されています.呼び出しはこのようになります.
public
 
void
 SomeMethod(
ストリングス
 s){    s.NotNull(

s

)0    s.NotEmpty(

s

)0    s.ShoterThan(
10
を選択します. 

s

)0    s.LongerThan(
3
を選択します. 

s

)0    
//
その他のロジック
)
基本的には認めません.文法飴を使っているだけです.一番重要な文字列はパラメータ名を何度も入力しても問題は解決されていません.少し打つと楽しいですか?標準的なプログラマーとして、NO!
 
 
第四段階--分かりません.
 
今使っている方法です.発明したばかりです.個人的にはいい感じですが、どうやって設計から説明するか分かりません.まず実現案を書いてください.
むかしむかし、孤独なクラスがありました.Validation Helperといいます.彼の任務は世の中のすべての話を聞かないパラメータを処罰することです.彼を見た変数たちの説明によると、彼はこのような顔をしています.
  Code
public class ValidationHelper<T>
{
#region

private T m_Value;

private string m_Name;

#endregion

#region

///

/// .
///
public T Value
{
get
{
return m_Value;
}
}

///

/// .
///
public string Name
{
get
{
return m_Name;
}
}

#endregion

#region

///

/// .
///
/// .
/// .
public ValidationHelper(T value, string name)
{
m_Value
= value;
m_Name
= name;
}

#endregion

#region

///

/// .
///
/// this .
/// .
/// null.
public ValidationHelper<T> NotDefault()
{
if (Value.Equals(default(T)))
{
if (Value is ValueType)
{
throw new ArgumentException(
String.Format(
" {0} ", Name), Name);
}
else
{
throw new ArgumentNullException(
String.Format(
" {0} null", Name), Name);
}
}

return this;
}

///

/// .
///
/// .
/// this .
/// .
/// , .
public ValidationHelper<T> CustomRule(Action<T, string> rule)
{
rule(Value, Name);

return this;
}

#endregion
}
 
 
Validation Helperはパラメータの値とパラメータの名前を保存できるので、一気にパラメータ名を何度も入力する問題を解決しました.
しかし、多くの人が知らないのです.どうしてこんなに機能が少ないValidation Helperはほとんどの不規範パラメータを消滅させることができますか?実は秘訣は拡張方法にあります.拡張方法の連絡を通じて、Validation Helperは多くのパートナーを見つけました.范のstringのでしょうCode
public static class StringValidationHelper
{
///

/// .
///
///
/// .
public static ValidationHelper<string> NotEmpty(this ValidationHelper<string> current)
{
current.NotDefault();

if (current.Value.Length == 0)
{
throw new ArgumentException(
String.Format(
"{0} ", current.Name), current.Name);
}

return current;
}

///

/// .
///
///
/// ( ).
/// .
public static ValidationHelper<string> ShorterThan(this ValidationHelper<string> current, int length)
{
current.NotDefault();

if (current.Value.Length > length)
{
throw new ArgumentException(
String.Format(
"{0} {1}", current.Name, length), current.Name);
}

return current;
}

///

/// .
///
///
/// ( ).
/// .
public static ValidationHelper<string> LongerThan(this ValidationHelper<string> current, int length)
{
current.NotDefault();

if (current.Value.Length < length)
{
throw new ArgumentException(
String.Format(
"{0} {1}", current.Name, length), current.Name);
}

return current;
}

///

/// .
///
///
/// ( ).
/// ( ).
/// .
public static ValidationHelper<string> LengthBetween(this ValidationHelper<string> current, int minLength, int maxLength)
{
current.NotDefault();

if (current.Value.Length < minLength || current.Value.Length > maxLength)
{
throw new ArgumentException(
String.Format(
"{0} {1} {2} ", current.Name, minLength, maxLength), current.Name);
}

return current;
}
}
はい、仲間が見つけました.今の問題は、侠客の助けが必要な時に、私達はnewを使って侠客を呼び出さなければならないです.これは明らかに不愉快です.そのためにもう一つの拡張方法があります.私達は「工場」と呼びます.
public
 
static
 
クラス
 Validation{    
public
 
static
 Validation Helper
<>
T
>
 InitValidation
<>
T
>
(
this
 T value、 
ストリングス
 argName)    {        
return
 
new
 Validation Helper
<>
T
>
(value、 argName);    } }
最後に、私達はこのように暗黒勢力を打ち負かしにきたのです.
public
 
void
 SomeMethod(
ストリングス
 s){    s.InitValidation(

s

)        .Not Default()        .NotEmpty()        .ShoterThan(
10
)        .LongerThan(
3
);
どうせもっといい方法が見つけられません.よろしくお願いします.
転載先:https://www.cnblogs.com/GrayZhang/archive/2008/09/01/1281526.html