我对这里的线程(或者至少是commented)的回答包含这样的代码,但我想知道编写一系列if分支,其中一个(或多个)分支什么也不做,通常是为了消除对每个分支中null的检查,这是一种好的形式还是坏的形式。
示例(C#代码):
if (str == null) { /* Do nothing */ }
else if (str == "SomeSpecialValue")
{
// ...
}
else if (str.Length > 1)
{
// ...
}而不是:
if (str != null && str == "SomeSpecialValue")
{
// ...
}
else if (str != null && str.Length > 1)
{
// ...
}当然,这只是一个例子,因为我倾向于在更大更复杂的类中使用它们。在大多数情况下,null值表示不执行任何操作。
对我来说,这减少了代码的复杂性,并且在我看到它时是有意义的。那么,这是好的形式还是坏的形式(甚至是代码的味道)?
发布于 2010-10-16 05:40:33
避免以下情况确实很好,因为它会不必要地重新检查其中一个条件(编译器将优化这一点的事实与此无关--它可能会让试图阅读代码的人做更多的工作):
if (str != null && str == "SomeSpecialValue")
{
// ...
}
else if (str != null && str.Length > 1)
{
// ...
}但是按照你的建议去做也很奇怪,如下所示:
if (str == null) { /* Do nothing */ }
else if (str == "SomeSpecialValue")
{
// ...
}
else if (str.Length > 1)
{
// ...
}我说这很奇怪,因为它混淆了你的意图,违背了读者的期望。如果你检查一个条件,人们希望你做一些事情,如果它被满足了--但是你没有。这是因为您的意图并不是实际处理null条件,而是在检查您实际感兴趣的两个条件时避免使用null指针。实际上,不是有两个概念状态要处理,而是有一个健全的规定(非空输入),相反,它读起来像是您有三个概念状态要处理。事实上,在计算上,你可以说有三个这样的状态是不重要的--它不太清楚。
在这种情况下,通常的用例方法是按照Oren A的建议--检查null,然后检查结果块中的其他条件:
if (str != null)
{
if (str == "SomeSpecialValue")
{
// ...
}
else if (str.Length > 1)
{
// ...
}
}这只是一个增强可读性的风格问题,而不是代码气味的问题。
编辑:但是,如果你设置了什么都不做的条件,我非常喜欢你添加了一个“什么都不做”的注释。否则,人们可能会认为您只是忘记了完成代码。
发布于 2010-10-16 05:14:56
我更喜欢这样做-
if (str != null)
{
if (str == "[NULL]")
{
// ...
}
else if (str.Length > 1)
{
// ...
}
} 我认为你总是可以将一个空主体的if“重写”成它的主体否定,这样看起来更好,也更有意义。
发布于 2010-10-16 05:46:37
我通常会在第一个if中放入一个return或类似的东西
void Foo()
{
if (str == null) { return; }
if (str == "SomeSpecialValue")
{
// ...
}
else if (str.Length > 1)
{
// ...
}
}如果您不能做到这一点,因为函数在if/else之后做了其他事情,我会说是时候重构了,并将if/else部分拆分到一个单独的函数中,您可以提前从该函数返回。
https://stackoverflow.com/questions/3946166
复制相似问题