Дублювання коду — термін відомий із програмування, під яким розуміється, що деякі ділянки початкового коду можуть зустрічатися більш, ніж один раз, як всередині однієї, так і в всередині декількох програм. Дублювання є ознакою так званого «поганого коду» або «коду з запахом» (англ. Code smell), тому що саме через дублювання збільшується довжина коду. Послідовності дублікатів іноді називають клонами.
Причини за яких дві частини коду можуть вважатися дублікатами
- Посимвольний збіг;
- Посимвольний збіг, з ігноруванням пробільних символів і коментарів;
- Збіг за лексемами;
- Частковий збіг за лексемами;
- Функціональний збіг;
Звідки з'являються дублікати коду
Причини виникнення дублікатів коду:
- Програмування копіюванням-вставленням, при якому ділянки коду копіюються через те, що «це працює». У більшості випадків така операція вимагає невеликих змін перенесеного коду, наприклад перейменування змінних або додавання/видалення окремих ділянок.
- Бажана функціональність дуже схожа на вже наявну в іншій частині програми, і програміст створює код дуже близький до того, який вже існує.
- Плагіат, коли код просто копіюється без дотримання прав або будь-яких умов.
Проблеми до яких призводять дублікати коду
Дублювання коду є ознакою низького стилю програмування. Гарний стиль програмування звичайно заснований на повторному використанні коду. Може здаватися, що використання дублікатів дозволить дещо прискорити процес створення програми, так як програмісту не потрібно буде думати над тим, як код використовується і як він може використовуватися надалі. Однак проблема полягає в тому, що написання коду це лише невелика частина життєвого циклу продукту, і подальший супровід коду з дублікатами буде занадто ускладненим. Ось кілька проблем до яких призводить дублювання коду:
- Велика кількість коду ускладнює його розуміння: дублювання коду часто призводить до створення довгих, повторюваних послідовностей коду які відрізняються лише кількома рядками або символами.
- Приховане значення: важко вловити різницю в повторюваних ділянках коду, і тому стає важче розуміти для чого саме призначена та чи інша частина коду. Найчастіше, єдина різниця полягає в параметрах. У цій ситуації найкраще використовувати процедури і функції.
- Аномалії оновлення: дублювання коду суперечить основному принципу теорії баз даних: «Уникайте надмірності». Невиконання цього принципу призводить до аномалій оновлення, які сильно збільшують витрати на обслуговування коду. У цьому випадку одну і ту ж зміну потрібно ввести в усі дублікати. І в кращому випадку, час витрачений на внесення змін і тестування коду збільшується пропорційно кількості дублікатів. А в гіршому — деякі місця в коді можуть бути пропущені, і виправлення всіх помилок може зайняти місяці або навіть роки. Намагайтеся використовувати бібліотеки коду у такій ситуації.
- Розмір файлу: без застосування будь-якого стиснення, файл початкового коду займатиме більше місця на твердому диску.
Пошук дублікату коду
Існує певна кількість алгоритмів які дозволяють відшукати дублікати коду. Наприклад:
- .
- Алгоритм Рабіна — Карпа.
- Використання абстрактних синтаксичних дерев.
- Візуальне визначення дублікатів.
- Зчитування матриці клонування.
Приклади дублікатів коду
Наступна частина коду обчислює середнє значення масиву цілих чисел:
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 — комерційний продукт (середовище аналізу коду)
- CCFinder (C / C++, Java, COBOL, Fortran, і т. д. / некомфортний для компіляції в НЕ-windows операційних системах)
- [en] (Java)
- CloneAnalyzer (C / C++ та Java / тільки як плагін для Eclipse)
- Clone Digger (Python та Java)
- Clone Doctor — комерційний продукт (Ada, C, C++, C#, Java, COBOL, Fortran, Python, VB.net, VB6, PHP4 / 5, PLSQL, SQL2011 , XML, та багато інших мов)
- [en] від [en] (Java, JSP, C, C++, Fortran, PHP)
- ConQAT [ 30 вересня 2013 у Wayback Machine.] (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)
- (Java, C#, C, C++, структурний і звичайний текст)
- Pattern Miner (CP Miner) [ 15 липня 2011 у Wayback Machine.] — комерційний продукт
- Simian (software) [ 8 листопада 2020 у Wayback Machine.]
- Google CodePro Analytix [ 25 лютого 2012 у Wayback Machine.] — (Java / Eclipse plugin only)
Див. також
- [en]
- «Запахи коду»
- Don't repeat yourself
- [en]
- Правило трьох
Джерела
- Spinellis, Diomidis. . InformIT.com. Архів оригіналу за 18 жовтня 2012. Процитовано 6 червня 2008.
- Elmar Juergens; Florian Deissenboeck; Benjamin Hummel. (PDF) (англ.). Архів оригіналу (PDF) за 22 січня 2019. Процитовано 2 грудня 2014.
- Kapser, C.; Godfrey, M.W. (October 2006). (PDF). 13th Working Conference on Reverse Engineering (WCRE) (англ.). с. 19—28. Архів оригіналу (PDF) за 4 березня 2016. Процитовано 2 грудня 2014.
- Brenda S. Baker. A Program for Identifying Duplicated Code. Computing Science and Statistics, 24:49-57, 1992.
- Ira D. Baxter, et al. Clone Detection Using Abstract Syntax Trees [ 10 серпня 2017 у Wayback Machine.]
- Matthias Rieger; Stephane Ducasse. (PDF) (англ.). Архів оригіналу (PDF) за 29 червня 2006.
- Yuan, Y.; Guo, Y. (December 2011). CMCD: Count Matrix Based Code Clone Detection. 2011 18th Asia-Pacific Software Engineering Conference (англ.). IEEE. с. 250—257.
- 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).
- . Архів оригіналу за 17 вересня 2018. Процитовано 4 липня 2019.
- . Архів оригіналу за 5 березня 2022. Процитовано 18 березня 2022.
- . Архів оригіналу за 5 квітня 2017. Процитовано 18 березня 2022.
- Clone Digger. Інструмент для мов Python и Java. Виконує пошук дублікатів на рівні абстракції синтаксичного дерева.
- . Архів оригіналу за 5 грудня 2019. Процитовано 1 грудня 2019.
- E. Juergens; F. Deissenboeck; B. Hummel. (PDF). Архів оригіналу (PDF) за 5 березня 2016. Процитовано 9 червня 2013.
- E. Juergens; F. Deissenboeck; B. Hummel; S. Wagner. (PDF). Архів оригіналу (PDF) за 9 серпня 2017. Процитовано 9 червня 2013.
- 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.
Посилання
- The University of Alabama at Birmingham: Code Clones Literature
- Пошук дублікатів в C#, VB.Net, ASPX, Ruby, Python, Java, C, C++, ActionScript, or XAML [ 7 липня 2011 у Wayback Machine.]
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Dublyuvannya kodu termin vidomij iz programuvannya pid yakim rozumiyetsya sho deyaki dilyanki pochatkovogo kodu mozhut zustrichatisya bilsh nizh odin raz yak vseredini odniyeyi tak i v vseredini dekilkoh program Dublyuvannya ye oznakoyu tak zvanogo poganogo kodu abo kodu z zapahom angl Code smell tomu sho same cherez dublyuvannya zbilshuyetsya dovzhina kodu Poslidovnosti dublikativ inodi nazivayut klonami Prichini za yakih dvi chastini kodu mozhut vvazhatisya dublikatamiPosimvolnij zbig Posimvolnij zbig z ignoruvannyam probilnih simvoliv i komentariv Zbig za leksemami Chastkovij zbig za leksemami Funkcionalnij zbig Zvidki z yavlyayutsya dublikati koduPrichini viniknennya dublikativ kodu Programuvannya kopiyuvannyam vstavlennyam pri yakomu dilyanki kodu kopiyuyutsya cherez te sho ce pracyuye U bilshosti vipadkiv taka operaciya vimagaye nevelikih zmin perenesenogo kodu napriklad perejmenuvannya zminnih abo dodavannya vidalennya okremih dilyanok Bazhana funkcionalnist duzhe shozha na vzhe nayavnu v inshij chastini programi i programist stvoryuye kod duzhe blizkij do togo yakij vzhe isnuye Plagiat koli kod prosto kopiyuyetsya bez dotrimannya prav abo bud yakih umov Problemi do yakih prizvodyat dublikati koduDublyuvannya kodu ye oznakoyu nizkogo stilyu programuvannya Garnij stil programuvannya zvichajno zasnovanij na povtornomu vikoristanni kodu Mozhe zdavatisya sho vikoristannya dublikativ dozvolit desho priskoriti proces stvorennya programi tak yak programistu ne potribno bude dumati nad tim yak kod vikoristovuyetsya i yak vin mozhe vikoristovuvatisya nadali Odnak problema polyagaye v tomu sho napisannya kodu ce lishe nevelika chastina zhittyevogo ciklu produktu i podalshij suprovid kodu z dublikatami bude zanadto uskladnenim Os kilka problem do yakih prizvodit dublyuvannya kodu Velika kilkist kodu uskladnyuye jogo rozuminnya dublyuvannya kodu chasto prizvodit do stvorennya dovgih povtoryuvanih poslidovnostej kodu yaki vidriznyayutsya lishe kilkoma ryadkami abo simvolami Prihovane znachennya vazhko vloviti riznicyu v povtoryuvanih dilyankah kodu i tomu staye vazhche rozumiti dlya chogo same priznachena ta chi insha chastina kodu Najchastishe yedina riznicya polyagaye v parametrah U cij situaciyi najkrashe vikoristovuvati proceduri i funkciyi Anomaliyi onovlennya dublyuvannya kodu superechit osnovnomu principu teoriyi baz danih Unikajte nadmirnosti Nevikonannya cogo principu prizvodit do anomalij onovlennya yaki silno zbilshuyut vitrati na obslugovuvannya kodu U comu vipadku odnu i tu zh zminu potribno vvesti v usi dublikati I v krashomu vipadku chas vitrachenij na vnesennya zmin i testuvannya kodu zbilshuyetsya proporcijno kilkosti dublikativ A v girshomu deyaki miscya v kodi mozhut buti propusheni i vipravlennya vsih pomilok mozhe zajnyati misyaci abo navit roki Namagajtesya vikoristovuvati biblioteki kodu u takij situaciyi Rozmir fajlu bez zastosuvannya bud yakogo stisnennya fajl pochatkovogo kodu zajmatime bilshe miscya na tverdomu disku Poshuk dublikatu koduIsnuye pevna kilkist algoritmiv yaki dozvolyayut vidshukati dublikati kodu Napriklad Algoritm Rabina Karpa Vikoristannya abstraktnih sintaksichnih derev Vizualne viznachennya dublikativ Zchituvannya matrici klonuvannya Prikladi dublikativ koduNastupna chastina kodu obchislyuye serednye znachennya masivu cilih chisel extern int array1 extern int array2 int sum1 0 int sum2 0 int average1 0 int average2 0 for int i 0 i lt 4 i sum1 array1 i average1 sum1 4 for int i 0 i lt 4 i sum2 array2 i average2 sum2 4 U comu prikladi dva cikli mozhut buti vineseni v okremu funkciyu int calcAverage int Array of 4 int sum 0 for int i 0 i lt 4 i sum Array of 4 i return sum 4 Vikoristannya ciyeyi funkciyi zvilnit kod vid dublikativ extern int array1 extern int array2 int average1 calcAverage array1 int average2 calcAverage array2 Instrumenti dlya poshuku dublikativ koduInstrumenti analizu dublyuvannya kodu vklyuchayut v sebe Atomiq komercijnij produkt Black Duck Software komercijnij produkt seredovishe analizu kodu CCFinder C C Java COBOL Fortran i t d nekomfortnij dlya kompilyaciyi v NE windows operacijnih sistemah en Java CloneAnalyzer C C ta Java tilki yak plagin dlya Eclipse Clone Digger Python ta Java Clone Doctor komercijnij produkt Ada C C C Java COBOL Fortran Python VB net VB6 PHP4 5 PLSQL SQL2011 XML ta bagato inshih mov en vid en Java JSP C C Fortran PHP ConQAT 30 veresnya 2013 u Wayback Machine Open Source pidtrimuye ABAP ADA Cobol C C C Java PL I PL SQL Python Text Transact SQL Visual Basic XML JCCD 21 bereznya 2018 u Wayback Machine Gnuchke API dlya znahodzhennya dublikativ kodu dlya Java Open Source pidtrimuye Java ale mozhe buti adaptovanij dlya inshih mov za dopomogoyu ANTLR Java C C C strukturnij i zvichajnij tekst Pattern Miner CP Miner 15 lipnya 2011 u Wayback Machine komercijnij produkt Simian software 8 listopada 2020 u Wayback Machine Google CodePro Analytix 25 lyutogo 2012 u Wayback Machine Java Eclipse plugin only Div takozh en Zapahi kodu Don t repeat yourself en Pravilo trohDzherelaSpinellis Diomidis InformIT com Arhiv originalu za 18 zhovtnya 2012 Procitovano 6 chervnya 2008 Elmar Juergens Florian Deissenboeck Benjamin Hummel PDF angl Arhiv originalu PDF za 22 sichnya 2019 Procitovano 2 grudnya 2014 Kapser C Godfrey M W October 2006 PDF 13th Working Conference on Reverse Engineering WCRE angl s 19 28 Arhiv originalu PDF za 4 bereznya 2016 Procitovano 2 grudnya 2014 Brenda S Baker A Program for Identifying Duplicated Code Computing Science and Statistics 24 49 57 1992 Ira D Baxter et al Clone Detection Using Abstract Syntax Trees 10 serpnya 2017 u Wayback Machine Matthias Rieger Stephane Ducasse PDF angl Arhiv originalu PDF za 29 chervnya 2006 Yuan Y Guo Y December 2011 CMCD Count Matrix Based Code Clone Detection 2011 18th Asia Pacific Software Engineering Conference angl IEEE s 250 257 Chen X Wang A Y amp Tempero E D 2014 A Replication and Reproduction of Code Clone Detection Studies 15 grudnya 2017 u Wayback Machine In ACSC pp 105 114 Arhiv originalu za 17 veresnya 2018 Procitovano 4 lipnya 2019 Arhiv originalu za 5 bereznya 2022 Procitovano 18 bereznya 2022 Arhiv originalu za 5 kvitnya 2017 Procitovano 18 bereznya 2022 Clone Digger Instrument dlya mov Python i Java Vikonuye poshuk dublikativ na rivni abstrakciyi sintaksichnogo dereva Arhiv originalu za 5 grudnya 2019 Procitovano 1 grudnya 2019 E Juergens F Deissenboeck B Hummel PDF Arhiv originalu PDF za 5 bereznya 2016 Procitovano 9 chervnya 2013 E Juergens F Deissenboeck B Hummel S Wagner PDF Arhiv originalu PDF za 9 serpnya 2017 Procitovano 9 chervnya 2013 CP Miner A Tool for Finding Copy paste and Related Bugs in Operating System Code 5 lyutogo 2009 u Wayback Machine by Zhenmin Li Shan Lu Suvda Myagmar and Yuanyuan Zhou PosilannyaThe University of Alabama at Birmingham Code Clones Literature Poshuk dublikativ v C VB Net ASPX Ruby Python Java C C ActionScript or XAML 7 lipnya 2011 u Wayback Machine