这是一个非常简化的示例。这不一定是特定于语言的问题,我想请您忽略函数编写的许多其他方式以及可以对其进行的更改。。颜色是一种独特的类型
string CanLeaveWithoutUmbrella()
{
if(sky.Color.Equals(Color.Blue))
{
return "Yes you can";
}
else
{
return "No you can't";
}
}
我遇到的很多人,ReSharper和这个人(其评论提醒我我一直想问这个问题已经有一段时间了)建议重构代码以删除else
留下的代码块:
(我不记得大多数人所说的话,否则我可能不会问这个)
string CanLeaveWithoutUmbrella()
{
if(sky.Color.Equals(Color.Blue))
{
return "Yes you can";
}
return "No you can't";
}
问题:不包括else
块会导致复杂性增加吗?
else
通过说明两个模块中的代码直接相关的事实,我给人的印象更直接地表明了意图。
另外,我发现我可以防止逻辑上的细微错误,尤其是在以后对代码进行修改之后。
以我的简化示例的这种变化形式为例(or
由于这是故意简化的示例,因此请忽略运算符):
bool CanLeaveWithoutUmbrella()
{
if(sky.Color != Color.Blue)
{
return false;
}
return true;
}
现在,有人可以if
在第一个示例之后基于条件添加新的块,而无需立即正确地认识到第一个条件正在对自己的条件施加约束。
如果else
存在一个块,则无论谁添加了新条件,都将被迫去移动该else
块的内容(如果他们以某种方式掩盖了该启发式,将显示代码无法访问,在一个if
约束另一个约束的情况下不会) 。
当然,无论如何都应定义特定示例的其他方式,所有这些方式都可以避免这种情况,但这只是一个示例。
我给出的示例的长度可能会歪曲此示例的视觉效果,因此假设占据方括号的空间相对于该方法的其余部分而言无关紧要。
我忘记提及我省略了else块的情况,并且是在使用if
块来施加逻辑上必须满足所有后续代码(例如,空检查(或任何其他保护措施)的约束)的情况。
else
子句时,上述情况可能更具可读性(根据我的喜好,在省略不必要的括号时,它甚至更具可读性。但是我认为示例的选择不正确,因为在上面的案例我会写return sky.Color == Color.Blue
(没有if / else),返回类型与bool不同的示例可能会更清楚这一点