在循环中以相同的输出和不同的输入调用多个方法

Mohammad Akbari |

我有多种方法,它们具有不同的输入参数和相同的输出。

我用数字的输入类型调用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

循环中的多个模态显示相同的信息而不是不同的

使用相同的完成函数运行多个类似的ajax调用的正确方法,输入数据不同

gzip相同的输入不同的输出

Python:嵌套循环,而不是创建多个输入和输出

与具有多个输入和输出的函数的for循环并行

如何在for循环中使用一个输入语句创建不同的输出?

Moq-如何在循环中使用不同的参数调用相同的设置

v-for循环中的单选输入选择多个具有相同值的单选按钮

如何从for循环中获取多个输出以显示

如何在多个不同的对象上调用相同的刻度方法?

多个按钮调用相同的函数并执行不同的方法

相同变量的输入和输出

输入和输出,方法调用和堆栈框架

“ for”循环中的后递增和预递增产生相同的输出

如何在Shell脚本循环中调用多个有组织的输入文件

for循环中有多个输入

*ngFor 循环中多个输入文件的问题

for循环跨多个文件调用两个不同的文件(相同的名称,不同的扩展名)

在 for 循环中处理多个异步函数调用

在 for 循环中调用多个子程序

在循环中通过 require 调用多个描述

同一循环中的多个 appendChild 调用

在循环中动态调用和打印函数的返回值,覆盖先前的输出

在循环中查找和打印相同的元素

R:在循环中读取和写入多个csv文件,然后使用原始名称进行输出

获得独立于不同输入的相同输出

显示相同输入的不同输出(近)

cpp 以相同的输入返回不同的输出

是否可以通过for循环中的一个方法调用来引用不同的方法?