Дублювання коду — термін відомий із програмування, під яким розуміється, що деякі ділянки початкового коду можуть зустрічатися більш, ніж один раз, як всередині однієї, так і в всередині декількох програм. Дублювання є ознакою так званого «поганого коду» або «коду з запахом» (англ. Code smell),[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);

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

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

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

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

Джерела ред.

  1. Spinellis, Diomidis. The Bad Code Spotter's Guide. InformIT.com. Архів оригіналу за 18 жовтня 2012. Процитовано 6 червня 2008.
  2. Elmar Juergens; Florian Deissenboeck; Benjamin Hummel. Code similarities beyond copy & paste (PDF) (англ.). Архів оригіналу (PDF) за 22 січня 2019. Процитовано 2 грудня 2014.
  3. Kapser, C.; Godfrey, M.W. (October 2006). «Cloning Considered Harmful» Considered Harmful (PDF). 13th Working Conference on Reverse Engineering (WCRE) (англ.). с. 19—28. Архів оригіналу (PDF) за 4 березня 2016. Процитовано 2 грудня 2014.
  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 [Архівовано 10 серпня 2017 у Wayback Machine.]
  6. Matthias Rieger; Stephane Ducasse. Visual Detection of Duplicated Code (PDF) (англ.). Архів оригіналу (PDF) за 29 червня 2006.
  7. Yuan, Y.; Guo, Y. (December 2011). CMCD: Count Matrix Based Code Clone Detection. 2011 18th Asia-Pacific Software Engineering Conference (англ.). IEEE. с. 250—257.
  8. Chen, X., Wang, A. Y., & Tempero, E. D. (2014). A Replication and Reproduction of Code Clone Detection Studies [Архівовано 15 грудня 2017 у Wayback Machine.]. In ACSC (pp. 105–114).
  9. Atomiq - Code Similarity Finder. Архів оригіналу за 17 вересня 2018. Процитовано 4 липня 2019.
  10. the archive of CCFinder Official Site. Архів оригіналу за 5 березня 2022. Процитовано 18 березня 2022.
  11. CloneAnalyzer. Архів оригіналу за 5 квітня 2017. Процитовано 18 березня 2022.
  12. Clone Digger. Інструмент для мов Python и Java. Виконує пошук дублікатів на рівні абстракції синтаксичного дерева.
  13. Clone Doctor: Software Clone Detection and Reporting. Архів оригіналу за 5 грудня 2019. Процитовано 1 грудня 2019.
  14. E. Juergens; F. Deissenboeck; B. Hummel. A Workbench for Clone Detection Research (PDF). Архів оригіналу (PDF) за 5 березня 2016. Процитовано 9 червня 2013.
  15. E. Juergens; F. Deissenboeck; B. Hummel; S. Wagner. Do Code Clones Matter? (PDF). Архів оригіналу (PDF) за 9 серпня 2017. Процитовано 9 червня 2013.
  16. CP-Miner: A Tool for Finding Copy-paste and Related Bugs in Operating System Code. [Архівовано 5 лютого 2009 у Wayback Machine.] by Zhenmin Li, Shan Lu, Suvda Myagmar and Yuanyuan Zhou.

Посилання ред.