YouTube

Got a YouTube account?

New: enable viewer-created translations and captions on your YouTube channel!

Chinese, Simplified subtitles

← 02-21 当心时间炸弹!

Get Embed Code
4 Languages

Showing Revision 2 created 03/16/2013 by 秀隆 杨.

  1. 你看到的这个问题,就是众所周知的时间炸弹。
  2. 时间炸弹就是代码版的《潜伏》,随时想要炸你个满脸花。
  3. 在代码中存在着传说中的错误,只是它一般陷于沉睡。
  4. 可能之前的几百万次循环运行都没打扰到它。
  5. 只是一旦它苏醒后,时间炸弹一爆炸了,
  6. 就很难调试出来,因为你必须得找出
  7. 这个时间炸弹最初的藏身之处--这正是断言大展神威之时,它可以节约你的宝贵光阴。
  8. 因为断言能阻止时间炸弹,它可以检查数据是否合理有效,
  9. 主要是在要被存储起来的时候,需要检查。
  10. 当我们new一个时间对象时,就可以用断言
  11. 来确保参数都处于有效的范围。
  12. 比如,小时一定是在0-23之间,48小时的去死!
  13. 同时,还给用户一个提醒,提醒他们现在用的是24小时制。
  14. 还要确保秒和分钟都在正确的范围内,
  15. 也就是0到59啦!
  16. 这个特殊的句法是Python的一大亮点,
  17. 它允许将多个比较强制合成一个。
  18. 现在我认为,59也不正确了。
  19. 有些年份里会有几秒被跳过(没听说过),如果某一秒跳过了,
  20. 那一分钟就等于有61秒了。
  21. 所以,为了彻底地正确,这里的上限应该改成60……
  22. 这仍是个非常简单的时间类,它只假设用到本地时间。
  23. 此时,我们不关心时区、日历或白天黑夜还是别的什么。
  24. 实际的时间类比这复杂得多。呃,扯远了,这些人经常扯远,
  25. 废话少说,来看看这些断言是否能帮助我们避免时间炸弹。
  26. 这里还是传递了一个字符串。
  27. 看看断言是否能捉住它。来,点一下,运行!
  28. 看!我们输入的是"Two minutes after midnight"字符串,断言失败鸟,
  29. 因为它不在0-23的范围之内。
  30. 如果把负值传递过去会如何呢?比如小时数有效,分钟为负数,
  31. 秒也有效,点运行,嗯,还是引发了失败。
  32. 我们看到是这个断言错误,即分钟不在正确的范围内,
  33. 这正是我们想要捉住的bug。
  34. 所以,有了上述的断言,任何企图设置时间对象
  35. 为非法状态的行为,都将遭到严厉的谴责,错了,都将立即被发现。