if语句中的OR条件链

Mar*_*čko 11 c if-statement

在我的代码中,我有一个if语句,看起来像:

if(someFunction1(a) || someFunction2(b->b1,c) || *d == null || somefunction3(e) > f * g || !e->e1 || ...){
   return 0;
} else {
   do_something;
}
Run Code Online (Sandbox Code Playgroud)

在我的代码中,真正的变量和函数名称几乎是三行条件,它看起来很容易被忽视.所以我决定把它重写成形式:

if(someFunction1(a)){
   return 0;
} else if(someFunction2(b->b1,c)){
   return 0;
} else if(*d == null){
   return 0;
} else if(somefunction3(e) > f * g){
   return 0;
} else if(!e->e1){
   return 0;
} else if(...){
   return 0;
} else{
   do_something;
}
Run Code Online (Sandbox Code Playgroud)

有什么理由我不应该这样做吗?

dat*_*olf 17

从纯粹的语义 - 句法角度来看,它们之间没有任何有效的区别.但是如果您的可读性是您的关注点,为什么不使用"datenwolf"格式化风格 - 我在过去的5个项目中开发了这种风格:

if( someFunction1(a)
 || someFunction2(b->b1,c)
 || *d == null
 || somefunction3(e) > f * g
 || !e->e1
 || ...
){
   return 0;
} else {
   do_something;
}
Run Code Online (Sandbox Code Playgroud)

你看到一切都很美妙吗?它看起来像一个管子,程序正在倒塌,直到达到满足条件.如果你拥有&&它看起来像一连串的操作,不能被打破.

  • "一个程序正在倒塌的管道"......"一系列不能被打破的行动"......当我说编程是一门艺术时,人们仍然嘲笑我...... (11认同)

acr*_*075 6

正如您所要求的那样,由于可读性,您可能需要将长条件重新排列为谓词变量,这些变量说明为什么必须返回零.

bool unnecessary = someFunction1(a) || someFunction2(b->b1,c);
bool beyondTolerance = somefunction3(e) > f * g;
bool invalidInput = *d == nullptr || !e->e1;

if (unnecessary || beyondTolerance || invalidInput)
    return 0;
else 
    ...
Run Code Online (Sandbox Code Playgroud)

这是Martin Fowler的Decompose Conditional重构.

  • 如果你这样做,你需要小心.原始代码可能依赖于此代码更改的__short-circuit evaluation__. (8认同)

the*_*ace 5

选项1:

  • 简洁
  • 一个退出点,以避免return语句的冗余.

选项2:

  • 可以轻松诊断确切的故障点,即可以将日志添加到每个分支以检测故障.