跳至內容

代碼重複

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

代碼重複(英文:duplicate code,也叫代碼複製)在程式設計中表示一段原始碼在一個程式,或者一個團體所維護的不同程式中重複出現,是不希望出現的現象。為避免巧合,只有一定數量的代碼完全相同才能判定為代碼重複。重複代碼的段落有時被稱為代碼複製,自動檢測代碼重複的過程叫做複製檢測

產生[編輯]

產生代碼重複可能有以下幾個原因:

  • 因為某段代碼能用就複製貼上過來。多數情況下代碼會有少許不同,如變數名稱改變或代碼增刪。
  • 因為要實現與已有功能類似的功能,開發者獨立寫出與別處相似的代碼。研究表明獨立撰寫的代碼在語法上不一定相似。[1]
  • 抄襲,即不經允許複製代碼,且未列出版權歸屬。
  • 代碼系自動生成。這時可能需要重複代碼以提高效能或方便開發。註:這裏代碼重複是指碼產生器自動生成的代碼,而非生成器本身的代碼。

成本與效益[編輯]

不恰當的代碼重複表明程式設計不良,例如缺少抽象。這會導致程式過長,錯誤更多,進而難以維護,因為需要人工尋找並修改重複的部分。[2]然而由於種種原因,適當的代碼重複難以避免,例如給與已有裝置相似的新裝置寫驅動程式時,複製代碼能使開發更便捷。[3]

當複製具有軟件漏洞的代碼時,如果開發人員不知道這樣的副本,則複製的代碼中可能會繼續存在漏洞。代碼重構可以改善許多軟件的度量衡標準,例如原始碼行數,循環複雜度耦合度。這可能會縮短編譯時間,降低認知負載,減少人為錯誤,減少被遺忘或被忽視的代碼。

但並不是所有的代碼重複都可以被重構。如果程式語言提供不充分或過於複雜的抽象,複製或許是具有速度效益上的解決方式,特別是修改代碼使用的編輯器如有支援區塊(行)編輯的功能。而且,重構時破壞代碼的風險可能會超過維護的效益。重複的代碼似乎不會比不重複的代碼更容易出錯。使用開源方式共用代碼組件,而不是在軟件組態管理的倉儲庫之間複製它們,也可以減少複製。

檢測[編輯]

檢測代碼重複的手段有:

例子[編輯]

以計算整數陣列平均值的代碼片段為例

extern int array1[];
extern int array2[];
 
int sum1 = 0;
int sum2 = 0;
int average1 = 0;
int average2 = 0;
 
for (int i = 0; i < 4; i++)
{
   sum1 += array1[i];
}
average1 = sum1/4;
 
for (int i = 0; i < 4; i++)
{
   sum2 += array2[i];
}
average2 = sum2/4;

這兩個迴圈可以覆寫為一個函數:

int calcAverage (int* Array_of_4)
{
   int sum = 0;
   for (int i = 0; i < 4; i++)
   {
       sum += Array_of_4[i];
   }
   return sum/4;
}

利用以上函數可以寫出無重複的原始碼

extern int array1[];
extern int array2[];

int average1 = calcAverage(array1);
int average2 = calcAverage(array2);
Example of duplicate code fix via code replaced by the method

參見[編輯]

參考資料[編輯]

  1. ^ Code similarities beyond copy & paste頁面存檔備份,存於互聯網檔案館) by Elmar Juergens, Florian Deissenboeck, Benjamin Hummel.
  2. ^ Spinellis, Diomidis. The Bad Code Spotter's Guide. InformIT.com. [2008-06-06]. (原始內容存檔於2012-10-18). 
  3. ^ Kapser, C.; Godfrey, M.W., ""Cloning Considered Harmful" Considered Harmful頁面存檔備份,存於互聯網檔案館)," 13th Working Conference on Reverse Engineering (WCRE), pp. 19-28, Oct. 2006
  4. ^ Brenda S. Baker. A Program for Identifying Duplicated Code. Computing Science and Statistics,24:49–57, 1992.
  5. ^ Ira D. Baxter, et al. Clone Detection Using Abstract Syntax Trees頁面存檔備份,存於互聯網檔案館
  6. ^ Visual Detection of Duplicated Code頁面存檔備份,存於互聯網檔案館) by Matthias Rieger, Stephane Ducasse.
  7. ^ Yuan, Y. and Guo, Y. CMCD: Count Matrix Based Code Clone Detection, in 2011 18th Asia-Pacific Software Engineering Conference. IEEE, Dec. 2011, pp. 250–257.
  8. ^ Chen, X., Wang, A. Y., & Tempero, E. D. (2014). A Replication and Reproduction of Code Clone Detection Studies頁面存檔備份,存於互聯網檔案館). In ACSC (pp. 105-114).