代码之家  ›  专栏  ›  技术社区  ›  Julien Hoarau

您使用什么重复检测阈值?[关闭]

  •  3
  • Julien Hoarau  · 技术社区  · 16 年前

    我们都同意重复是邪恶的,应该避免(不要重复自己的原则)。 为了确保这一点,静态分析代码应该像 Simian (多种语言)或 Clone Detective (Visual Studio加载项)

    我刚读 Ayende's post about Kobe 他说的是:

    8.5%的Kobe是复制和粘贴代码。这是敏感的 如果我们设置了阈值,则拨得很高 到3,这是我通常做的,是 高达12.5%。

    我认为3作为阈值是非常低的。 在我的公司,我们提供质量代码分析作为一项服务,我们的默认复制阈值设置为20,并且有很多重复。我无法想象,如果我们将其设置为3,我们的客户甚至不可能考虑更正。

    我理解Ayende对Kobe的看法:这是一个官方样本,市场上称为,旨在指导您规划、架构和实施Web2.0应用程序和服务。因此,对质量的期望很高。

    但对于您的项目,您使用什么最小阈值进行复制?

    相关问题: How fanatically do you eliminate Code Duplication?

    6 回复  |  直到 10 年前
        1
  •  3
  •   dsimcha    16 年前

    三是一个很好的经验法则,但要看情况而定。为了消除重复,重构常常涉及到将代码库和API的概念简单性与较小的代码库进行权衡,后者一旦有人理解了,就更容易维护。我通常是从这个角度来评价事物的。

    在一个极端,如果修复重复使代码更具可读性,并且几乎没有或根本没有增加代码的概念复杂性,那么任何重复都是不可接受的。举个例子,当重复的代码整齐地分解成一个简单的引用透明的函数,它可以做一些易于解释和命名的事情。

    当需要更复杂、更重的解决方案(如元编程、OO设计模式等)时,我可能会允许4或5个实例,特别是在复制片段很小的情况下。在这些情况下,我认为解决方案的概念复杂性使得治疗比疾病更糟糕,直到有很多实例。

    在最极端的情况下,我所使用的代码库是一个快速发展的原型,我不知道项目可能朝着什么方向发展,从而绘制出既合理简单又合理未来证明的抽象线,我只是放弃了。在这样一个代码库中,我认为最好只关注权宜之计并完成一些事情,而不是好的设计,即使同一段代码重复了20次。通常,正在创建所有复制的原型部分都是那些将很快被丢弃的部分,而且一旦您知道原型的哪些部分将被保留,就可以随时重构这些部分。如果没有将被丢弃的部件所创建的附加约束,重构在这个阶段通常更容易。

        2
  •  3
  •   Brian    16 年前

    我不知道什么是一个好的“度量标准”,但我会说,我通常努力的是

    • 如果在两个地方有相同的代码,并且
    • 代码在意图上是相同的(而不仅仅是巧合地相同)

    然后重构以消除重复。所有的复制都是坏的。我很少让代码出现在两个地方,而在三个地方,它肯定会消失。

        3
  •  1
  •   grover    16 年前

    我个人对此相当狂热。我试图设计我的项目以避免代码重复。我的目标是在较低的单个数字中获得阈值,如果我不能达到这一点,这意味着我的设计不够好,我需要回到绘图板或重构。

        4
  •  1
  •   Ken    15 年前

    取决于编程语言。(这位“克隆侦探”似乎认识到了这一点:“编程语言约束”是他第一次展示的方框之一。)

    在Lisp程序中, 任何 重复的表达式很容易被重构——我猜你会称之为阈值2。所有东西都由表达式组成,并且有宏来翻译表达式,所以很少有借口重复任何东西,甚至一次。(我能想到的唯一一件很难提取的事情就是循环子句,事实上,许多人出于这个原因提倡避免循环。)

    在许多其他语言中,程序由具有具有语句的方法的类组成,因此很难只提取表达式并将其用于两个不同的文件中。它通常意味着在提取时改变事物的结构。通常还有一个类型安全的要求,这是有限制的(除非你想写一个 整批 一直在使用反射代码来逃避它,但是如果这样做了,就不应该使用静态语言)。如果我使当前静态类型的程序完全干涸,那么它既不短也不容易维护。

    我想结果是我们真正想要的是“易于维护”。有时,在某些语言中,这意味着“只需在此处放置一个注释,说明您复制的内容和原因”。dry是可维护代码的良好指标。如果你经常重复,那不是个好兆头。但是,追踪任何一个统计数据也往往是不好的——否则,我们只需对此进行优化就可以解决所有的问题。

        5
  •  1
  •   Ian Ringrose    15 年前

    我想我们需要结合

    • 重复的行数
    • 复制副本的次数
    • __close_157;是如何相互复制的?
      例如,如果不同的产品恰好在同一个源代码控制系统中,那么它们在相同的方法中是非常不同的。
    • 自包含重复代码的任何方法被更改以来的时间。

    以便在删除重复项的成本/效益之间取得良好的平衡。

        6
  •  0
  •   Ira Baxter    10 年前

    我们的 CloneDR 在大型源系统中查找由langauge语法参数化的重复代码(精确复制和未遂)。它支持Java、C语言、COBOL语言、C++语言、PHP语言等多种语言。

    它接受许多参数来定义“什么是克隆?”,包括: a)相似阈值,控制两个代码块之间的相似程度 要声明的克隆(通常95%是好的) b)最小克隆大小的行数(3个往往是一个不错的选择) c)参数数量(文本有明显的变化;5个是一个不错的选择) 使用这些设置,它会发现实际上10-15%的冗余代码 它所处理的一切。