这能写得更好吗?根据先前的结果调用函数

本文关键字:结果 函数 调用 更好 | 更新日期: 2023-09-27 18:28:06

我用c#编写了以下代码,用于检查各种测试,如果任何测试失败,则结果为false,并且不希望执行其他检查。

我的编码方式似乎很"丑陋",我想知道是否有一个更优雅的解决方案,我今天早上因为大脑衰退而错过了。

//check the rules
bool isValid = CheckPhoneFormat();
if (isValid)
{
    isValid = CheckDoNotCall();
}
if (isValid)
{
    isValid = CheckStatusActive();
}
if (isValid)
{
    isValid = CheckOCV();
}
if (isValid)
{
    isValid = CheckCard();
}
customer.IsValid = isValid;

这能写得更好吗?根据先前的结果调用函数

这增加了创建状态机的开销:

static Enumerable<Func<bool>() GetRules()
{
    yield return CheckPhoneFormat();
    yield return CheckDoNotCall();
    yield return CheckStatusActive();
    yield return CheckOCV();
    yield return CheckCard();
}
bool oneValid = GetRules().Any(b => b);
bool allValid = GetRules().All(b => b);

如果你愿意,效率会更高:

static IEnumerable<Func<bool>> arr = new Func<bool>[]
{
    () => CheckPhoneFormat(),
    () => CheckDoNotCall(),
    () => CheckStatusActive(),
    () => CheckOCV(),
    () => CheckCard();
};
bool oneValid = arr.Any(b => b);
bool allValid = arr.All(b => b);

是:

bool isValid = CheckPhoneFormat() && CheckDoNotCall()
               && CheckStatusActive() && CheckOCV() && CheckCard();
customer.IsValid = isValid;

只有当第一个操作数是true时,&&运算符才计算第二个操作数。

编辑
由于您调用的所有方法都是无参数的,请考虑将它们转换为只获取属性(并重命名)。它可能有助于调试。

bool isValid = IsValidPhoneFormat && IsValidDoNotCall
               && IsValidStatusActive && IsValidOCV && IsValidCard;
customer.IsValid = isValid;

您可以使用&&,如果检查失败,它将短路:

customer.IsValid = CheckPhoneFormat() && CheckDoNotCall() && CheckStatusActive() ...;

请注意,您甚至不需要if,您可以直接为布尔值赋值。