2016-12-11 39 views
5

我有不同的输入参数和输出相同的方法。调用循环中输出相同,输入不同的多种方法

我使用输入数字类型调用Method1,然后检查其结果,如果结果是有效的,则下一个方法被调用(此时输入类型为字符串),依此类推。

在这个例子中,我有三种方法,但如果我有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(); 
} 

回答

3

(也检查下面替代的解决方案!)但是

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(); 
    } 
} 

这来,有一些性能损失为代表,因为你需要这些参数,所以很难置于外面,例如在一个返回代表的方法中。

作为一种替代方法,您可以创建一个值包作为参数(可能是您的调用类具有适当的接口),这对所有方法都是一样的,并且每个方法都会选择它需要的东西验证方法不太清楚)。

另一种方法是只返回布尔值,并保持验证细节在不同的对象,有可能实现用于验证扩展方法(也检查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仍包含验证数据。

从你的代码中,简单地使用异常也是可行的。如果错误频繁发生,这种无异常验证可能是必要的,异常会导致性能下降,但如果错误是例外情况,则可以随意使用异常!

3

谓词可以是?

,你可以这样做

 public ValidationResult Method1(string name) 
     { 
      return Validate(name, (param) => param.Length > 20, "Invalid name"); 
     } 

     public ValidationResult Method1(double average) 
     { 
      return Validate(average, (param) => param < 14, "Invalid average"); 
     } 

     private ValidationResult Validate<T>(T param, Func<T, bool> predicate, string message) 
     { 
      var validationResult = new validationResult(); 
      if (predicate(param)) 
      { 
       validationResult.Errors.Add(new ValidationFailure("", message)); 
      } 
      return validationResult; 
     } 

如果你有很多的参数。这不是,但最好的办法:我想一个问题是方法签名

 public ValidationResult Method1(int number, string family) 
     { 
      return Validate(number > 10 || family == "akbari", "Invalid Number"); 
     } 

     public ValidationResult Method1(string name) 
     { 
      return Validate(name.Length > 20, "Invalid name"); 
     } 

     public ValidationResult Method1(double average) 
     { 
      return Validate(average < 14, "Invalid average"); 
     } 

     public ValidationResult Validate(bool predicate, string message) 
     { 
      var validationResult = new validationResult(); 
      if (predicate) 
      { 
       validationResult.Errors.Add(new ValidationFailure("", message)); 
      } 
      return validationResult; 
     } 
+0

TNX的答案,也许数的方法也不同,如何处理这个 –

+0

我加入了新的解决方案,但是,这是不是最好的方法参数。我认为。 – Myleo

2

,一些接受整型,而其他接受string..etc;如何创建自己一个新的类型,说InputParam:

public class InputParam { 
    private int fieldOne; 
    private string fieldTwo; 
    ... 
    GetFieldOne(); 
    GetFieldTwo(); 
    ... 
} 

然后,你可能有许多方法,如您有需要,方法一高达20。当然,每一种方法将负责捡只字段它需要一个InputParam实例。

现在,您的所有方法都共享相同的签名,因此您可以拥有一组方法并对其进行循环。

1

可以使用关键字这样

static void Main(string[] args) 
    { 
     Console.WriteLine(@" 
     Method1(1)-> return {0}; 
     Method1('1')-> return {1}; 
     Method1(0.1)->-> return {2};" 
     , Method1(1), 
     Method1("1"), 
     Method1(0.1)); 

     Console.WriteLine(@" 
     AvgMethod()-> return {0}; 
     AvgMethod(1)-> return {1}; 
     AvgMethod('1')-> return {2}; 
     AvgMethod(0.1)-> return {3};" 
     , AvgMethod() 
     , AvgMethod(1) 
     , AvgMethod("1") 
     , AvgMethod(0.1)); 

     Console.ReadLine(); 
    } 

    public static string Method1(int number) 
    { 
     return "int"; 
    } 

    public static string Method1(string name) 
    { 
     return "string"; 
    } 

    public static string Method1(double average) 
    { 
     return "double"; 
    } 

    public static string AvgMethod(object _argument = null) 
    { 
     if (_argument is int) 
      return "int"; 
     if (_argument is string) 
      return "string"; 
     if (_argument is double) 
      return "double"; 

     return "..."; 

    } 
+0

这应该做什么?在这里看不到任何验证,验证也不是立即进行控制台输出。 –

+0

嘿,请阅读标题:(调用多个方法,并输出相同的循环) –

+0

这个问题不是关于验证, –

相关问题