正在优化一个单元测试良好实践的类,还是为时过早?

我已经在StackOverflow上看到过很多关于过早优化的问题 - 在大街上说的是,它是所有邪恶的根源。 :PI承认我经常犯此罪; 我并不真正以代码可读性为代价来优化速度,但我会用逻辑方式重写我的代码,使用更适合于任务的数据类型和方法(例如,在Actionscript 3中,使用类型化的Vector而不是非类型化的Array为迭代),如果我可以让我的代码更优雅,我会这样做。 这通常会帮助我理解我的代码,并且我通常知道为什么要进行这些更改。

无论如何,我今天在想 - 在OOP中,我们推动封装,试图隐藏实现并提升接口,这样类就会松散耦合。 这个想法是做出一些有用的东西,而不必知道内部发生了什么 - 黑盒子的想法。

因此,这是我的问题 - 尝试在类级别对代码进行深度优化是明智的,因为OOP促进了模块化? 或者这是否属于过早优化的范畴? 我在想,如果你使用的语言很容易支持单元测试,那么你可以测试,基准测试和优化类,因为它本身就是一个能够输入输出的模块。 但是,作为一个编写代码的人,我不知道是否等到项目完全完成才能开始优化是否明智。

作为参考:我以前从来没有在一个团队工作过,所以对于有这种经历的开发人员来说显而易见的东西对我来说可能是陌生的。

希望这个问题适用于StackOverflow - 我没有找到另一个直接回答我的查询。

谢谢!

编辑:思考这个问题,我意识到“剖析”可能是正确的术语,而不是“单元测试”; 单元测试检查模块是否按原样工作,而分析检查性能。 另外,我之前应该问过的问题的一部分 - 在创建完单个模块后对其进行性能分析,而不是在应用程序完成后减少时间分析?

我的问题源于我正在尝试做的游戏开发 - 我必须创建应该以最佳方式执行的模块,例如图形引擎(无论它们是不同的故事:D)。 在性能不那么重要的应用程序中,我可能不会担心这一点。


我并没有真正以代码可读性为代价来优化速度,但我会用逻辑方式重写我的代码,使用更适合任务的数据类型和方法,如果我可以让我的代码更加优雅,我会照办的。 这通常有助于我理解我的代码

这不是真正的优化,而是重构更简洁的代码和更好的设计*。 因此,这是一件好事,它应该以小增量连续实践。 鲍勃马丁叔叔(在他的“清洁代码”一书中)推广了适用于软件开发的童子军规则:保持代码比你找到的更干净。

因此,为了回答您的标题问题,是的,重构代码以使其可以单元测试是一种很好的做法。 其中一个“极端”是测试驱动开发,其中一个先写测试,然后添加使测试通过的代码。 这种方式从一开始就创建了单元可测试的代码。

*不要太挑剔,只是澄清通用术语并确保我们使用相同含义的相同术语是有用的。


诚然,我认为最优化的优化应该作为最后的任务(尽管可以认识到在写第一稿的时候可能需要返回并优化的地方)。 这并不是说你不应该迭代地重新考虑事情,以保持代码的秩序和清洁。 也就是说,如果某件事目前达到了目的并且不符合应用程序的要求,那么首先应该解决这些要求,因为最终它们是您负责交付的内容(除非要求包含最大请求时间或沿着这些线)。 我同意科林的方法论,如果时间允许优化你的心灵内容(或者理论极限,以先到者为准),则首先为功能建立。


过早优化是一件坏事的原因是:它可能需要很长时间,并且您不知道您的时间最适合您的时间。

例如,您可以花费大量的时间优化一个类,只是发现应用程序的瓶颈是网络延迟或类似的因素,这在执行时间方面会更加昂贵。 因为从一开始就没有完整的图片,过早的优化会导致您的时间不够理想。 在这种情况下,您可能宁愿修复延迟问题,而不是优化类代码。

链接地址: http://www.djcxy.com/p/6735.html

上一篇: Is optimizing a class for a unit test good practice, or is it premature?

下一篇: Ideas for good performance optimisations in C++