Дублированный код - это термин компьютерного программирования, обозначающий последовательность исходного кода, которая встречается более одного раза либо в программе, либо в разных программах, принадлежащих или поддерживаемых одним и тем же объектом. Дублирование кода обычно считается нежелательным по ряду причин. [1] Минимальное требование обычно применяется к количеству кода, который должен появиться в последовательности, чтобы он считался дублирующим, а не случайно подобным. Последовательности повторяющегося кода иногда называют клонами кода или просто клонами, автоматический процесс поиска дубликатов в исходном коде называется обнаружением клонов.
Две кодовые последовательности могут быть дубликатами друг друга, не будучи идентичными символ к символу, например, будучи идентичными символ к символу, только когда символы пробела и комментарии игнорируются, или будучи идентичными токен для токена , или токен -для жетона идентичны с редкими изменениями. Даже кодовые последовательности, которые идентичны только функционально, могут считаться повторяющимся кодом.
Возникновение
Вот некоторые из способов создания дублирующего кода:
- копировать и вставлять программирование , которое в академических условиях может быть частью плагиата.
- поиск, при котором фрагмент кода копируется «потому что он работает». В большинстве случаев эта операция включает небольшие изменения в клонированном коде, такие как переименование переменных или вставка / удаление кода. Язык почти всегда позволяет вызывать одну копию кода из разных мест, так что он может служить нескольким целям, но вместо этого программист создает другую копию, возможно, потому что они
- не понимаю язык должным образом
- нет времени делать это должным образом, или
- пофиг на усиленную активную программную гниль .
Также может случиться так, что требуется функциональность, очень похожая на ту, что есть в другой части программы, и разработчик независимо пишет код, очень похожий на то, что существует в другом месте. Исследования показывают, что такой независимо переписанный код обычно синтаксически не похож. [2]
Автоматически сгенерированный код, где дублирование кода может быть желательным для увеличения скорости или простоты разработки, является еще одной причиной дублирования. Обратите внимание, что фактический генератор не будет содержать дубликатов в своем исходном коде, а только вывод, который он производит.
Фиксация
Дублированный код чаще всего исправляется перемещением кода в его собственный модуль (функцию или модуль) и вызовом этого модуля из всех мест, где он изначально использовался. Использование более открытого стиля разработки, при котором компоненты находятся в централизованном расположении, также может помочь с дублированием.
Затраты и преимущества
Код, который включает повторяющиеся функции, труднее поддерживать,
- просто потому, что он длиннее, и
- потому что, если он нуждается в обновлении, существует опасность, что одна копия кода будет обновлена без дополнительной проверки наличия других экземпляров того же кода.
С другой стороны, если одна копия кода используется для разных целей и не задокументирована должным образом, существует опасность, что она будет обновлена для одной цели, но это обновление не будет требоваться или подходить для других. целей.
Эти соображения не имеют отношения к автоматически сгенерированному коду, если в исходном коде есть только одна копия функциональности.
В прошлом, когда объем памяти был более ограничен, дублированный код имел дополнительный недостаток, заключающийся в том, что занимал больше места, но в настоящее время это вряд ли будет проблемой.
При копировании кода с программной уязвимостью уязвимость может продолжать существовать в скопированном коде, если разработчик не знает о таких копиях. [3] Рефакторинг повторяющегося кода может улучшить многие показатели программного обеспечения, такие как строки кода , цикломатическая сложность и взаимосвязь . Это может привести к сокращению времени компиляции, снижению когнитивной нагрузки , меньшему количеству человеческих ошибок и меньшему количеству забытых или пропущенных фрагментов кода. Однако не все дублирование кода можно отредактировать. [4] Клоны могут быть наиболее эффективным решением, если язык программирования предоставляет неадекватные или чрезмерно сложные абстракции, особенно если они поддерживаются такими методами пользовательского интерфейса, как одновременное редактирование . Кроме того, риски взлома кода при рефакторинге могут перевесить любые преимущества обслуживания. [5] Исследование, проведенное Вагнером, Абдулхалеком и Кайей, пришло к выводу, что, хотя необходимо проделать дополнительную работу, чтобы синхронизировать дубликаты, если участвующие программисты знают о дублированном коде, не было значительно больше ошибок, чем в недублированном коде. [6] [ оспаривается ]
Обнаружение повторяющегося кода
Для обнаружения повторяющегося кода был предложен ряд различных алгоритмов. Например:
- Алгоритм Бейкера . [7]
- Алгоритм поиска строки Рабина – Карпа .
- Использование абстрактных синтаксических деревьев . [8]
- Визуальное обнаружение клонов. [9]
- Обнаружение клонов матрицы подсчета. [10] [11]
- Хеширование с учетом местоположения
- Антиунификация [12]
Пример функционально дублированного кода
Рассмотрим следующий фрагмент кода для вычисления средних из массива из целых чисел
ехЬегп INT array_a []; ехЬегп INT array_b []; int sum_a = 0 ;для ( int i = 0 ; i < 4 ; i ++ ) sum_a + = array_a [ i ];INT Average_a = sum_a / 4 ; int sum_b = 0 ;для ( int i = 0 ; i < 4 ; i ++ ) sum_b + = array_b [ i ];INT average_b = sum_b / 4 ;
Два цикла можно переписать как одну функцию:
int calc_average_of_four ( int * массив ) { int sum = 0 ; для ( int я = 0 ; я < 4 ; я ++ ) сумма + = массив [ я ]; сумма возврата / 4 ; }
или, как правило, предпочтительно, путем параметризации количества элементов в массиве.
Использование вышеуказанной функции даст исходный код без дублирования цикла:
ехЬегп INT массив1 []; ехЬегп INT массив2 [];int average1 = вычислить среднее_число_фур ( массив1 ); INT средней2 = calc_average_of_four ( массив2 );
Обратите внимание, что в этом тривиальном случае компилятор может выбрать встраивание обоих вызовов функции, так что результирующий машинный код будет идентичным как для дублированных, так и для не дублированных примеров выше. Если функция не встроена, дополнительные накладные расходы на вызовы функций , вероятно, потребуют больше времени для выполнения (порядка 10 инструкций процессора для большинства высокопроизводительных языков). Теоретически это дополнительное время может иметь значение.
Смотрите также
Рекомендации
- ^ Спинеллис, Диомидис. «Руководство по поиску плохого кода» . InformIT.com . Проверено 6 июня 2008 .
- ^ Сходства кода за пределами копирования и вставки Эльмара Юргенса, Флориана Дейссенбока, Бенджамина Хаммеля.
- ^ Ли, Хунчжэ; Квон, Хёкмин; Квон, Джонхун; Ли, Хиджо (25 апреля 2016 г.). «CLORIFI: обнаружение уязвимостей программного обеспечения с помощью проверки клонирования кода». Параллелизм и вычисления: практика и опыт . 28 (6): 1900–1917. DOI : 10.1002 / cpe.3532 . S2CID 17363758 .
- ^ Арчелли Фонтана, Франческа; Занони, Марко; Ранкетти, Андреа; Ранкетти, Давиде (2013). «Обнаружение клонов программного обеспечения и рефакторинг» (PDF) . ISRN Программная инженерия . 2013 : 1–8. DOI : 10.1155 / 2013/129437 .
- ^ Kapser, C .; Годфри, М.В. "," Клонирование считается вредным, считается вредным ", 13-я рабочая конференция по обратному проектированию (WCRE), стр. 19-28, октябрь 2006 г.
- ^ Вагнер, Стефан; Абдулхалек, Асим; Кая, Камер; Паар, Александр (2016). «О взаимосвязи несовместимых клонов программного обеспечения и ошибок: эмпирическое исследование» . Proc. 23-я Международная конференция IEEE по анализу, развитию и реинжинирингу программного обеспечения (SANER, 2016) : 79–89. arXiv : 1611.08005 . DOI : 10,1109 / SANER.2016.94 . ISBN 978-1-5090-1855-0. S2CID 3154845 .
- ^ Бренда С. Бейкер . Программа для выявления дублированного кода. Вычислительная техника и статистика, 24: 49–57, 1992.
- ^ Ира Д. Бакстер и др. Обнаружение клонов с использованием абстрактных синтаксических деревьев
- ^ Визуальное обнаружение дублированного кода Архивированные 2006-06-29 в Wayback Machine Маттиас Ригер, Стефан Дюкасс.
- ^ Юань, Ю. и Го, Ю. CMCD: Обнаружение клонов кода на основе матрицы подсчета , в 18-й Азиатско-Тихоокеанской конференции по разработке программного обеспечения в 2011 году. IEEE, декабрь 2011 г., стр. 250–257.
- ^ Chen, X. Ван, AY, и Темперо, ED (2014). Репликация и воспроизведение исследований обнаружения клонов кода . В ACSC (стр. 105-114).
- ↑ Булычев, Петр и Мариус Минея. « Обнаружение повторяющегося кода с помощью антиунификации ». Материалы весенне-летнего коллоквиума молодых исследователей по программной инженерии. No. 2. Федеральное государственное бюджетное учреждение Институт системного программирования Российской академии наук, 2008.
Внешние ссылки
- Университет Алабамы в Бирмингеме: литература по кодовым клонам
- Поиск повторяющегося кода в C #, VB.Net, ASPX, Ruby, Python, Java, C, C ++, ActionScript или XAML