测试开发

当前位置:首页 > 测试开发

测试驱动的面向对象软件开发(第七章)

第7章 实现面向对象设计

在风格上,随波逐流;在原则上,稳如磐石。

-Thomas Jefferson

7.1先写测试怎样有助于设计

我们在前一章概括介绍了设计原则一调用 者希望知道对象做什么和它的依赖关系,但不想知道它是怎么工作的。可以用这个原则发现正确的对象边界,这样它们就能和相邻对象很好地协作。

我们也希望一个对象代表一个内聚的单元,使它在更大的环境中具有意义。利用这样的组件构建的系统将具备配置灵活性,在需求变化时可以灵活地适应。

TDD从三个方面帮助我们实现这一点。首先,从测试开始意味着必须先描述我们要实现的目标,然后再考虑怎么做。这样的关注方式有助于让目标对象保持在正确的抽象层次上。如果单元测试的意图不清楚,那么我们可能混淆了一些概念,并未准备好开始编写产品代码。这也有助于信息隐藏,因为我们必须决定什么是对象之外可见的。

其次,要保持单元测试可以理解( 从而可以维护),就必须限制它的规模。我们曾见过长达几十行的单元测试,将它的测试要点埋藏在准备测试的代码中。这样的测试说明,它们要测试的对象太大了,需要分解成更小的组件。由此导致的组合对象应该有更清楚的关注点分离,因为我们消除了它的隐式结构,可以对提取出来的对象编写更简单的测试。

第三,为单元测试构造一个对象时必须向它传人它的依赖关系,这意味着我们知道这些依赖关系是什么。这促进了上下文无关性,因为我们必须能够建立目标对象的环境,然后才能对它进行单元测试一单元测试只是另一种上下文环境。需要注意的是,对于具有隐式依赖关系(或有太多依赖关系)的对象来说,准备单元测试是件痛苦的事,这促使我们对它进行清理。

在这一章中描述了如何利用增量式、测试驱动的方法来轻轻推动我们的代码,使之朝着前一章中描述的设计原则前进。

7.2通信比分类更重要

正如第2章中所说的,我们把运行的系统看成是一些互相通信的对象构成的网,所以需要把设计工作的重点放在弄清楚对象如何协作,以实现我们需要的功能。显然,我们希望实现设计良好的类结构,但我们认为对象之间的通信模式更重要。

在Java这样的语言中,我们可以利用接口来定义对象间可以使用的消息,但也需要定义它们的通信模式,即它们的通信协议。我们通过命名和惯例来做能做的事情,但语言中没有机制可以描述


文章评论

表情

共 0 条评论,查看全部
  • 这篇文章还没有收到评论,赶紧来抢沙发吧~