由于我们学校(哈工大)大二软件构造课程的大部分素材取自此,也是推荐的阅读材料之一,于是打算做一些翻译工作,自己学习的同时也能帮到一些懒得看英文的朋友。另外,该课程的阅读资料中有许多练习题,但是没有标准答案,所给出的答案均为译者所写,有错误的地方还请指出。
译者:李秋豪
审校:
V1.0 Sun Mar 25 13:32:29 CST 2018
如何避开调试(debugging)
当你不得不进行调试时,如何确保它不会太复杂
最好的防御策略就是在设计上让Bug无法产生。
我们之前已经谈到过静态检查 。静态检查能够在编译期发现很多bug。
我们也看到了一些动态检查的例子。例如,Java会通过动态检查让数组越界访问的bug不可能存在。如果你试着越界访问一个数组或列表,Java就会在运行时报错。在一些更老的语言中,例如C和C++,这样的访问是允许的——可能会导致bug和 安全漏洞.
不可变性也是另一种防止bug的设计策略。在创建时,一个不可变类型的对象的值就确定了,接下来可以保证不会发生改变。
字符串是一种不可变类型。你无法通过String内置的方法更改它内部存储的字符。因此,字符串可以被安全地传入/分享给程序的各个地方。
Java也提供了不变的索引:如果一个变量声明时用final修饰,那么它的索引一旦确定就不能更改了。在实践中,你应该尽可能对方法、参数、本地变量使用final。正如变量的类型一样,final也是一种良好的文档,它告诉了读者这个变量索引的对象不会变为别的对象,而且这种检查也是静态的,由编译器负责。
思考下面这个例子:
final char[] vowels = new char[] { 'a', 'e', 'i', 'o', 'u' };