Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有一种更具可读性的方法来制作一条长长的&&;声明?_C#_Design Patterns_If Statement_Code Readability - Fatal编程技术网

C# 有没有一种更具可读性的方法来制作一条长长的&&;声明?

C# 有没有一种更具可读性的方法来制作一条长长的&&;声明?,c#,design-patterns,if-statement,code-readability,C#,Design Patterns,If Statement,Code Readability,假设我有一个长而复杂的条件列表,它必须为true才能运行if语句 if(this == that && foo != bar && foo != that && pins != needles && apples != oranges) { DoSomethingInteresting(); } 通常,如果我被迫这样做,我会将每个语句放在自己的行中,如下所示: if ( this == that

假设我有一个长而复杂的条件列表,它必须为true才能运行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();
}
if ((x == 1) && ((y == 'r') || (y == 't'))) 
{
    if (!a)
    {
        RedirectToNormalPage();
    }
    else
    {
        RedirectToAdminPage();
    }
}
但这只会将所有的混乱转移到
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();
}

在我看来,把这些乱七八糟的东西变成一个财产或一种方法并不是一个坏主意。这样,它是自包含的,您执行if(…)检查的主要逻辑变得更具可读性。特别是如果要检查的条件列表很大,最好是在一个属性中,这样如果您需要重复使用,就不会重复该检查

if(IsAllowed)
{
   DoSomethingInteresting();
}

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

if (isFooValid()) { mergeFoo(); } 
如果它在逻辑上符合代码流,特别是如果我不在乎是否在该点完成,我也经常将整个If包装到一个方法:

maybeMergeFoo();

关键是在思想上后退一步,看看什么最适合当前代码,以及下一步要编写的代码。通常情况下,组织代码的正确方法是明确的。

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

if (goToNextPage) 
{
    if (notAdmin)
    {
        RedirectToNormalPage();
    }
    else
    {
        RedirectToAdminPage();
    }
}
和这样的东西相比

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

我将让您选择稍后返回代码时要阅读的内容。

您的每个条件在逻辑上是不同的,还是属于同一个条件?举例来说,组合你的条件子集是否有意义?我不会考虑第三个解决方案混淆。如果方法名称反映了它所做的事情,那么它会使重要的代码更具可读性。在我无法避免这样的条件逻辑的情况下,我使用类似于第三个解决方案的东西,其中包含类似于第二个解决方案的条件。(使修补和调整变得容易)我想可能是。我不是在解决一个具体的问题,而是在寻找更多的模式或更好的思维方式。让我们假设在最坏的情况下,它们在逻辑上都是不同的,因为这会带来更大的复杂性,因此,换行符至少不在缩进块之前的括号内。@StevePy您是否可以简单地使用与第二个if语句相同的布局编写方法或属性,并将
if(…)
替换为
return(…)
,或者您是否会做其他事情?同时,它会变成自文档化,方法名告诉(或应该告诉)它是做什么的。我必须承认,我有时会这样做,我对代码的最终外观非常满意。然而,房产最终会是什么样子?这就是我使用这种方法的问题,它使即时代码更具可读性,但只是将难以阅读的代码隐藏起来。如果你有一个庞大的if检查列表,并且你想让它更简单,那么也许你需要研究其他形式的重构——你的域对象可以被重新组织以使事情更简单吗?或者,另一种方法可以通过某种声明性AOP方式完成,使用属性标记具有特定规则的各种属性,然后IsValid方法使用反射进行检查。这对于简单的验证非常有效,例如,[必需]公共字符串名称;好的,我以前做过的一种方法是为每个语句创建一个具有描述性名称的bool,然后在属性/方法的返回值中使用它们。哈哈,但有时我也会想,当我这么做的时候,我是不是在努力工作。(将写上面的例子)这个问题也是非常开放的,实际问题、代码的其余部分、逻辑的可重构性等都将决定最佳方法。在某些情况下,对于愚蠢的业务逻辑,这可能是不可避免的。