1

代碼複製也稱爲Duplicate code通常被認爲對系統質量有害。代碼克隆是C,Java和Python中的常見做法嗎?

  1. 我想知道這些重複的代碼是否可以在標準的API或其他成熟的工具中看到。
  2. 如果確實如此,那麼您認爲應該引入code clone練習的概率更高嗎?哪種語言(如C,Java,Python,Common Lisp等)
+1

也許我很密集,但我很難搞清楚你到底在問什麼。你能澄清嗎? – chesles 2012-03-24 15:47:13

+0

@chesles感謝您的建議,我已經改變了一下。 – 2012-03-24 15:53:42

回答

3

無論使用哪種編程語言,代碼克隆都非常常見,即使在C,Python和Java中也是如此。

人們這樣做是因爲它使它們在短期內有效;他們正在做代碼重用。它可以說是不好的,因爲它會導致組的長期低效:克隆重用代碼錯誤和假設,當發現並且需要修復時,所有代碼克隆都需要修復,修復的程序員不需要修復知道克隆的位置,或者即使有。

我不認爲克隆是壞的,因爲代碼重用效果。我認爲不好的是不管理他們。

爲了幫助解決後一個問題,我構建了clone detectors (see our CloneDR),它使用編程語言的結構來指導搜索,從而自動查找精確和幾乎錯過重複的代碼。 CloneDR適用於各種編程語言(包括OP的集合)。

在100K SLOC或更多的任何軟件系統中,至少有10%的代碼被克隆。 (好吧,Sun的JDK由一支非常優秀的團隊構建,他們只有9.5%左右)。在較老的傳統應用中,它往往更糟糕;我懷疑是因爲程序員從自我防禦中克隆了更多的代碼。 (我見過這樣的應用程序,其中的克隆包含50%以上的代碼,是的,這些程序由於許多原因往往會變得糟糕,而不僅僅是克隆)。

您可以在鏈接上看到克隆報告,查看幾種語言的應用程序,查看統計信息,並查看克隆的外觀。

3

所有代碼都是一樣的,不管是誰寫的。您引用的任何API都是由人類撰寫的,他們在此過程中作出決定。我還沒有看到完美的API - 所有人都事後才知道重做事情。

克隆代碼在DRY面前飛,所以當然建議你不要這樣做。這是有害的,因爲更多的代碼意味着更多的錯誤,重複意味着你必須記住將它們修復到所有的克隆中。

但是每個規則都有其例外。我敢肯定,每個人都可以想到他們做了一些「最佳實踐」,教條會說他們不應該這樣做的情況,但無論如何他們做到了。時間和其他限制並不總是讓你變得完美。

建議需要授予權限才能允許這樣的事情對我來說很荒唐。儘可能幹。如果你最終違反了它,請理解你爲什麼這麼做,並記住如果有機會回去修復它。

+0

+1,因爲有時候你需要違反準則,並且你應該確保你知道爲什麼當你這樣做時違反了這些準則。然而,我會注意到,有時你不應該「回去修復它」,因爲違反準則的原因是一個常數(即,你選擇在緊密的循環中兩次複製相同的代碼,因爲將它拉出到一個方法會引入開銷,並且您已經知道(測量)所討論的緊密循環已經是性能問題)。 – RHSeeger 2012-03-27 15:24:42