Дублювання коду

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Дублювання коду — термін відомий із програмування, під яким розуміється, що деякі ділянки вихідного коду можуть зустрічатися більш, ніж один раз, як всередині однієї, так і в всередині декількох програм. Дублювання є ознакою так званого «поганого коду» або «коду з запахом» (англ. Code smell),[1] тому що саме через дублювання збільшується довжина коду. Послідовності дублікатів іноді називають клонами.

Причини за яких дві частини коду можуть вважатися дублікатами[ред.ред. код]

  • Посимвольний збіг;
  • Посимвольний збіг, з ігноруванням пробільних символів і коментарів;
  • Збіг за лексемами;
  • Частковий збіг за лексемами;
  • Функціональний збіг;

Звідки з'являються дублікати коду[ред.ред. код]

Причини виникнення дублікатів коду:

  • Програмування копіюванням-вставкою[en], при якому ділянки коду копіюються через те, що «це працює». У більшості випадків така операція вимагає невеликих змін перенесеного коду, наприклад перейменування змінних або додавання/видалення окремих ділянок.
  • Бажана функціональність дуже схожа на вже існуючу в іншій частині програми, і програміст створює код дуже близький до того, який вже існує.[2]
  • Плагіат, коли код просто копіюється без дотримання прав або будь-яких умов.

Проблеми до яких призводять дублікати коду[ред.ред. код]

Дублювання коду є ознакою низького стилю програмування. Гарний стиль програмування звичайно заснований на повторному використанні коду[ru]. Може здаватися, що використання дублікатів дозволить дещо прискорити процес створення програми, так як програмісту не потрібно буде думати над тим, як код використовується і як він може використовуватися надалі. Однак проблема полягає в тому, що написання коду це лише невелика частина життєвого циклу продукту, і подальший супровід коду з дублікатами буде занадто ускладненим.[3] Ось кілька проблем до яких призводить дублювання коду:

  • Велика кількість коду ускладнює його розуміння: дублювання коду часто призводить до створення довгих, повторюваних послідовностей коду які відрізняються лише кількома рядками або символами.
  • Приховане значення: важко вловити різницю в повторюваних ділянках коду, і тому стає важче розуміти для чого саме призначена та чи інша частина коду. Найчастіше, єдина різниця полягає в параметрах. У цій ситуації найкраще використовувати процедури і функції.
  • Аномалії оновлення: дублювання коду суперечить основному принципу теорії баз даних: «Уникайте надмірності». Невиконання цього принципу призводить до аномалій оновлення, які сильно збільшують витрати на обслуговування коду. У цьому випадку одну і ту ж зміну потрібно ввести в усі дублікати. І в кращому випадку, час витрачений на внесення змін і тестування коду збільшується пропорційно кількості дублікатів. А в гіршому — деякі місця в коді можуть бути пропущені, і виправлення всіх помилок може зайняти місяці або навіть роки. Намагайтеся використовувати бібліотеки коду у такій ситуації.
  • Розмір файлу: без застосування будь-якого стиснення, файл вихідного коду займатиме більше місця на твердому диску.

Пошук дублікату коду[ред.ред. код]

Існує певна кількість алгоритмів які дозволяють відшукати дублікати коду. Наприклад:

Приклади дублікатів коду[ред.ред. код]

Наведемо наступну частину коду[ru] який обчислює середнє значення масиву цілих чисел:

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);

Інструменти для пошуку дублікатів коду[ред.ред. код]

Інструменти аналізу дублювання коду включають в себе:

  • Atomiq — комерційний продукт
  • Black Duck Software[en] — комерційний продукт (середовище аналізу коду)
  • CCFinder (C / C++, Java, COBOL, Fortran, і т. д. / некомфортний для компіляції в НЕ-windows операційних системах)
  • CloneDR — комерційний продукт (Ada, C, C++, C#, Java, COBOL, Fortran, Python, VB.net, VB6, PHP4 / 5, PLSQL, SQL2011 , XML, та багато інших мов)
  • детектор Copy / Paste від PMD (Java, JSP, C, C++, Fortran, PHP)
  • ConQAT[9][10] (Open Source, підтримує: ABAP, ADA, Cobol, C / C++, C#, Java, PL / I, PL / SQL, Python, Text, Transact SQL, Visual Basic, XML)
  • JCCD — Гнучке API для знаходження дублікатів коду для Java (Open Source: підтримує Java, але може бути адаптований для інших мов за допомогою ANTLR)
  • JPlag (Java, C#, C, C++, структурний і звичайний текст)

Див. також[ред.ред. код]

Ресурси інтернету[ред.ред. код]

Примітки[ред.ред. код]

  1. Spinellis, Diomidis. «The Bad Code Spotter's Guide». InformIT.com. Архів оригіналу за 2012-09-10. Процитовано 2008-06-06. 
  2. Code similarities beyond copy & paste by Elmar Juergens, Florian Deissenboeck, Benjamin Hummel.
  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).
  9. A Workbench for Clone Detection Research by E. Juergens, F. Deissenboeck, B. Hummel
  10. Do Code Clones Matter? By E. Juergens, F. Deissenboeck, B. Hummel, S. Wagner
  11. CP-Miner: A Tool for Finding Copy-paste and Related Bugs in Operating System Code. by Zhenmin Li, Shan Lu, Suvda Myagmar and Yuanyuan Zhou.