是否有更可读的方式来制作一个长链&&声明?

时间:2013-01-08 05:27:09

标签: c# design-patterns if-statement code-readability

假设我有一个长而复杂的条件列表,为了运行if语句,它必须为true。

if(this == that && foo != bar && foo != that && pins != needles && apples != oranges)
{
    DoSomethingInteresting();
}

通常情况下,如果我被迫做这样的事情,我会把每个陈述放在自己的行上,就像这样:

if
(
         this == that 
    &&    foo != bar 
    &&    foo != that 
    &&   pins != needles 
    && apples != oranges
)
{
    DoSomethingInteresting();
}

但我仍觉得这有点乱。我很想将if语句的内容重构为它自己的属性,就像这个

一样
if(canDoSomethingInteresting)
{
    DoSomethingInteresting();
}

然而,这只是将所有混乱移动到canDoSomethingInteresting()并没有真正解决问题。

正如我所说,我的goto解决方案是中间解决方案,因为它不像最后一个那样模糊逻辑,并且比第一个更具可读性。但必须有更好的方法!

响应Sylon评论的示例

bool canDoSomethingInteresting
{
    get{
        //If these were real values, we could be more descriptive ;)
        bool thisIsThat = this == that;
        bool fooIsntBar = foo != bar;
        bool fooIsntThat = foo != that;
        return 
        (
               thisIsThat
            && fooIsntBar
            && fooIsntThat
        );
    }
}
if(canDoSomethingInteresting)
{
    DoSomethingInteresting();
}

3 个答案:

答案 0 :(得分:6)

在我看来,将混乱变成属性或方法并不是一个坏主意。这样它就是自包含的,你执行if(..)检查的主要逻辑变得更具可读性。特别是如果要检查的条件列表很大,那么最好不要使用属性,这样如果你需要重新使用它就不会重复检查。

if(IsAllowed)
{
   DoSomethingInteresting();
}

答案 1 :(得分:1)

在单独的变量中包含不同条件的代码是获得可读性和可维护性的好方法。当您的vars名为good时,您将获得

if (goToNextPage) 
{
    if (notAdmin)
    {
        RedirectToNormalPage();
    }
    else
    {
        RedirectToAdminPage();
    }
}

与此相比

if ((x == 1) && ((y == 'r') || (y == 't'))) 
{
    if (!a)
    {
        RedirectToNormalPage();
    }
    else
    {
        RedirectToAdminPage();
    }
}

我会让您选择在以后返回代码时想要阅读的内容。

答案 2 :(得分:0)

方法很好。更好的方法名称会告诉它测试什么,而不是如果它是真的可以做什么。喜欢

if (isFooValid()) { mergeFoo(); } 

如果它在逻辑上符合代码流,特别是如果我不关心它是否在那时完成,我也经常将整个if包装到一个方法中:

maybeMergeFoo();

关键是要在精神上退后一步,看看最适合当前代码的内容,以及接下来要编写的代码。通常,很清楚什么是组织代码的正确方法。