如何删除if块中的否定?



遵循此处推荐的do..while模式:

for {
work()
if !condition {
break
}
}

下面的代码是实现do..while(条件)使用for循环:

var r *s
var err error
counter := 0
for { // do..while(specificerror && < MAX && trigger_not_initiated)
r, err = f()
counter = counter + 1
if !(err != nil &&
strings.Contains(err.Error(), "specificerror") &&
counter < MAX &&
!IsTriggerInitiated()) {
break
}
}

但是审查小组建议通过删除if语句中的否定(条件)来使if条件更具可读性

如何去除if语句的否定(条件)?

你需要的转化叫做德摩根定律:

  • 不是(A或B) = (A)和(B)
  • not (A and B) = (not A) or (not B),

如果你有这样的语句:

if !(a && b && c) {}

等于

if !a || !b || !c {}

在你的例子中:

if !(err != nil &&
strings.Contains(err.Error(), "specificerror") &&
counter < MAX &&
!IsTriggerInitiated()) {
break
}

翻译版本:

if err == nil ||
!strings.Contains(err.Error(), "specificerror") ||
counter >= MAX ||
IsTriggerInitiated() {
break
}

需要检查的一件事:短路评估。在一系列&&中,如果一个表达式求值为false,则其余表达式将不求值(我们知道结果为false)。

幸运的是,这将在翻译版本中保持不变:短路计算将是相同的,因为在一系列||中,如果一个表达式被求值为true,其余的将不被求值(我们知道结果是true)。因此,当原始形式afalse时,转换后的形式!atrue时,情况完全相同。

如何在if语句的否定(条件)中删除否定?

完全按照建议("use||")

if !(a && b) 

等价于

if !a || !b

更多信息请参见De Morgan定律。

相关内容

  • 没有找到相关文章

最新更新