Дублирование кода
Дубли́рование ко́да — явление в программировании, при котором некоторые участки исходного кода могут встречаться более чем однажды, как внутри одной, так и в нескольких программных сущностях. Является симптомом так называемого «дурно пахнущего кода». В первую очередь потому, что увеличивается его длина; именно из-за дублирования, а не из-за совпадений. Последовательность дубликатов иногда называют клонами.

Некоторые причины, по которым две части кода могут считаться дубликатами:
- посимвольное совпадение,
- посимвольное совпадение, с игнорированием пробельных символов и комментариев,
- совпадение по токенам (лексемам),
- частичное совпадение по лексемам,
- функциональное совпадение.
Одна из основных причин проявления дублирования — программирование копированием-вставками, при котором участки кода копируются просто потому, что «это работает». В большинстве случаев такая операция требует небольших изменений переносимого кода, например, переименования переменных или добавление и удаление некоторых участков. В ряде случаев требуется функциональность, которая очень похожа на уже существующую в другой части программы, и программист пишет код, очень близкий к тому, который уже существует.
Проблемы
Дублирование кода является признаком «низкого» или «ленивого» стиля программирования. Хороший стиль программирования обычно основан на повторном использовании кода. Может казаться, что использование дубликатов позволит несколько ускорить процесс создания программы, так как программисту не нужно будет задумываться над тем, как код уже используется и как он может использоваться в дальнейшем. Однако, проблема заключается в том, что написание кода — это лишь скромная часть жизненного цикла продукта, и дальнейшее сопровождение кода с дубликатами будет слишком осложнено. Проблемы, к которым приводит дублирование кода:
- большое количество кода: дублирование часто приводит к созданию длинных, повторяющихся последовательностей кода, которые отличаются лишь несколькими строками или символами, что в итоге затрудняет понимание программы;
- скрытое значение: трудно уловить разницу в повторяющихся участках кода и поэтому становится тяжелее понимать, для чего именно предназначен тот или иной кусок кода, зачастую единственная разница заключается в параметрах;
- аномалии обновления: при обновлении дублированного кода необходимо обновить несколько аналогичных участков, что сильно увеличивает затраты на обслуживание;
- размер исходного текста: без применения какого-либо сжатия исходный текст занимает больше места.
Поиск дубликатов кода
Существует определённое количество алгоритмов, позволяющих отыскать дубликаты кода, среди них:
- (Baker’s algorithm);
- алгоритм Рабина — Карпа.
- использование абстрактных синтаксических деревьев.
В ряде случаев эффективно визуальное определение дубликатов.
Пример
Следующий фрагмент кода вычисляет среднее значение массива целых чисел.
extern int array1[]; extern int array2[]; int sum1 = 0; int sum2 = 0; int average1; int average2; int i; for (i = 0; i < 4; ++i) sum1 += array1[i]; average1 = sum1 / 4; for (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); Примечания
- Spinellis, Diomidis. The Bad Code Spotter's Guide. InformIT.com. Дата обращения: 6 июня 2008. Архивировано 10 сентября 2012 года.
- 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
- Visual Detection of Duplicated Code Архивная копия от 29 июня 2006 на Wayback Machine by Matthias Rieger, Stephane Ducasse.
Ссылки
- The University of Alabama at Birmingham: Code Clones Literature (англ.)
Википедия, чтение, книга, библиотека, поиск, нажмите, истории, книги, статьи, wikipedia, учить, информация, история, скачать, скачать бесплатно, mp3, видео, mp4, 3gp, jpg, jpeg, gif, png, картинка, музыка, песня, фильм, игра, игры, мобильный, телефон, Android, iOS, apple, мобильный телефон, Samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Сеть, компьютер, Информация о Дублирование кода, Что такое Дублирование кода? Что означает Дублирование кода?
Dubli rovanie ko da yavlenie v programmirovanii pri kotorom nekotorye uchastki ishodnogo koda mogut vstrechatsya bolee chem odnazhdy kak vnutri odnoj tak i v neskolkih programmnyh sushnostyah Yavlyaetsya simptomom tak nazyvaemogo durno pahnushego koda V pervuyu ochered potomu chto uvelichivaetsya ego dlina imenno iz za dublirovaniya a ne iz za sovpadenij Posledovatelnost dublikatov inogda nazyvayut klonami Primer tryohkratnogo dublirovaniya koda i izbavleniya ot etogo zapashka s pomoshyu vydeleniya metoda i posleduyushih vyzovov koda sozdannogo metoda Nekotorye prichiny po kotorym dve chasti koda mogut schitatsya dublikatami posimvolnoe sovpadenie posimvolnoe sovpadenie s ignorirovaniem probelnyh simvolov i kommentariev sovpadenie po tokenam leksemam chastichnoe sovpadenie po leksemam funkcionalnoe sovpadenie Odna iz osnovnyh prichin proyavleniya dublirovaniya programmirovanie kopirovaniem vstavkami pri kotorom uchastki koda kopiruyutsya prosto potomu chto eto rabotaet V bolshinstve sluchaev takaya operaciya trebuet nebolshih izmenenij perenosimogo koda naprimer pereimenovaniya peremennyh ili dobavlenie i udalenie nekotoryh uchastkov V ryade sluchaev trebuetsya funkcionalnost kotoraya ochen pohozha na uzhe sushestvuyushuyu v drugoj chasti programmy i programmist pishet kod ochen blizkij k tomu kotoryj uzhe sushestvuet ProblemyDublirovanie koda yavlyaetsya priznakom nizkogo ili lenivogo stilya programmirovaniya Horoshij stil programmirovaniya obychno osnovan na povtornom ispolzovanii koda Mozhet kazatsya chto ispolzovanie dublikatov pozvolit neskolko uskorit process sozdaniya programmy tak kak programmistu ne nuzhno budet zadumyvatsya nad tem kak kod uzhe ispolzuetsya i kak on mozhet ispolzovatsya v dalnejshem Odnako problema zaklyuchaetsya v tom chto napisanie koda eto lish skromnaya chast zhiznennogo cikla produkta i dalnejshee soprovozhdenie koda s dublikatami budet slishkom oslozhneno Problemy k kotorym privodit dublirovanie koda bolshoe kolichestvo koda dublirovanie chasto privodit k sozdaniyu dlinnyh povtoryayushihsya posledovatelnostej koda kotorye otlichayutsya lish neskolkimi strokami ili simvolami chto v itoge zatrudnyaet ponimanie programmy skrytoe znachenie trudno ulovit raznicu v povtoryayushihsya uchastkah koda i poetomu stanovitsya tyazhelee ponimat dlya chego imenno prednaznachen tot ili inoj kusok koda zachastuyu edinstvennaya raznica zaklyuchaetsya v parametrah anomalii obnovleniya pri obnovlenii dublirovannogo koda neobhodimo obnovit neskolko analogichnyh uchastkov chto silno uvelichivaet zatraty na obsluzhivanie razmer ishodnogo teksta bez primeneniya kakogo libo szhatiya ishodnyj tekst zanimaet bolshe mesta Poisk dublikatov kodaSushestvuet opredelyonnoe kolichestvo algoritmov pozvolyayushih otyskat dublikaty koda sredi nih Baker s algorithm algoritm Rabina Karpa ispolzovanie abstraktnyh sintaksicheskih derevev V ryade sluchaev effektivno vizualnoe opredelenie dublikatov PrimerSleduyushij fragment koda vychislyaet srednee znachenie massiva celyh chisel extern int array1 extern int array2 int sum1 0 int sum2 0 int average1 int average2 int i for i 0 i lt 4 i sum1 array1 i average1 sum1 4 for i 0 i lt 4 i sum2 array2 i average2 sum2 4 V nyom dva cikla mogut byt vydeleny v otdelnuyu 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 Ispolzovanie etoj funkcii izbavit kod ot dublikatov extern int array1 extern int array2 int average1 calcAverage array1 int average2 calcAverage array2 PrimechaniyaSpinellis Diomidis The Bad Code Spotter s Guide neopr InformIT com Data obrasheniya 6 iyunya 2008 Arhivirovano 10 sentyabrya 2012 goda 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 Arhivnaya kopiya ot 10 avgusta 2017 na Wayback Machine Visual Detection of Duplicated Code Arhivnaya kopiya ot 29 iyunya 2006 na Wayback Machine by Matthias Rieger Stephane Ducasse SsylkiThe University of Alabama at Birmingham Code Clones Literature angl
