在我的代码中,我有一个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)
你看到一切都很美妙吗?它看起来像一个管子,程序正在倒塌,直到达到满足条件.如果你拥有&&它看起来像一连串的操作,不能被打破.
正如您所要求的那样,由于可读性,您可能需要将长条件重新排列为谓词变量,这些变量说明为什么必须返回零.
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重构.