【问题标题】:Why to reduce code and only have functions called once?为什么要减少代码并且只调用一次函数?
【发布时间】:2020-09-01 08:30:12
【问题描述】:

谁能解释一下为什么两个代码sn-ps不一样?

第一个是正确的,

if (coolDownTimer.read() === 0) {
  alert()
  if (errorCoolDownPeriod > 0) {
    await coolDownTimer.start()
  }
} else if (coolDownTimer.read() >= errorCoolDownPeriod) {
  alert()
  coolDownTimer.reset()
}

但我不喜欢将alert() 写两次,所以由于errorCoolDownPeriod 是一个正数,我想我可以这样做

if (coolDownTimer.read() > 0) {
  alert()
    if (coolDownTimer.read() === 0) {
//      alert()
      if (errorCoolDownPeriod > 0) {
        await coolDownTimer.start()
      }
    } else if (coolDownTimer.read() >= errorCoolDownPeriod) {
//      alert()
      coolDownTimer.reset()
    }
}

但是当我测试它时,它们的行为并不相同。

问题

为什么两个代码 sn-ps 的行为不一样?

【问题讨论】:

  • 好吧 coolDownTimer.read() > 0coolDownTimer.read() === 0 看起来它们是不兼容的条件。
  • 是的,出于某种原因,但我不明白为什么。
  • if (coolDownTimer.read() > 0) ... if (coolDownTimer.read() === 0) 永远不会进入第二个条件,因为如果它进入第一个条件,coolDownTimer.read() 的值将永远无法满足第二个条件。
  • 你是认真的吗?一个数可以既是零又非零?
  • @SandraSchlichting 因为一个值不能同时是n === 0 && n > 0

标签: javascript node.js algorithm ecmascript-6


【解决方案1】:

@Thomas 对 OP 的评论解释了这个问题。你不能有n === 0 && n > 0,所以只调用一次alert(),你应该这样做

if (coolDownTimer.read() === 0 || coolDownTimer.read() >= errorCoolDownPeriod) {
  alert()
    if (coolDownTimer.read() === 0) {
//      alert()
      if (errorCoolDownPeriod > 0) {
        await coolDownTimer.start()
      }
    } else if (coolDownTimer.read() >= errorCoolDownPeriod) {
//      alert()
      coolDownTimer.reset()
    }
}

即。在新的外部 if 语句中获取每个条件并将它们或它们。

【讨论】:

  • @Sandra 我认为重复条件实际上不如重复alert() 干净。如果alert() 实际上是一个更大的sn-p,那么将它提取到一个辅助函数中可能是有意义的,这样你就可以真正调用它两次。
【解决方案2】:

在第一个sn-p中,alert()coolDownTimer.read() === 0coolDownTimer.read() >= errorCoolDownPeriod时被执行。

正确的重构是:

const timer = coolDownTimer.read();
if (timer === 0 || timer >= errorCoolDownPeriod) {
  alert();
  if (timer === 0 && errorCoolDownPeriod > 0) {
    await coolDownTimer.start()
  } else if (timer !== 0) {
    coolDownTimer.reset()
  }
}

更多的可能是你对值有特定的限制,例如我假设所有的值都是实时计时器,所以只包含正值。

【讨论】:

  • 你的意思是因为这个const timer = coolDownTimer.read()
【解决方案3】:

当条件coolDownTimer.read() === 0满足时,第二个sn-p就是一个nop。我猜你混淆了排序的ifs 和if/then/elses。

【讨论】:

  • 由于没有加入已经在问题下进行的讨论以及由于缺乏布尔逻辑而没有说 OP 可以理解的语言而被否决。这个问题甚至不应该回答。
猜你喜欢
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 2022-07-28
  • 2019-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多