Avi*_*viD 11 testing tdd design-patterns
我的意思是,有时建筑师希望以牺牲其他重要力量为代价来简化和提高可测试性.
例如,我正在审查一个非常复杂的应用程序,通过广泛使用过度支持测试的设计模式来实现,例如IoC,DI,AOP等......
现在,我通常喜欢这些东西,但这个系统应该是更简单 - 虽然不仅仅是数据库上CRUD的简单Web前端,但它仍然没有那么复杂(甚至考虑到一些内部工作流程,流程等).另一方面,只是审查代码成为heinie的主要痛苦,几乎不可读(即使它写得很好),编码一定是痛苦的.
实施的复杂性明显违反KISS(原则,而不是乐队)......"唯一"的好处是提高可测试性,使用测试框架和模拟和...
现在,在TDD粉丝跳过我之前,我并没有贬低可测试性的重要性,但我在质疑考虑这种特定力量(对所有其他力量)的至高无上的地位.
还是我错过了什么?
我想补充一点 - 在我看来,所有关于"可测试性"的讨论都是关于单元测试的,这与整个系统测试不同,并且当各个单元集成在一起时可能导致错过测试.至少,这似乎是用于测试的IoC/DI的重点......
另外,我指出这个系统(以及我见过的其他系统)每个接口只有一个具体对象,而IoC/DI仅用于 - 您猜对了 - 用测试模型替换具体对象仅用于测试.
虽然程序编程中的危险是以意大利面条代码结束,但使用控制反转时的危险以通心粉代码结束
是的,这完全表达了我的感受:D
Don*_*son 13
TDD做得好可以提高可读性.TDD表现不佳,即不考虑其他重要原则,可能会降低可读性.
我在90年代中期与之合作的人会说:"你总是可以通过增加一层间接来使系统更加灵活.你可以通过删除一层间接来使系统更简单." 灵活性和简单性都是系统的重要特性.这两个原则通常可以和谐共处,但往往它们相互作用.如果你走向一个极端或另一个极端,你就会摆脱存在这两个原则平衡的理想.
TDD部分是关于测试,部分是关于设计.TDD表现不佳可能会对灵活性或简单性产生过多影响.它可以推动太多的灵活性.对象变得更加可测试,并且通常更简单,但是域问题的固有复杂性随后被推出对象到对象的交互中.我们获得了灵活性,对于幼稚的眼睛,它看起来好像我们已经获得了简单,因为我们的对象更简单.然而,复杂性仍然存在.它被移出对象,进入对象交互,在那里它更难控制.这里有代码气味可以作为红色标志 - 一个拥有数百个小对象而没有更大对象的系统就是其中之一,许多只有一行方法的对象是另一个.
TDD表现不佳也可以向另一个方向发展,也就是说,太简单了.因此,我们首先编写测试来进行TDD,但它对我们的设计影响不大.我们仍然有很长的方法和巨大的对象,这些是代码气味,可以标记这个问题.
现在TDD本质上不会让你在任何一个方向上失去平衡,只要它得到很好的应用.使用其他做法让您保持正轨.例如,在您执行此操作之前绘制您正在执行的操作的图片.显然,不是所有的时间.有些事情太简单了.有些图片值得保存,有些只是草图,可以帮助我们将问题可视化,而且我们在不同程度上主要是视觉学习者.如果你无法画出问题的图片,你就不明白了.
这对TDD有何帮助?这将有助于防止系统在灵活性方面走得太远,远离简单性方面.如果你画一幅画并且它很难看,那就是一面红旗.有时它是必要的,但通常当你画画时,你的思想会很快看到可以简化的东西.该解决方案变得更加优雅和简化,更易于维护,并且更加愉快.如果您不能或不会绘制系统图片,那么您将失去这个机会,使您的软件更加坚固,更优雅,更美观,更易于维护.
应用这一点需要经验,有些程序员永远不会理解良好平衡所提供的价值.没有可以运行的指标可以告诉您在正确的位置.如果有人给你一个规定的方法来达到这个和谐点,他就骗你了.更重要的是,他可能在没有意识到的情况下对自己撒谎.
所以,我对你的问题的回答是'是':测试一切而不忘记其他好的原则.
如果与其他良好做法不平衡,任何好的做法都会让你偏离正轨.
"我错过了什么?"
是.
事情有效,不是吗?
而且,更重要的是,您可以证明它有效.
与实际可行的事实相比,为可测试性增加的相对复杂程度并不是非常有趣,并且您可以证明它实际上是有效的.此外,您可以进行更改并证明您没有破坏它.
替代方案(可能或可能不起作用,无法证明其是否有效,不能在不破坏的情况下进行更改)会将软件的价值降低到零.
编辑
"复杂性"是一个滑稽的概念.有复杂的客观衡量标准.更重要的是复杂性增加所带来的价值.复杂性的增加为您提供了可测试性,可配置性,后期绑定性,灵活性和适应性.
此外,复杂性的客观度量通常集中在方法内的编码,而不是类和对象之间关系的更大复杂性.复杂性似乎是客观的,但它并未在软件架构的所有层次上定义.
"可测试性"也很滑.可能存在可测试性的客观测量.然而,大多数情况下,这些都是为了测试覆盖范围.测试覆盖率不是一个非常有意义的指标.生产崩溃的可能性如何随测试覆盖范围而变化?它没有.
您可以将注意力集中在可测试性上.你可以把许多事情归咎于复杂性.如果仔细观察高度可测试的代码,您会发现它也非常灵活,可配置且适应性强.
单挑"可测试性"作为"复杂性"的根本原因忽略了这一点.
关键是有许多相互关联的质量因素."它有效"是一种总结最重要的方法.其他不太重要的包括适应性,灵活性和可维护性.这些附加因素通常与可测试性相关,并且它们也可以被描述为"复杂性".
归档时间: |
|
查看次数: |
917 次 |
最近记录: |