首先,我并不声称自己是 TDD 大师,但这里有一些基于您问题中的信息的想法。
我对上面 #1 的想法:正如您所提到的,您需要预先进行架构设计——如果没有这个,我想不出一种可以成功的方法。该架构为您的团队提供凝聚力和远见。您可能希望预先进行足够的设计,但这取决于您想要的敏捷程度。开发人员团队需要在开始编码之前知道如何将系统的各个组件组合在一起,否则这将只是一场大型黑客盛会。
如果有人可以提供一个示例和高级步骤来以这种方式组合一个系统,那就太好了
如果您正在组装一个由服务组成的系统,那么我将首先定义服务接口和它们将交换的任何消息。这定义了系统的各种组件将如何交互(这将是您预先设计的一个示例)。一旦有了这个,您就可以分配各种开发资源来并行构建服务。
至于#2;TDD 的优点之一是它在重构期间为您提供了一个“安全网”。由于您的代码包含单元测试,因此当您更改某些代码时,您很快就会知道是否有问题,特别是如果您正在运行持续集成(大多数人使用 TDD 方法)。在这种情况下,您要么需要调整单元测试以涵盖新行为,要么修复代码以使单元测试通过。
导致系统可以抽象出行为,以防止不得不重构大量代码
这取决于您的设计,例如使用策略模式来允许您抽象和替换行为。TDD 并没有规定您的设计必须受到影响。它只是要求您只做满足某些功能要求所需的事情。如果要求系统必须能够适应新的支付方式或定价模型,那么这就是您设计的重点。TDD 如果做得正确,将确保您满足您的要求并且您的设计是正确的。
我将重构视为生产系统中的巨大开销,其中数据模型更改会增加客户和公司的风险。
软件设计的问题之一是它是一个邪恶的问题这意味着重构几乎是不可避免的。是的,重构在生产系统中是有风险的,但是您可以减轻这种风险,TDD 将帮助您。您还需要有一个灵活的设计和一个低耦合的系统。TDD 将有助于减少耦合,因为您将代码设计为可测试的。编写可测试代码的副产品之一是减少了对系统其他部分的依赖;您倾向于对接口进行编码,从而允许您用模拟或存根替换实现。一个很好的例子是用返回一些已知数据的模拟/存根替换对数据库的调用——你不想在单元测试中访问数据库。我想我可以在这里提到一个好的模拟框架对于 TDD 方法是无价的(Rhino mocks和Moq都是开源的)。
我确信有一些真正的 TDD 大师可以给你一些智慧的珍珠……就我个人而言,我不会考虑在没有 TDD 方法的情况下开始一个新项目。