软件建设(Software Construction)
静态检查(static checking)
主题
- 静态检查。
- 好软件的三个属性。
类型
类型是一组值,可对它们进行操作。java有几种原始类型:
- int
- long
- boolean
- double
- char等
以及对象类型:
- String
- BigInteger
java约定,原始数据类型是小写,而对象类型(Object Type)首字母大写。
操作一般有几种类型:
- 中缀、前缀和后缀操作。如a+b , –a , a++。
- 对象的方法。如bigint.add(bigint2)。
- 一个函数。如Math.abs(-1).
静态类型
java是一种静态类型语言。所有变量的类型在编译时期(程序运行之前)都已知,并且编译器可以推断出所有表达式的类型。例如a和b都是int类型,那么a+b也是int类型。IDEA或Eclipse在你编写代码的过程中这样做,因此你可以在你编程的过程中发现很多bug.
动态语言如Python,这种类型的检查需要在程序执行时才会执行。
静态类型是一种特殊的静态检查(static checking),意味着可在编译时期检车bugs。在本课程中很多点子都是为了消除bugs而存在的,而静态检查就是首选的点子,以下代码就会报错:
"5" * "6" //字符串之间不能进行相乘操作
静态检查、动态检查,不检查
一种语言提供:
- 静态检查:在程序执行之前自动被发现。
- 动态检查:程序执行期间被发现。
- 不检查:语言不帮你找到bugs,需要开发者自己去查看,解决错误。
静态检查可以发现:
- 语法错误。如额外的标点符号或者虚假的词语。
- 错误名称。如
Math.sine(2)
。 - 参数个数错误。如
Math.sin(20,30)
. - 参数类型错误。如
Math.sin("30")
. - 返回值错误。如函数要求返回int,而程序为
return "30"
。
动态检查可以发现:
- 不合法的参数值。如除法中,分母不能为0。
- 造型异常。
- 超出索引允许范围。
- 空指针异常。
obj.sayHi()
,obj为null
。
建议与非建议
建议
- 编写一些程序,进行一次测试。
- 注释好你代码所依赖的东西。如先决条件等。
- 充分利用静态代码检查。不要假设你的代码无bug,或者容易发现和修复。
目标
- safe from bug。现在表现正确,将来也表现正确。
- easy to understand。代码要能与将来的开发者沟通,因为他们要修复bug或者增加新功能。将来的开发者可能是你,如果你没有让你的代码易于理解,你将追悔莫及,反之则庆幸万分。
- ready to change。软件总在不断改变,一些设计使之易于改变。而一些代码只能丢弃或者重写。
总结
- safe from bug。静态检查在程序执行之前帮助我们排除error.
- easy to understand。类型已经明确表示,是故帮助我们理解。
- ready to change。静态检查让你容易改变代码,因为在你改变代码的时候,静态检查会明确其它需要一起改变的地方。如,int a = 100。如果你改成int a2 = 100。那么引用它的所有地方都报错。