静态检查

本文是对MIT讲义Reading 1: Static Checking进行的总结


由于本人水平有限,本文难免会有不当之处,欢迎读者批评指正

注:原文链接请见文末

冰雹序列

  • 从n开始,如果n是偶数,则下一个数字是n/2,否则下一个数字是3-n+1,以此类推,直到得到1,序列结束

类型

  • 原始类型(primitive types) vs. 对象类型(object types)
  • 按着java的惯例,原始类型总是以小写字母开头,对象类型总是以大写类型开头
  • 重载(overloading): 同样的操作名可用于不同的数据类型

静态类型

  • 静态类型语言,如java,在编译阶段进行类型检查
  • 动态类型语言,如python,在运行阶段进行类型检查

静态检查,动态检查,不检查 (Static Checking, Dynamic Checking, No Checking)

静态检查:编译时(运行之前)找出bug
动态检查:运行时找出bug
不检查:这种语言不会帮助你找出错误,一切都要靠你自己

静态检查可以捕获以下错误:

  • 语法错误 例如额外的标点符号或者是错误拼写的单词。需要注意的是即使是像Python这种动态类型检查语言也会做这种静态检查
  • 方法名字错误 例如Math.sine(2).(正确的名字是sin())
  • 参数数量错误 例如Math.sin(20, 30)
  • 参数类型错误 例如Math.sin("20")
  • 返回值类型错误 例如本应该返回int,却写出了return "30"这种代码
    动态检查可以捕获以下错误:
  • 非法的参数值 例如除零错误就是一个动态检查的错误
  • 指针索引溢出
  • 空指针(在java中应该称为空引用)

菜鸟 vs. 工程师

菜鸟总是乐观的,因为他们会这么做:

  • Bad: 在测试之前写了很多的代码
  • Bad: 用脑子记所有的事情,而从不在程序中写注释来记录这些事,误认为自己永远不会忘掉这些事
  • Bad: 认为bug永远不会存在或者它们很容易被发现和修复

而工程师却是悲观的,他们会这么做:

  • Good: 每次写一点点,边写边测试
  • Good: 书写程序需要的注释
  • Good: 不让程序犯一些愚蠢的错误

讲义原文地址

Reading 1: Static Checking