首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有分支的分支覆盖-我知道这听起来很奇怪

没有分支的分支覆盖-我知道这听起来很奇怪
EN

Stack Overflow用户
提问于 2020-11-18 02:15:01
回答 2查看 46关注 0票数 1

我有一堆遵循这种模式的验证代码:

代码语言:javascript
复制
bool IsBroken()
{
    var isBroken = Check(..., "error-1")
        | Check(..., "error-2")
        ...
        | Check(..., "error-n");

    if (...)
    {
        isBroken |= Check(..., "error-1")
            | Check(..., "error-2")
            ...
            | Check(..., "error-n");
    }
    else
    {
        isBroken |= Check(..., "error-1")
            | Check(..., "error-2")
            ...
            | Check(..., "error-n");
    }

    // ...
    // Could have more if-else or even nested if-else

    return isBroken;
}

bool Check(bool condition, string message)
{
    if (condition)
    {
        errors.Add(message);
    }
    return condition;
}

目标是执行所有检查,而不管结果如何。然而,这段代码的问题是它对分支覆盖不友好。

一个简单的解决方法是用函数体替换Check(bool, string),但这会产生另一个较小的问题,那就是代码混乱。我正在试图找出一个能让我两全其美的解决方案。有什么想法吗?!

EN

回答 2

Stack Overflow用户

发布于 2020-11-18 02:38:44

如果有如此多的重复验证( If -check),并且它们非常短,那么您可以创建一个需要执行的检查字典。将此字典传递给该方法,迭代字典中的项,如果发生验证错误,则添加错误消息。

示例代码:

代码语言:javascript
复制
class A
{
    Dictionary<Func<A, bool>, string> dictOfChecks = new Dictionary<Func<A, bool>, string>()
    {
        //Example of checks                 , Error Message
        { (arg) => arg.ToString().Length < 3, "Length is smaller than 3" },
        { (arg) => arg.ToString().Length < 2, "Length is smaller than 2" },
    };

    public bool IsBroken()
    {
        //there you can enter multiple call of GetErrors to check whether there are some
        var errors = GetErrors(dictOfChecks);

        return errors.Length == 0;
    }

    public string[] GetErrors(Dictionary<Func<A, bool>, string> dict)
    {
        var errors = new List<string>();

        foreach (KeyValuePair<Func<A, bool>, string> kvp in dict)
        {
            if (kvp.Key.Invoke(this))
                errors.Add(kvp.Value);
        }

        return errors.ToArray();
    }
}
票数 0
EN

Stack Overflow用户

发布于 2020-11-18 04:59:53

想出了一个好的解决方案:

代码语言:javascript
复制
_ = condition && Append("error");

bool Append(string error)
{
    errors.Add(error);
    return true;
}

而这也可以写成if (condition) Append("error")。在我们的例子中,块语句必须写成:

代码语言:javascript
复制
if (condition)
{
    ...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64880984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档