どのように優雅な検証ができますか?
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といいます.彼の任務は世の中のすべての話を聞かないパラメータを処罰することです.彼を見た変数たちの説明によると、彼はこのような顔をしています.
Validation Helperはパラメータの値とパラメータの名前を保存できるので、一気にパラメータ名を何度も入力する問題を解決しました.
しかし、多くの人が知らないのです.どうしてこんなに機能が少ないValidation Helperはほとんどの不規範パラメータを消滅させることができますか?実は秘訣は拡張方法にあります.拡張方法の連絡を通じて、Validation Helperは多くのパートナーを見つけました.范のstringのでしょう
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
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