YouTube

Got a YouTube account?

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

Chinese, Simplified subtitles

← 04-05 Art Of Deduction

Get Embed Code
3 Languages

Showing Revision 1 created 10/02/2013 by 秀隆 杨.

  1. 毋庸置疑,福尔摩斯放现在绝对是个出色的程序调试——艺术家,
  2. 只要他能投胎到现在。(译者估计他还是会当侦探,有些人天生喜欢冒险)
  3. 而现实中,我们会面对的问题应该这么来描述吧:
  4. "某件不可能发生的事件发生了,唯一确定的信息就是它,确实发生了。"
  5. 那么,我们就只能从结果来逆向推导,发现起因所在了。
  6. 又引用Kernighan和Pike的《程序设计实践》,
  7. 从结果逆向思考,
  8. 这就是推理的艺术在调试过程中的应用。
  9. 让我来解释下吧——它的整个流程——有个熟悉的例子。
  10. 老朋友了,remove_html_markup函数,
  11. 再小小地帮你们回忆下吧,这个函数设计用来接收HTML的输入,
  12. 比如这个:见屏幕……
  13. 一个,一个,(这句继续看屏幕好了,不要看我。)
  14. 把这个转化成一段文本,里面不再有HTML标签,标签被删掉。
  15. 它里面利用到了一些变量:
  16. tag这个用来检查当前是否处于标签处理的状态中。
  17. 在处理这几个字符时,tag应该为真。
  18. 也只有当我们不处于tag模式时,才会
  19. 把字母加入到out变量中。
  20. out变量在最后时就返回。
  21. 所以,在我们处理这个输入时,
  22. 这三个字母时,tag应该为真。
  23. 然后假一下。
  24. F O O就加到输出变量里了。
  25. 最后,又有4个标签字母不会回到输出里。
  26. 所以,结果就是得到这个字符串了——foo.
  27. 好,现在让我们用这个例子来学学推理的艺术。(前面是不是啰嗦了点。)
  28. 从这个观察结果开始,就是最后的这个断言
  29. 它没通过的这个结果。
  30. 所以我们现在知道了,这段代码可以产生出一段输出,
  31. 就是HTML标签还勉强地存在着。
  32. 我们一开始就只有这么一个观察到的结果。
  33. 现在开始,推理吧!
  34. 先看看,这个断言失败的可能是什么。
  35. 哦,就是out变量里起码有一个opening标签,
  36. 也就是一个 < 小于号。
  37. 唯一一个可以把这个小于字符加入
  38. 到out变量 的地方,就是这里。
  39. 为了能运行这一行,就一定会满足一些条件的。
  40. 这些if else什么的,就统统为假了。
  41. 而这一个not tag则必须,一定加肯定是成立的。
  42. 让我们聚焦在这个tag变量。
  43. 那么此时的tag变量的值是多少,
  44. 当这个小于号被加入到out变量里的时候?
  45. 该你了。