下一页 1 2 3 4
有效调试源自良好的编程。设计易于维护的程序是程序员面临的最困难挑战之一,其部分原因在于程序通常并不是由那些编写代码的程序员维护的。
为了有效维护这样的程序,新程序员必须能够快速了解程序的工作原理,如果程序员能够单独理解整个程序中各个小部分,那么就可以容易地了解程序的工作原理。
通过讨论可变性、可译码性、私有方法、最终方法、最终类、本地代码、单元测试以及重构问题,我们将简述编写程序的一些方法,以帮助使程序更易理解和维护。
可变性和可译码性
首先讨论可变性问题。如果在一个程序的计算期间,其每一部分所处理的数据都没有被该程序的其它、远程部分更改,那么就很容易单独理解该程序的各个部分。
太多信息
例如,请考虑一个使用容器类实例的程序,可以修改其中的成分链接。每次将容器从程序某一部分上的方法传递到该程序其它部分的方法,以及每次调用 new 表达式(其中容器被作为参数传递)时,容器就可能脱离调用方法的控制发生改变。
在我们首先理解调用方法调用的每个方法如何修改容器之前,我们不能真正确保我们理解了调用方法,由此我们诊断错误的能力也就更差。如果这些被调用的每个方法都依次调用其它修改方法,那么维护程序员为了理解单个方法必须阅读的代码总量会迅速增加,多得无法控制。
由于这个原因,对可变容器和不可变容器使用不同类会非常有利。在不可变版本中,容器的字段可以标记成 final。
求助于函数样式
相对于修改旧数据,为构造新数据而进行代码编写称为函数样式,因为程序的方法与数学函数相似,其行为是根据每个输入所返回的输出来单独描述的。
函数样式经常被忽略的优点是相当容易单独理解程序的个别组件。如果方法所操纵的数据决不会被其主体中执行的任何操作改变,那么程序员要理解该方法必须做的就是理解那些操作返回的结果。将之与前面的一个方法调用几个其它方法的方案相对照,那个方案中的其它几个方法都修改这一方法所操作的数据结构。
Java 语言的一个相当好的特性是它允许我们使用 final 关键字(作为类型检查器的伪指令)来声明何时我们要使某个数据成为不可变。
使用 final 关键字来避免变化是“钉住”类的方法行为的一个好方法。每次修改字段时,都有可能改变引用该字段的方法的行为。另外,将字段标记为 final 让阅读程序的其他程序员立即知道:不管整个程序有多大,决不要修改该字段。例如,请考虑下列表示不可变列表的类层次结构。