Эта статья нуждается в дополнительных цитатах для проверки . ( апрель 2018 г. ) |
Shotgun surgery — это антипаттерн в разработке программного обеспечения, который происходит, когда разработчик добавляет функции в кодовую базу приложения , которые охватывают множество реализаторов или реализаций в одном изменении. Это обычная практика во многих сценариях программирования, так как большое количество усилий по программированию обычно тратится на добавление новых функций для повышения ценности программных активов. Как следствие, эти новые функции могут потребовать добавления кода в нескольких местах одновременно, где сам код выглядит очень похожим и может иметь лишь незначительные изменения. Из-за быстрого темпа разработки коммерческого программного обеспечения может не хватить времени на переделку (или рефакторинг ) системы для поддержки новых функций тривиально. Как следствие, распространена практика программирования методом копирования и вставки ; код пишется в одном месте, а затем просто копируется во все другие места, где требуется эта реализация (со всеми требуемыми изменениями, применяемыми на месте).
Эта практика обычно не одобряется сообществом рефакторинга как прямое нарушение принципа абстракции , также известного как правило Once and Only Once — в конечном итоге любое изменение новой функциональности может потребовать широкомасштабных изменений. Кроме того, любая потенциальная ошибка программного обеспечения в этой новой функции будет многократно воспроизведена и может сделать исправление ошибок особенно сложным и утомительным. Даже при отсутствии скопированного кода реализации гарантированно будут очень похожими и столь же подверженными изменению требований или исправлению ошибок. Эта форма разработки программного обеспечения имеет тенденцию благоприятствовать краткосрочному улучшению (в форме дополнительных функций) за счет долгосрочной поддерживаемости и стабильности.
Каноническим примером такой практики является ведение журнала , которое обычно добавляет код пролога ко многим функциям одновременно, например:
void Func () { ... } void Func2 () { ... } ...void FuncN () { ... }
Может быть преобразовано в:
void Func () { printf ( "Вход в Func \n " ); ... } void Func2 () { printf ( "Вход в Func2 \n " ); ... } ...void FuncN () { printf ( "Вход в FuncN \n " ); ... }
Здесь одно требование добавило похожий код к нескольким функциям одновременно. Таким образом, любое изменение требований здесь (а именно добавление номеров строк в журнал) теперь потребует значительных усилий. Shotgun surgery не является синонимом кодирования методом вырезать и вставить, как показано в этом тривиальном примере. Практику копирования кода можно рассматривать как «средство для достижения цели», где shotgun surgery — это просто «цель» (т. е. существует много способов прийти к одному и тому же выводу).
Проблемы с этим стилем в целом те же, что и при любом дублировании в программной системе; то есть дублирование одной и той же логики во многих местах может значительно увеличить затраты на внесение изменений в ту же логику позже. Некоторые из вышеупомянутых затрат измеримы, другие — нет (по крайней мере, не тривиально). Также есть некоторые свидетельства того, что этот антишаблон коррелирует с более высоким уровнем дефектов. [1]
Обычно следует ожидать некоторую комбинацию из следующих факторов:
Из них наиболее коварными являются психологические эффекты (например, см. теорию разбитых окон ), которые могут экспоненциально привести к порче программного обеспечения . [ нужна цитата ] Если это не контролировать, целые кодовые базы могут стать неподдерживаемыми. Обычно единственным решением этой проблемы является полное переписывание кода [ нужна цитата ] (со значительными затратами).
Аспектно-ориентированное программирование (АОП) направлено на сокращение этих форм инвазивных модификаций в пользу принятия «аспекта» или «заботы». Решения принимают форму шаблонного кода , который может быть применен к области функций одновременно (через процесс плетения ), что значительно сокращает количество дублированного кода. Использование доменно-специфичных языков также становится все более распространенным, когда легкие компиляторы пишутся для генерации большей части дублированного кода от имени программиста. Оба метода попадают в более широкие категории генерации кода и автоматизации.