我从TDD的实践者那里听到很多东西,TDD的优势之一是它迫使开发人员遵循SOLID原则(单一职责,开放式封闭,Liskov替代,接口隔离和依赖倒置)。但是对我而言,只需编写一些测试(主要是单元测试)就足以理解遵循SOLID(从而创建可测试的体系结构)非常重要。
TDD是否会迫使开发人员更积极地遵循SOLID,而不仅仅是编写单元测试?
我从TDD的实践者那里听到很多东西,TDD的优势之一是它迫使开发人员遵循SOLID原则(单一职责,开放式封闭,Liskov替代,接口隔离和依赖倒置)。但是对我而言,只需编写一些测试(主要是单元测试)就足以理解遵循SOLID(从而创建可测试的体系结构)非常重要。
TDD是否会迫使开发人员更积极地遵循SOLID,而不仅仅是编写单元测试?
Answers:
首先,TDD并不严格强迫你写可靠的代码。如果愿意,您可以执行TDD并创建一个大混乱。
当然,了解SOLID原理会有所帮助,因为否则您可能最终对许多问题都没有一个好的答案,因此编写了不好的代码并伴随着不好的测试。
如果您已经了解SOLID原则,TDD会鼓励您考虑并积极使用它们。
就是说,它并不一定涵盖SOLID中的所有字母,但强烈鼓励并促进您至少部分地编写SOLID代码,因为这样做会使后果立即可见并令人讨厌。
例如:
遵循“打开/关闭”原则可能会很好地帮助在代码后编写的测试,因为它通常使您可以覆盖从被测类派生的测试类中的外部服务调用。在TDD中,我认为这不是其他原则所必需的,但我可能会误解。
如果您想最小化类的更改以接收不支持的实例,而该实例恰好实现了相同的静态类型的接口,那么遵循Liskov替换规则将非常有用,但是在适当的测试用例中这不太可能发生,因为通常不会通过任何测试中的类依赖项的真实世界实现。
最重要的是,制定SOLID原则是为了鼓励您编写更简洁,更易理解和可维护的代码,TDD也是如此。因此,如果您正确执行TDD,并且注意代码和测试的外观(并且并不难,因为您会立即获得反馈,API和正确性),那么通常您就不必担心SOLID原则。
是的:TDD主要是一种好的设计技术(仅次于测试技术)。尽管仍然可以使用带有大量代码气味的TDD(病理性)示例,但它对于实现坚实的原理非常有帮助。
在这个伟大的Hansminute播客中,“测试驱动开发是设计-TDD的最后决定”,对TDD与扎实的原则之间的联系提出了争议(带有以上结论)。