通过一些共享操作来干燥简单的条件

时间:2019-03-21 06:24:22

标签: javascript

我需要测试两个条件。两种可能都是正确的(但不能两者都正确)。如果都不成立,我们什么也不做。如果任何一个都成立,我们将执行一项共同的行动。如果第二个条件为真,我们将执行其他操作。看起来很简单,但是当我尝试编写代码时,我发现自己重复了条件或动作,并且感觉不像是DRY。

为了用伪代码进行说明……

我们重复以下条件之一:

if a | b {
    do  x
    if b {
        do y
    }
}

或者,我们重复以下操作之一:

if a {
    do x
} else if b {
    do x
    do y
}

除了条件和动作都是处理正则表达式的一类代码外,我可能不会再为此担心了。它复杂到足以不想重复它们,但又太短而不能保证它们自己的功能。

我可以将布尔变量放入混合中……

var doX = false
if a {
    doX = true
} else if b {
    doX = true
    do y
}
if doX {
    do x
}

...但是感觉有点笨拙。

是否有DRYer方式来执行此操作-我没有想到的一些优美,简洁的条件逻辑? (目前,我正在使用JavaScript进行工作,但我很高兴能用任何一种语言编写出更好的示例。)

更新:最后,我选择了第三个选项(公认的是“ kludgy”)。 Sergio建议先捕获每个匹配项的建议当然看起来最好,并且避免了代码重复,但是随后您失去了短路评估的性能优势(即,如果已知a为真,则无需评估b。)对于特定的应用程序,此代码块在一个可能很大的字符串列表上运行了很多次,这更有意义。 (x和y的顺序无关紧要。)

1 个答案:

答案 0 :(得分:2)

if a | b {
  do  x
  if b {
    do y
  }
}

这太好了,可读性强,您可能无法击败它。

  

条件和动作都是处理正则表达式的一类代码

啊,这就是问题的根源。的确,如果不是ab而是长期存在且难以理解的正则表达式,我可以看到它如何使它变得不太清楚。如果提取条件怎么办?

var a = /regex 1 check/
var b = /regex 2 check/

if a | b {
    do  x
    if b {
        do y
    }
}