在代码中,我遇到这样的情况:
if (a && b || c && d || e && f || g && h){
// do something
}
赞:
if len(env.workers) == 0 && env.minQueue.Len() == 0 || len(env.workers) == len(env.daemonList) && env.minQueue.Len() == 0 || len(env.workers) > 0 && len(env.workers) == len(env.daemonList) {
env.shouldStop = true
return nil
}
但是很难调试和发现错误。有什么方法可以使用更友好的构造来代替这样的声明。
答案 0 :(得分:1)
您多次使用len(env.daemonList)
,len(env.workers)
和env.minQueue.Len()
。将它们存储在变量中不仅会缩短这种长时间的状况,而且还会为您提供在调试时可以引用的变量。
您可以将其编写为:
w_len = len(env.workers)
d_len = len(env.daemonList)
q_len = env.minQueue.Len()
if w_len == 0 && q_len == 0 || w_len == d_len && q_len == 0 || w_len > 0 && w_len == d_len {...
现在,这里的问题当然是,尽管名称较短,但描述性不强。您可以以冗长为代价给他们更好的名字。您想在每个方向上倾斜多少取决于口味和环境。
这也不像标题状态那样“摆脱” if
,但这并不总是一个伟大的目标。 if
不一定很糟糕。
答案 1 :(得分:1)
正如@Eugene所提到的,将这样的长表达式分成多个较小的表达式始终是个好主意。
$ImageOrVideo = $_FILES["file"]["tmp_name"];
switch(mime_content_type($ImageOrVideo)){
case 'image/jpeg':
// ........
break;
case 'video/mp4':
// ........
break;
default:
exit('stop');
}
这在开始时可能看起来很荒谬,但相信我还有很长的路要走,在任何时候,您都可以返回上面的代码并轻松了解其中的内容。实际上,如果您喜欢使用调试器,那么这样做会使您的生活更轻松。
就性能而言,您要做的就是添加额外的7个布尔变量。当涉及代码可读性时,这无关紧要。为了提高代码可读性的经验法则是将变量命名为right,而不是exp1,2,....