首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不做任何事情的If分支是一种代码味道还是良好的实践?

不做任何事情的If分支是一种代码味道还是良好的实践?
EN

Stack Overflow用户
提问于 2010-10-16 05:11:02
回答 8查看 1.2K关注 0票数 5

我对这里的线程(或者至少是commented)的回答包含这样的代码,但我想知道编写一系列if分支,其中一个(或多个)分支什么也不做,通常是为了消除对每个分支中null的检查,这是一种好的形式还是坏的形式。

示例(C#代码):

代码语言:javascript
复制
if (str == null) { /* Do nothing */ }
else if (str == "SomeSpecialValue")
{
    // ...
}
else if (str.Length > 1)
{
    // ...
}

而不是:

代码语言:javascript
复制
if (str != null && str == "SomeSpecialValue")
{
    // ...
}
else if (str != null && str.Length > 1)
{
    // ...
}

当然,这只是一个例子,因为我倾向于在更大更复杂的类中使用它们。在大多数情况下,null值表示不执行任何操作。

对我来说,这减少了代码的复杂性,并且在我看到它时是有意义的。那么,这是好的形式还是坏的形式(甚至是代码的味道)?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-10-16 05:40:33

避免以下情况确实很好,因为它会不必要地重新检查其中一个条件(编译器将优化这一点的事实与此无关--它可能会让试图阅读代码的人做更多的工作):

代码语言:javascript
复制
if (str != null && str == "SomeSpecialValue")
{
    // ...
}
else if (str != null && str.Length > 1)
{
    // ...
}

但是按照你的建议去做也很奇怪,如下所示:

代码语言:javascript
复制
if (str == null) { /* Do nothing */ }
else if (str == "SomeSpecialValue")
{
    // ...
}
else if (str.Length > 1)
{
    // ...
}

我说这很奇怪,因为它混淆了你的意图,违背了读者的期望。如果你检查一个条件,人们希望你做一些事情,如果它被满足了--但是你没有。这是因为您的意图并不是实际处理null条件,而是在检查您实际感兴趣的两个条件时避免使用null指针。实际上,不是有两个概念状态要处理,而是有一个健全的规定(非空输入),相反,它读起来像是您有三个概念状态要处理。事实上,在计算上,你可以说有三个这样的状态是不重要的--它不太清楚。

在这种情况下,通常的用例方法是按照Oren A的建议--检查null,然后检查结果块中的其他条件:

代码语言:javascript
复制
if (str != null) 
{
 if (str == "SomeSpecialValue")
 {
    // ...
 }
 else if (str.Length > 1)
 {
    // ...
 }
}

这只是一个增强可读性的风格问题,而不是代码气味的问题。

编辑:但是,如果你设置了什么都不做的条件,我非常喜欢你添加了一个“什么都不做”的注释。否则,人们可能会认为您只是忘记了完成代码。

票数 5
EN

Stack Overflow用户

发布于 2010-10-16 05:14:56

我更喜欢这样做-

代码语言:javascript
复制
if (str != null) 
{
 if (str == "[NULL]")
 {
    // ...
 }
 else if (str.Length > 1)
 {
    // ...
 }
}  

我认为你总是可以将一个空主体的if“重写”成它的主体否定,这样看起来更好,也更有意义。

票数 21
EN

Stack Overflow用户

发布于 2010-10-16 05:46:37

我通常会在第一个if中放入一个return或类似的东西

代码语言:javascript
复制
void Foo()
{
  if (str == null) { return; }
  if (str == "SomeSpecialValue")
  {
      // ...
  }
  else if (str.Length > 1)
  {
      // ...
  }
}

如果您不能做到这一点,因为函数在if/else之后做了其他事情,我会说是时候重构了,并将if/else部分拆分到一个单独的函数中,您可以提前从该函数返回。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3946166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档