静态检查、动态检查、无检查
编程语⾔通常能提供以下三种⾃动检查的⽅法:
静态检查: bug在程序运⾏前发现
动态检查: bug在程序运⾏中发现
⽆检查: 编程语⾔本⾝不帮助你发现错误,你必须通过特定的条件(例如输出的结果)检查代码的正确性。
很明显,静态检查好于动态检查好于不检查。
静态检查
- 语法错误,例如多余的标点符号或者错误的关键词。即使在动态类型的语⾔例如Python中也会做这种检查: 如果你有⼀个多余的缩进,在运⾏之前就能发现它。
- 错误的名字,例如 Math.sine(2) . (应该是 sin .)
- 参数的个数不对,例如 Math.sin(30, 20) .
- 参数的类型不对 Math.sin("30") .
- 错误的返回类型 ,例如⼀个声明返回 int 类型函数 return "30" ;
动态检查
- ⾮法的变量值。例如整型变量x、y,表达式 x/y 只有在运⾏后y为0才会报错,否则就是正确的。
- ⽆法表⽰的返回值。例如最后得到的返回值⽆法⽤声明的类型来表⽰。
- 越界访问。例如在⼀个字符串中使⽤⼀个负数索引。
- 使⽤⼀个 null 对象解引⽤。
由此看出静态检查倾向于类型错误 ,即与特定的值⽆关的错误,动态类型检查倾向于特定值才会触发的错误,即在运行时才能知道的具体值引发的错误。
工程派的代码风格
优点: ⼀次只写⼀点点, ⼀边写⼀边测试.
优点: 记录代码的设想、意图 (document the assumptions that your code depends on)
优点: 静态代码检查将会保护你的代码不沦为“愚蠢的代码”
学习软件构造的三个重要目标
本门课程的主要⽬标为学习如何⽣产具有如下属性的软件:
安全健壮性. 正确性 (现在看起来是正确的), 防御性 (将来也是正确的)
可读性. 我们不得不和以后有可能需要理解和修改代码的程序员进⾏交流 (修改 BUG 或者添加新的功能), 那个 将来的程序员或许会是⼏个⽉或者⼏年以后的你, 如果你不进⾏交流, 那么到了那个时候, 你将会惊讶于你居然 忘记了这么多, 并且这将会极⼤地帮助未来的你有⼀个良好的设计。
可改动性. 软件总是在更新迭代的, ⼀些好的设计可以让这个过程变得⾮常容易, 但是也有⼀些设计将会需要让 开发者扔掉或者重构⼤量的代码。