Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
>
>
>
Copy-paste программирование

Copy-paste программирование

14 Авг 2012

Программирование методом копирования-вставки (copy-paste) — распространённый антипаттерн (ловушка) при написании кода, под которым обычно понимают многократное копирование (с последующей правкой) существующего кода вместо создания обобщённых решений. Подобный стиль программирования часто приводит к появлению избыточно больших, сложно читаемых функций, содержащих большое количество повторяющихся фрагментов кода. Подобный код сложен для восприятия, а многократно повторяющиеся фрагменты притупляют внимание программиста, что может привести к опечаткам. Если же ошибка была допущена изначально, то она будет многократно размножена по всему коду.

Такие ошибки достаточно частые, потому что практически невозможно избежать копирования нескольких строк, идущих подряд. Например, при вызове одного метода с различными (но в целом прохожими) параметрами и применении такого метода к различным объектам несколько раз подряд. Причём ручная проверка такого кода (рецензирование) оказывается малоэффективна, т.к. человеческий глаз просто не заметит отличия в 1-2 символа.

Ошибки copy-paste программирования удобно выявлять ещё на этапе написания кода в автоматическом режиме, например с помощью методики статического анализа. В отличие от обычного ручного рецензирования статический анализ обычно полностью автоматизирован и покрывает весь код проекта, даже те редко исполняемые участки, ошибки в которых трудно выявить с помощью динамических методов верификации.

Приведём несколько примеров реальных ошибок copy-paste паттерна на языке C++, найденных в известных Open Source проектах с помощью статического анализатора PVS-Studio.

Проект Fennec Media Project. Промах при работе с элементами массива:

fhead[11] = '\0';
fhead[12] = '\0';
fhead[13] = '\0';
fhead[13] = '\0';

Четыре схожие строчки, скорее всего, появились в коде программы с помощью копирования. Затем при правке индексов была допущена ошибка, из-за которой ноль дважды записывается в fhead[13] и не записывается в fhead[14].

Проект ReactOS. Выбор неправильного объекта:

HPEN hhi = CreatePen(0, 0, MAKE_PALETTERGB(crHighlight));
HPEN hsh = CreatePen(0, 0, MAKE_PALETTERGB(crShadow));
....
if(fNormal)
  hOld = SelectObject(hdc, hhi);
else
  hOld = SelectObject(hdc, hhi);
....

Объект hsh не используется. Всегда используется объект hhi.

В более общем случае copy-paste программированием также может называться использование (или адаптация) существующих сторонних решений (например, из открытых источников), часто без понимания принципов их работы. В свою очередь, это приводит к неоднородности стиля в проекте, неэффективности работы и перегруженности кода.

Cписок источников

Популярные статьи по теме


Комментарии (0)

Следующие комментарии next comments
close comment form
close form

Заполните форму в два простых шага ниже:

Ваши контактные данные:

Шаг 1
Поздравляем! У вас есть промокод!

Тип желаемой лицензии:

Шаг 2
Team license
Enterprise license
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности
close form
Запросите информацию о ценах
Новая лицензия
Продление лицензии
--Выберите валюту--
USD
EUR
RUB
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Бесплатная лицензия PVS‑Studio для специалистов Microsoft MVP
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Мне интересно попробовать плагин на:
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
check circle
Ваше сообщение отправлено.

Мы ответим вам на


Если вы так и не получили ответ, пожалуйста, проверьте, отфильтровано ли письмо в одну из следующих стандартных папок:

  • Промоакции
  • Оповещения
  • Спам