Повторяющийся код - Duplicate code
Повторяющийся код это компьютерное программирование срок для последовательности исходный код это происходит более одного раза, либо в программе, либо в разных программах, принадлежащих или поддерживаемых одной и той же организацией. Дубликат кода обычно считается нежелательный по ряду причин.[1] Минимальные требования обычно применяются к количеству кода, который должен появиться в последовательности, чтобы его можно было считать дублирующим, а не случайно подобным. Последовательности повторяющегося кода иногда называют клонами кода или просто клонами, автоматический процесс поиска дубликатов в исходном коде называется обнаружением клонов.
Две кодовые последовательности могут быть дубликатами друг друга, не будучи идентичными символ к символу, например, будучи идентичными символ к символу только тогда, когда символы пробела и комментарии игнорируются, или будучи токен в обмен на токен идентичные, или идентичные по принципу «токен в обмен» с редкими изменениями. Даже кодовые последовательности, которые идентичны только функционально, могут считаться повторяющимся кодом.
Возникновение
Вот некоторые из способов создания дублирующего кода:
- копировать и вставлять программирование, что в академических условиях может быть выполнено как часть плагиат
- поиск, при котором фрагмент кода копируется «потому что он работает». В большинстве случаев эта операция включает небольшие изменения в клонированном коде, такие как переименование переменных или вставка / удаление кода. Язык почти всегда позволяет вызывать одну копию кода из разных мест, чтобы она могла служить нескольким целям, но вместо этого программист создает другую копию, возможно, потому что они
- не понимаю язык должным образом
- нет времени делать это должным образом, или
- плевать на увеличенное активная программная гниль.
Также может случиться так, что требуется функциональность, очень похожая на ту, что есть в другой части программы, и разработчик независимо пишет код, очень похожий на то, что существует в другом месте. Исследования показывают, что такой независимо переписанный код обычно синтаксически не похож.[2]
Автоматически сгенерированный код, где дублирование кода может быть желательным для увеличения скорости или простоты разработки, является еще одной причиной дублирования. Обратите внимание, что фактический генератор не будет содержать дубликатов в своем исходном коде, а будет только вывод, который он производит.
Фиксация
Дублированный код чаще всего устраняется перемещением кода в его собственный модуль (функцию или модуль) и вызовом этого модуля из всех мест, где он был первоначально использован. Использование более открытого стиля разработки, при котором компоненты находятся в централизованном расположении, также может помочь с дублированием.
Затраты и преимущества
Код, который включает повторяющиеся функции, труднее поддерживать,
- просто потому, что он длиннее, и
- потому что, если он нуждается в обновлении, существует опасность, что одна копия кода будет обновлена без дальнейшей проверки наличия других экземпляров того же кода.
С другой стороны, если одна копия кода используется для разных целей и не задокументирована должным образом, существует опасность, что она будет обновлена для одной цели, но это обновление не будет требоваться или подходить для другой своей цели. целей.
Эти соображения не имеют отношения к автоматически сгенерированному коду, если в исходном коде есть только одна копия функциональности.
В прошлом, когда объем памяти был более ограничен, дублированный код имел дополнительный недостаток, заключающийся в том, что занимал больше места, но в настоящее время это вряд ли станет проблемой.
Когда код с уязвимость программного обеспечения копируется, уязвимость может продолжать существовать в скопированном коде, если разработчик не знает о таких копиях.[3] Рефакторинг дублирующийся код может улучшить многие показатели программного обеспечения, такие как строки кода, цикломатическая сложность, и связь. Это может привести к сокращению времени компиляции, меньшему когнитивная нагрузка, меньше человеческая ошибка и меньше забытых или недооцененных фрагментов кода. Однако не все дублирование кода можно исправить.[4] Клоны могут быть наиболее эффективным решением, если язык программирования предоставляет неадекватные или чрезмерно сложные абстракции, особенно если они поддерживаются такими методами пользовательского интерфейса, как одновременное редактирование. Более того, риски взлома кода при рефакторинге могут перевесить любые преимущества обслуживания.[5] Исследование, проведенное Вагнером, Абдулхалеком и Кайей, пришло к выводу, что, хотя необходимо проделать дополнительную работу, чтобы синхронизировать дубликаты, если задействованные программисты знают о дублированном коде, не было бы значительно больше ошибок, чем в недублированном коде.[6][оспаривается ]
Обнаружение повторяющегося кода
Для обнаружения повторяющегося кода был предложен ряд различных алгоритмов. Например:
- Бейкер алгоритм.[7]
- Алгоритм поиска строки Рабина – Карпа.
- С помощью Абстрактные синтаксические деревья.[8]
- Визуальное обнаружение клонов.[9]
- Обнаружение клонов матрицы подсчета.[10][11]
- Хеширование с учетом местоположения
- Анти-объединение[12]
Пример функционально дублированного кода
Рассмотрим следующее фрагмент кода для расчета средний из множество из целые числа
внешний int array_a[];внешний int array_b[]; int sum_a = 0;за (int я = 0; я < 4; я++) sum_a += array_a[я];int average_a = sum_a / 4; int sum_b = 0;за (int я = 0; я < 4; я++) sum_b += array_b[я];int average_b = sum_b / 4;
Два цикла можно переписать как одну функцию:
int calc_average_of_four(int* множество) { int сумма = 0; за (int я = 0; я < 4; я++) сумма += множество[я]; возвращаться сумма / 4;}
или, как правило, предпочтительно, путем параметризации количества элементов в массиве.
Использование приведенной выше функции даст исходный код без дублирования цикла:
внешний int array1[];внешний int array2[];int средний1 = calc_average_of_four(array1);int средний2 = calc_average_of_four(array2);
Обратите внимание, что в этом тривиальном случае компилятор может выбрать в соответствии оба вызова функции, так что результирующий машинный код идентичен как для дублированных, так и для не дублированных примеров выше. Если функция не встроена, то дополнительные накладные расходы на вызовы функций вероятно, потребуется больше времени для выполнения (порядка 10 инструкций процессора для большинства высокопроизводительных языков). Теоретически это дополнительное время может иметь значение.
Смотрите также
- Принцип абстракции (программирование)
- Анти-шаблон
- Дедупликация данных
- Не повторяйся (СУХОЙ)
- Список инструментов для статического анализа кода
- Резервный код
- Правило трех (компьютерное программирование)
Рекомендации
- ^ Спинеллис, Диомидис. "Руководство по выявлению плохого кода". InformIT.com. Получено 2008-06-06.
- ^ Сходства кода помимо копирования и вставки Эльмара Юргенса, Флориана Дайссенбока, Бенджамина Хаммеля.
- ^ Ли, Хунчжэ; Квон, Хёкмин; Квон, Джонхун; Ли, Хиджо (25 апреля 2016 г.). «CLORIFI: обнаружение уязвимостей программного обеспечения с помощью проверки клонирования кода». Параллелизм и вычисления: практика и опыт. 28 (6): 1900–1917. Дои:10.1002 / cpe.3532.
- ^ Арчелли Фонтана, Франческа; Занони, Марко; Ранкетти, Андреа; Ранкетти, Давиде (2013). «Обнаружение клонов программного обеспечения и рефакторинг» (PDF). ISRN Разработка программного обеспечения. 2013: 1–8. Дои:10.1155/2013/129437.
- ^ Kapser, C .; Годфри, М.В., «Клонирование считается вредным» Считается вредным, "13-я рабочая конференция по обратному инжинирингу (WCRE), стр. 19-28, октябрь 2006 г.
- ^ Вагнер, Стефан; Абдулхалек, Асим; Кая, Камер; Паар, Александр (2016). «О взаимосвязи несовместимых клонов программного обеспечения и ошибок: эмпирическое исследование». Proc. 23-я Международная конференция IEEE по анализу, развитию и реинжинирингу программного обеспечения (SANER 2016).
- ^ Бренда С. Бейкер. Программа для выявления дублированного кода. Вычислительная техника и статистика, 24: 49–57, 1992.
- ^ Ира Д. Бакстер и др. Обнаружение клонов с использованием абстрактных синтаксических деревьев
- ^ Визуальное обнаружение дублированного кода В архиве 2006-06-29 на Wayback Machine Матиас Ригер, Стефан Дюкасс.
- ^ Юань, Ю. и Го, Ю. CMCD: код на основе матрицы подсчетаОбнаружение клонов, в 2011 году 18-я Азиатско-Тихоокеанская конференция по разработке программного обеспечения. IEEE, декабрь 2011 г., стр. 250–257.
- ^ Чен, X., Ван, A. Y., & Tempero, E. D. (2014). Репликация и воспроизведение исследований по обнаружению клонов кода. В ACSC (стр. 105-114).
- ^ Булычев, Петр и Мариус Минея. "Обнаружение повторяющегося кода с помощью антиунификации. "Труды весенне-летнего коллоквиума молодых исследователей по разработке программного обеспечения. № 2. Федеральное государственное бюджетное учреждение Институт системного программирования Российской академии наук, 2008.