【IT168 技术文章】
要保证架构的稳定和成功,利用代码对架构进行验证是一种实用的手段。代码验证的核心是测试,特别是单元测试。而测试的基本操作思路是测试优先,它是敏捷方法中非常重要的一项实践,是重构和稳定核模式的重要保障。
面向对象体系中的代码验证
代码验证是保证优秀的架构设计的一种方法,同时也是避免出现象牙塔式架构设计的一种措施。我们在上一篇稳定化中提到说架构设计最终将会体现为代码的形式,因此使用形式化的代码来对架构进行验证是最有效的。
由于是代码验证,因此就离不开编写代码,而代码总是和具体的语言、编译环境息息相关的。在这里我们主要讨论面向对象语言,代码示例采用的Java语言。利用面向对象语言来进行架构设计有很多的好处:
首先,面向对象语言是一种更优秀的结构化语言,比起非面向对象语言,它能够更好的实现封装、降低耦合、并允许设计师在抽象层次上进行思考。这些因素为优秀的架构设计提供了条件。
其次,面向对象语言可以允许设计师只关注在框架代码上,而不用关心具体的实现代码。当然,这并不是说非面向对象的语言就做不到这一点,只是面向对象语言的表现更优秀一些。
最后,面向对象语言可以进行很好的重用。这就意味着,设计师可以利用原有的知识、原有的软件体系,来解决新的问题。
此外,利用Java语言,还可以获得更多的好处。Java语言是一种面向接口的语言。我们知道,Java语言本身不支持多重集成,所有的Java类都是从Object类继承下来的。这样,一个继承体系一旦确定就很难再更改。为了能够达到多重继承的灵活性,Java引入了接口机制,使用接口和使用抽象类并没有什么不同的地方,一个具体类可以实现多个接口,而客户端可以通过申明接口类型来使用,如下面这样:
List employees=new Vctor();
如果需要将Vctor换成LinkedList,那么除了上面的创建代码,其它的代码不需要再做更多的修改。而Vctor这个具体类除了实现List这个接口以外,还实现了Cloneable、Collection、 RandomAccess、Serializable。这说明除了List接口之外,我们还可以通过以上所列的接口来访问Vector类。因此接口继承能够成为类继承的补充手段,发挥十分灵活的作用。同时又避免了多重继承的复杂性。但是接口中只能够定义空方法,这是接口的一个缺陷。因此在实际编程中,接口和抽象类通常是一起使用的。我们在Java的java.util包中看到Collection接口以及实现Collection接口的AbstractCollection抽象类就是这方面的例子。你可以从AbstractCollection抽象类(或其某个子类)中继承,这样你就可以使用到AbstractCollection中的缺省代码实现,由于AbstractCollection实现了Collection接口,你的类也实现Collection接口;如果你不需要利用AbstractCollection中的代码,你完全可以自己写一个类,来实现Collection接口(这个例子中不太可能发生这种情况,因为工具类的重用性已经实现设计的非常好了)。Java中有很多类似的例子。Java语言设计并不是我们讨论的重点,更加深入的讨论可以参看专门的书籍,这里我们就不作太多的介绍了。
以上花了一些篇幅来讨论面向对象设计和面向接口设计的一些简单的预备知识。这些知识将成为代码验证的基础。