【发布时间】:2011-04-26 03:50:54
【问题描述】:
我在这里(或至少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 值表示什么都不做。
对我来说,这减少了我的代码的复杂性,并且在我看到它时很有意义。那么,这种形式是好是坏(甚至是代码味道)?
【问题讨论】:
-
我认为如果它使您的代码更具可读性并避免令人费解的条件就可以了。不过,投票结束,“这是好是坏”太主观了。
-
所有这些检查都需要“以防万一”值为空的事实本身就是一种气味,恕我直言。这样做是在隐藏错误。
-
@SimonJ:好点。至少在这种情况下,如果不期望
null值,他应该抛出异常。 -
我会把 '{ /* do nothing--dodge 'else-ifs' */ }' 放在它自己的行上,而不是放在第一个 'if' 的行上。
-
这是错误的形式。编码时最好的经验法则之一是“做某事,再也不做”。这适用于大规模(通过将通用功能重构为单个包或类)和小规模(通过仅检查一次条件值)。您唯一可以摆脱这种情况的是在 XOR 场景中(即,“if (x == null && y == null) {...} else if (x != null && y != null) {. ..}") 逻辑会强制您多次进行类似的检查。
标签: conditional complexity-theory