摆脱if语句

时间:2018-06-26 16:47:55

标签: if-statement optimization

在代码中,我遇到这样的情况:

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
    }

但是很难调试和发现错误。有什么方法可以使用更友好的构造来代替这样的声明。

2 个答案:

答案 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,....