Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Testing TDD和DDD,同时仍了解该领域_Testing_Tdd_Domain Driven Design - Fatal编程技术网

Testing TDD和DDD,同时仍了解该领域

Testing TDD和DDD,同时仍了解该领域,testing,tdd,domain-driven-design,Testing,Tdd,Domain Driven Design,当您使用DDD从头开始一个新项目,但仍然不能很好地适应该领域时,TDD是有代价的。虽然您仍然了解域的详细信息,但是您发现了很多错误,比如在其他类中更有意义的方法,或者从构造函数中添加/删除参数,以及许多其他更改 这些变化非常频繁,特别是在一开始。每一个变更通常(希望如此)都需要在单元测试中进行一些变更,这增加了变更的成本(正如我前面所说的,变更仍然非常频繁) 我的问题是:即使在仍然有很多变化发生的情况下,TDD是否值得付出代价,但希望它们很快会变得不那么频繁(例如,一旦我们对该领域有了更好的了解

当您使用DDD从头开始一个新项目,但仍然不能很好地适应该领域时,TDD是有代价的。虽然您仍然了解域的详细信息,但是您发现了很多错误,比如在其他类中更有意义的方法,或者从构造函数中添加/删除参数,以及许多其他更改

这些变化非常频繁,特别是在一开始。每一个变更通常(希望如此)都需要在单元测试中进行一些变更,这增加了变更的成本(正如我前面所说的,变更仍然非常频繁)


我的问题是:即使在仍然有很多变化发生的情况下,TDD是否值得付出代价,但希望它们很快会变得不那么频繁(例如,一旦我们对该领域有了更好的了解)?

TDD应该对这种情况有所帮助,IMHO。单元测试的一部分用处在于,它们可以验证您在重构过程中没有破坏任何东西。是的,代码中的某些更改需要对测试进行更改,但这应该有助于澄清您正在做的事情,而不是让它变得更难。

我相信是这样。测试驱动开发的一部分是,您只构建您需要构建的东西——只构建使测试通过所需的东西。因此,如果为了更清楚地理解领域而需要更改代码中的某些内容,那么使用TDD方法的更改可能比不使用TDD方法的更改要少,因为您没有花时间构建不必要的东西


还有其他的优点——你知道你没有修改的代码部分仍然有效,因为它已经有了测试。即使您重写了50%的代码,您也会知道其他50%的代码是有效的。另外,您知道代码是可测试的——您一直在设计它以供测试。在没有设计单元测试的代码中添加单元测试通常是一件非常痛苦的事情——它通常是以一种非常难以测试的方式编写的。从一开始就进行测试的代码要好得多。

更改率越高,TDD越有用。与变更率高的项目相比,需求集已成定局的项目从TDD中获得的收益更少。

如果您仍在以相对较高的水平设计领域模型组件,那么您不应该编写单元测试。在开始编写任何代码之前,您需要了解问题域和类的职责

如果您正在处理类中的构造函数和参数,那么TDD不应该被认为是一种成本——它可以帮助您发现和修复设计中的问题。这是对更好的对象模型和更少的维护的投资

此外,如果您使用的是诸如ReSharper或CodeRush之类的重构工具,我发现大多数早期的更改实际上并没有那么糟糕——只是一些小的不便

当你还在理解 域的详细信息,你可以弄清楚 你做了很多错事,比如 在某些方面更有意义的方法 其他类,或添加/删除 构造函数中的参数,以及 许多其他变化

理解一个领域的过程是一个设计过程,TDD有助于理解这个过程,您必须理解TDD是一种设计技术

这个方法在其他类中更有意义-你会很快,很快地意识到这一点,使用TDD,因为你写这个方法的第一件事就是为它写一个测试。当您编写该测试时,您将看到(例如)您需要传入来自另一个类的许多成员,这将告诉您——在您编写该方法之前——“嘿,这属于那里!”


使用TDD减少您描述的客户流失。它不会消除它,但会减少它,因为你在按需进行微型设计。它是即时设计。

如上所述,TDD更多的是测试和证明您的设计,而不是单元测试。TDD不是单元测试,但单元测试可以从TDD中创建的测试发展而来

TDD绝对有助于理解领域模型。TDD可以用来帮助定义域模型,因为它是一种设计技术,如Carl Manaster所述。TDD将帮助您识别何时何地实现设计模式,如果/何时在错误的域中定义对象等