我们正在使用代码静态分析工具(Sonar)来检测项目中的重复代码。看起来代码中有很多重复的实例,但大多数都少于10行并且只出现一次。在Stackoverflow社区的“意见”中,您应该在何处绘制合并代码重复的界限?例如,对于单个副本,它应该是> = 10行,还是应该考虑重复的总行数,例如。考虑> 10个重复出现不止一次。 对于上下文,我正在研究的编程语言是Java和ActionScript。 我意识到这个问题可能没有得出明确的答案,但是对这个问题的一些明确的指导可以节省我很多时间重构代码(或者增加时间:) :( / p>
答案 0 :(得分:5)
如果它们是实际重复,请尽快合并。离开的时间越长,副本就越分散,越难。此外,当有人遇到一堆副本并需要进行“快速修复”时,他们会制作更多副本,但是一个干净的代码库可以鼓励每个人保持清洁。
答案 1 :(得分:4)
如果要执行相同的操作并且您希望将应用于一个副本的所有更改应用于其他重复项,则合并代码。你可能并不总是希望这种情况发生。您可能有两段代码,几乎完全相同,但实现完全不同的目的,以满足不同的要求。需求波动,很快你会发现,你统一的部分无法跟上不同方向发生的变化(我经常遇到这种情况,当过度使用时)。
因此规则很简单:整合执行相同操作的代码。不管多久。您不希望在1000个地方进行相同的更改。不要试图合并代码部分,除非你发现它们有足够的共同点,否则它们可能会被重构为一个有用的子程序。另外请注意,性能关键代码不是最佳实践的最佳位置。
答案 2 :(得分:2)
理想情况:现在整合。
更实际:对于像您这样的较小细分市场,一个好的测试是检查您是否为您找到的代码定义了一个有意义的目的。如果代码的目的可以用几个词来概括,那么你可以将它移动到一个单独的函数中。如果你不能总结它但它仍然是重复的,我会说离开它。
理想情况下,您的代码不应允许这样做,但在大多数代码中,多个内容最终会进入一个子例程 - 例如打开套接字并发送数据包的代码。理想情况下,这些是不同的东西,因此它们是不同的功能。如果你的生产代码不是那么完美,你可能最终得到套接字代码的结束,并且在稍后更改之前,数据包代码的开始是相同的(大约10行)。如果这些匹配,但您无法用几个词来描述它的功能,请留下它并在有时间时重新考虑其余的代码。
答案 3 :(得分:2)
仅在具有共同目的的情况下整合代码(特别是像您提到的10行的小块)。如果代码片段确实在执行不同的任务(但实现恰好相同),那么从设计的角度来看,合并它们并没有任何好处,如果你这样做,你可能不得不再将它们拆分出来。