【问题标题】:Ifs, else ifs and multiple returns [closed]Ifs,else ifs和多个返回[关闭]
【发布时间】:2015-06-30 09:45:27
【问题描述】:

这不是关于链式 ifsifselse ifs 的问题。我已经在 SO 中看到了很多这样的问题。

我的问题也不是关于性能,更多的是关于编码标准可读性

考虑一下我在一个项目中经常看到的以下琐碎的伪代码:

if (expression > 0)
{
    return 1;
}
else if (expression < 0)
{
    return -1;
}
else
{
    return 0;
}

我通常以稍微不同的方式编写这种构造:

if (expression > 0)
{
    return 1;
}

if (expression < 0)
{
    return -1;
}

return 0;

当然还有第三种选择,即任何方法都不应有多个 return 语句,当方法的复杂性较低时,我发现这过于限制和繁琐:

int retVal;

if (expression > 0)
{
    retVal = 1;
}
else if (expression < 0)
{
    retVal = -1;
}
else
{
    retVal = 0;
}

return retVal;

在编写这些类型的结构时,上面列出的选项之一是否更正确?性能方面,我知道选择完全无关紧要,但从可读性的角度来看,我更喜欢避免 if - else if 语句。话虽如此,很多同事都不同意我的观点,即使他们不能给我任何令人信服的论据。

【问题讨论】:

  • 这是一种偏好。
  • 一切取决于您的喜好。我会说第一个选项看起来最好,因为它以合乎逻辑的方式将相关的 if 组合在一起。如果你(可以)跳过大括号,它会看起来更整洁。
  • 失望的选民愿意发表评论吗?
  • @InBetween:当然。你的问题的问题是没有好的或坏的答案。 Stackoverflow 不适合讨论这些事情。
  • 我偏爱选项 3。10 多年来,我们避免使用“break”(switch 语句除外)和“return”(函数末尾除外)。经验表明,这种编码标准提供了一些可读性优势,并且在调试模式下,在过程结束时设置单个断点有一些优势。

标签: c# if-statement coding-style


【解决方案1】:

有很多方法。您可以采用您展示的两种方法之一。你可以这样做:

if (expression == 0)
{
    return 0;
}
return expression < 0 ? -1 : 1;

或者完全使用三元运算符:

return expression == 0
    ? 0
    : expression < 0 ? -1 : 1;

另一种选择是使用函数式方法,例如 offered by my own SuccincT library 并执行以下操作:

return expression.Match().To<int>()
                 .Where(e => e < 0).Do(-1)
                 .Where(e => e > 0).Do(1)
                 .Else(0).Result();

这完全是偏好问题,确实没有正确的答案。

【讨论】:

    【解决方案2】:

    考虑

    return expression < 0? -1:
           expression > 0? +1:
           0;
    

    一般来说,它在很大程度上取决于偏好和语义。

    如果所有三种情况(&gt;0&lt;0==0)都有些对称,那么您的第一个选项对我来说看起来不错。

    如果默认路径应该返回0,并且&gt;0&lt;0 是特殊/例外情况,我会选择第二个选项。

    【讨论】:

    • 示例过于简化。当返回语句有点复杂时,我认为使用 ? 运算符会妨碍可读性,特别是在链接时。
    【解决方案3】:

    我认为

    int retVal = 0;
    
    if (expression > 0)
    {
        retVal = 1;
    }
    
    if (expression < 0)
    {
        retVal = -1;
    }
    
    return retVal;
    

    这在性能方面看起来并不正确,并且每次进行条件匹配时都是原因。

    在以下情况下,这将匹配,直到找到正确的条件并忽略休息

    if (expression > 0)
    {
        return 1;
    }
    else if (expression < 0)
    {
        return -1;
    }
    else
    {
        return 0;
    }
    

    我认为 if/else if/else 优于性能 从可读性的角度来看,您也可以更喜欢使用 案子 我认为 if else if 是比多个 if 更好的选择

    【讨论】:

    • 我很抱歉,但性能方面,两个选项是相同的;两种实现都会在到达任何给定的返回语句之前评估相同数量的条件。
    • @InBetween 不正确。在第一个示例中,如果 expression &gt; 0 为真,它仍将评估 expression &lt; 0,因为没有返回。
    • 哎呀对不起!我以为你在比较前两个选项。我已经编辑了我的答案,因为显然没有 else if 的唯一返回选项没有任何意义,所以我误读了你的答案。很抱歉造成混乱。
    【解决方案4】:

    正如问题中提到的 “我的问题也不是关于性能,而是关于编码 标准和可读性。”

    您可以将三元运算符用于简单的 if 和 then else 情况,但如果您使用三元运算符检查多个条件,它将无法保持可读性。

    return expression > 0 ? -1 : 0; 
    

    对于具有多个检查的条件,请使用您在问题中提供的 if 和 else-if。

    if (expression > 0)
    {
        return 1;
    }
    else if (expression < 0)
    {
        return -1;
    }
    else
    {
        return 0;
    }
    

    在收到@Chris 和@InBetween 的评论后,此答案已更新

    【讨论】:

    • 我会说有任何嵌套的三元组是完全不可读的。这样做绝对没有优势。
    • 我很遗憾地说,但恕我直言,超过 2 个嵌套的三元运算符是地狱。我倾向于避免甚至 2,并尽可能在代码审查中重构它们。
    • @InBetween。正如我在答案中提到的,当您使用超过 4-5 个嵌套三元运算符时,这是一个建议,将无法管理和理解。因此,根据我的说法,使用 4-5 个嵌套三元组可能是可以理解的,但必须避免超出范围
    • 我肯定希望看到包含 5 个嵌套三元组的代码。我无法想象它会是可读的。
    • @Chris 和 InBetween 感谢您的宝贵建议。我已经更新了答案。
    猜你喜欢
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 2021-10-11
    • 2011-12-20
    相关资源
    最近更新 更多