我有多种方法,它们具有不同的输入参数和相同的输出。
我用数字的输入类型调用Method1,然后检查其结果,如果结果有效,则调用下一个方法(这次使用字符串的输入类型),依此类推。
在此示例中,我有3种方法,但是如果我有10种方法或20种方法,它们具有不同的输入和相同的输出,我必须编写冗余代码,那么如何防止这些冗余代码?
这是方法的示例:
public ValidationResult Method1(int number, string family)
{
var validationResult = new validationResult();
if(number > 10 || family="akbari")
{
validationResult.Errors.Add(new ValidationFailure("", "Invalid Number"));
}
return validationResult;
}
public ValidationResult Method1(string name)
{
var validationResult = new validationResult();
if(name.Length > 20)
{
validationResult.Errors.Add(new ValidationFailure("", "Invalid name"));
}
return validationResult;
}
public ValidationResult Method1(double average, string family)
{
var validationResult = new validationResult();
if(average < 14)
{
validationResult.Errors.Add(new ValidationFailure("", "Invalid average"));
}
return validationResult;
}
我称这种方法如下:
var validationResult = Method1(20, "test");
if (!validationResult.IsValid)
{
return validationResult.FirstError();
}
validationResult = Method2("Samsung");
if (!validationResult.IsValid)
{
return validationResult.FirstError();
}
validationResult = Method3(15.5);
if (!validationResult.IsValid)
{
return validationResult.FirstError();
}
(另请在下面查看替代解决方案!)
var valMethods = new List<Func<ValidationResult>>
{
()=>Method1(number,family),
()=>Method2(name),
// ...
};
foeach(var valMethod in valMethods)
{
var valResult = valMethod();
if (!valResult.IsValid)
{
return valResult.Errors.First();
}
}
但是,这会给委托人带来一些性能损失,并且由于需要参数,因此很难将其放置在外部,例如,在返回委托人的方法中。
作为替代方案,您可以创建一个值袋作为参数(可能是带有适当接口的调用类),所有方法都相同,并且每种方法都选择需要的内容(从而减少了验证方法)明确)。
另一种选择是仅返回bool值并将验证详细信息保留在单独的对象中,可能实现扩展方法进行验证(也请检查Myleo的谓词答案):
internal static class ValidationMethods
{
public static bool CheckIsValid1(this IList<ValidationResult> valResults, int number, string family)
{
var validationResult = new validationResult();
if(number > 10 || family="akbari")
{
validationResult.Errors.Add(new ValidationFailure("", "Invalid Number"));
}
valResults.Add(validationResult);
return validationResult.IsValid;
}
public static bool CheckIsValid2(this IList<ValidationResult> valResults, string name)
{
// next check ...
}
}
然后,在验证代码中:
var valResults = new List<ValidationResult>();
if (!valResults.CheckIsValid1(number, family)
|| !valResults.CheckIsValid2(name)
|| // more checks... will stop if one fails
)
{
return valResults.Last().Errors.First();
}
这样,您就不必与代表搞混了。当第一个失败时检查停止(||或条件检查在第一次成功时停止,此处为否定的IsValid)。并且您的valResults仍然包含验证数据。
从您的代码中,简单地使用异常也是可行的。如果错误经常发生,并且异常会破坏性能,那么这种无异常的验证可能是必需的,但是如果错误非常严重,则可以使用异常!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句