我需要根据两个不同的验证规则验证字段的值:
所以我可以这样做:
public static bool Validate(string fieldValue, string fieldType, ValidationParameters validationParameters)
{
...
}
public static bool Validate(string fieldValue, string fieldType, string[] possibleValues)
{
...
}
但这需要用户非正常地if
我也可以这样做:
public static bool Validate(string fieldValue, string fieldType, ValidationParameters validationParameters=null,string[] possibleValues=null)
{
...
}
现在,用户可以发送他的数据,但没有多余if
,但我无法确保validationParameters
或possibleValues
(其中一个)获得了值。
是否有第三个选项,用户不必检查他使用的是哪种方法,但我不必担心他不会发送任何两个字段(代码,而不是文档) )?
如果不是,上述两种方式哪种方式更好(不易出错且更优雅)?
感谢。
答案 0 :(得分:3)
我个人会做两个重载方法。主要原因是:
但我无法确保validationParameters或possibleValues(其中一个)获得了值。
在我看来,可选参数应该是:可选。制作两个可选参数,其中一个是必需的,这似乎是一个有问题的设计选择。
避免这种情况的主要原因似乎是:
但这需要用户不合情理地。
但是,我没有看到问题。用户将不得不构建字符串集合(我个人会使IEnumerable<string>
而不是string[]
,或params string[] possibleValues
)或ValidationParameters
。如果他们已经需要构造要传递的参数,那么添加if
条件似乎是不必要的(每个路径都可以调用验证)。
答案 1 :(得分:2)
如果他们通过不同的概念进行验证,那么它们的名称应该不同。比方说,ValidateByValidationParameters
和ValidateByPossibleValues
。现在问题是,为什么你不希望调用者仔细选择他正在使用哪一个?
答案 2 :(得分:0)
因为你不能要求发送其中一个,我建议使用前一个选项,但我不明白你的意思是你不喜欢用户必须“不合情理地”
答案 3 :(得分:0)
你可以重载方法 - 正如你所说 - 或做这样的事情:
enum TYPE { VAL_1, VAL_2 }
void function(TYPE validateType, object o)
{
swich(validateType)
{
case VAL_1:
List<string> par = o List<String>;
if(par != null)
{
//...
}
break;
case VAL_2:
List<MyObject> par = o as List<MyObject>;
if(par != null)
{
//...
}
break;
}
}
也许它不是非常类型安全,但是对于somteimes很有用。
最后 - 您可以为每个验证案例准备单个委托方法,并在一个地方调用这些方法(单个或多个)。