【问题标题】:Is code clone a common practice in C,Java and Python? [closed]代码克隆是 C、Java 和 Python 中的常见做法吗? [关闭]
【发布时间】:2012-03-24 15:41:36
【问题描述】:

代码克隆,也称为Duplicate code,通常被认为对系统质量有害。

  1. 我想知道这些重复代码是否可以在标准 API 或其他成熟工具中看到。
  2. 如果确实如此,那么您认为哪种语言(如C、Java、Python、common lisp等)应该引入code clone实践的概率更高?

【问题讨论】:

  • 也许我很密集,但我很难弄清楚你到底在问什么。你能澄清一下吗?
  • @chesles 谢谢你的建议,我已经改变了一点。

标签: programming-languages duplicates language-design code-duplication


【解决方案1】:

无论使用哪种编程语言,代码克隆都非常普遍,是的,即使在 C、Python 和 Java 中也是如此。

人们这样做是因为这让他们在短期内更有效率;他们正在做代码重用。可以说它很糟糕,因为从长远来看,它会导致团队效率低下:克隆重用代码错误和假设,当这些错误和假设被发现并需要修复时,所有的代码克隆都需要修复,而进行修复的程序员不需要知道克隆在哪里,或者即使有。

我不认为克隆不好,因为代码重用效果。我认为不好的是没有管理它们。

为了帮助解决后一个问题,我构建了clone detectors (see our CloneDR),它使用编程语言的结构来指导搜索,自动查找准确和几乎未命中的重复代码。 CloneDR 适用于多种编程语言(包括 OP 语言集)。

在任何 100K SLOC 或更多的软件系统中,至少有 10% 的代码被克隆。 (好吧,好吧,Sun 的 JDK 是由一个非常优秀的团队构建的,他们只有大约 9.5%)。在较旧的传统应用程序中往往更糟;我怀疑是因为程序员出于自卫而克隆了更多代码。 (我见过克隆包含 50% 以上代码的应用程序,是的,这些程序往往很糟糕,原因有很多,而不仅仅是克隆)。

您可以在链接中查看多种语言的应用程序的克隆报告,查看统计信息,并查看克隆的外观。

【讨论】:

    【解决方案2】:

    所有的代码都是一样的,不管是谁写的。您引用的任何 API 都是由人类编写的,他们在此过程中做出了决定。我还没有看到完美的 API - 他们都在事后重做。

    克隆代码与 DRY 相悖,因此当然建议您不要这样做。这是有害的,因为更多代码意味着更多错误,而重复意味着您必须记住在所有克隆中修复它们。

    但每条规则都有其例外。我敢肯定,每个人都可以想到一种情况,在这种情况下,他们做了一些“最佳实践”和教条认为他们不应该做的事情,但他们还是做了。时间和其他限制并不总能让你做到完美。

    建议需要授予许可才能允许这样的事情对我来说是荒谬的。尽可能干燥。如果您最终违反了它,请了解您为什么这样做,并记住如果有机会就回去修复它。

    【讨论】:

    • +1 意识到有时您需要违反准则,并且您应该确保在这样做时知道为什么违反这些准则。但是,我会注意到,有时您不应该“返回并修复它”,因为违反准则的原因是不变的(即,您选择在紧密循环中重复相同的代码两次,因为将其拉出到方法会引入开销,并且您知道(测量)有问题的紧密循环已经是一个性能问题)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 2012-12-23
    • 2011-06-19
    • 1970-01-01
    相关资源
    最近更新 更多