3

假设我有一个长而复杂的条件列表,这些条件必须为真才能运行 if 语句。

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

3 回答 3

6

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

if(IsAllowed)
{
   DoSomethingInteresting();
}
于 2013-01-08T05:32:13.737 回答
1

在不同的变量中包含不同条件的代码是提高可读性和可维护性的好方法。当您的变量命名为好时,您会得到

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

与这样的事情相比

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

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

于 2013-01-08T06:05:57.617 回答
0

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

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

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

maybeMergeFoo();

关键是要退后一步,看看最适合当前代码的代码,以及接下来要编写的代码。通常情况下,组织代码的正确方法是很清楚的。

于 2013-01-08T05:46:45.837 回答