If statement 去掉if语句

If statement 去掉if语句,if-statement,optimization,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()

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

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
    }
但是调试和发现错误是很困难的。有没有办法使用更友好的构造来替换这样的语句。

您多次使用
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
,但这并不总是一个伟大的目标<代码>如果不一定是坏的。

可以多次使用
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
,但这并不总是一个伟大的目标
如果
不一定是坏的。

正如@Eugene所提到的,将这样的长表达式分解为多个较小的表达式总是一个好主意

exp1 = a && b
exp2 = c && d
exp3 = exp1 || exp2
exp4 = e && f
exp5 = g && h
exp6 = exp4 || exp5
exp7 = exp3 || exp6

if(exp7){
   //doSomething
}
这在一开始可能看起来很荒谬,但相信我,它还有很长的路要走,在任何时候,你都可以回到上面的代码,轻松理解那里在做什么。事实上,如果你喜欢使用调试器,那么这样做会让你的生活更轻松


此外,在性能方面,您所做的只是额外生成7个布尔变量。当涉及到代码可读性时,它是无关紧要的。更好的代码可读性的经验法则是正确命名变量,而不是exp1,2,…。

正如@Eugene所提到的,最好将这样的长表达式分解为多个较小的表达式

exp1 = a && b
exp2 = c && d
exp3 = exp1 || exp2
exp4 = e && f
exp5 = g && h
exp6 = exp4 || exp5
exp7 = exp3 || exp6

if(exp7){
   //doSomething
}
这在一开始可能看起来很荒谬,但相信我,它还有很长的路要走,在任何时候,你都可以回到上面的代码,轻松理解那里在做什么。事实上,如果你喜欢使用调试器,那么这样做会让你的生活更轻松


此外,在性能方面,您所做的只是额外生成7个布尔变量。当涉及到代码可读性时,它是无关紧要的。更好的代码可读性的经验法则是正确命名变量,而不是exp1,2,…。

对其进行部分求值?与临时中间变量一样,将条件表达式提取到一个方法中(该方法的名称传达了它所表示的逻辑,从而使代码更易于阅读)。在该方法中,引入尽可能多的变量来保持整个逻辑的每个部分并清楚地表达出来。在每个´´´´´´´´后面加一个换行符,并在每个´´´´´´´´´´´´´´´´´´´´´´´´´´´周围加上括号,以提高可读?与临时中间变量一样,将条件表达式提取到一个方法中(该方法的名称传达了它所表示的逻辑,从而使代码更易于阅读)。在该方法中,引入尽可能多的变量来保持整个逻辑的每一部分并清楚地表达出来。在每个´´´´´´´后面加一个换行符,并在每个
&&
周围加上括号以提高可读性。