Операция с дробовиком - Shotgun surgery

Это визуализирует операцию с дробовиком
Операция с дробовиком также может произойти, когда изменение на «Класс A» вызывает несколько незначительных изменений в других классах в системе программного обеспечения.

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

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

Пример

Канонический пример такой практики: протоколирование который обычно добавляет код пролога ко многим функциям одновременно, например:

пустота MyFunc() {  ...}пустота MyFunc2() {  ...}...пустота MyFuncN() {  ...}

Может быть преобразовано в:

пустота MyFunc() {  printf("Вход в MyFunc");  ...}пустота MyFunc2() {  printf("Вход в MyFunc2");  ...}...пустота MyFuncN() {  printf("Вход в MyFuncN");  ...}

Здесь одно требование добавило аналогичный код к нескольким функциям одновременно. Таким образом, любое изменение требований (а именно добавление номеров строк в журнал) теперь потребует значительных усилий. Как видно из этого тривиального примера, хирургия дробовика не является синонимом кодирования методом вырезания и вставки. Практику копирования кода можно рассматривать как «средство для достижения цели», где хирургия дробовика - просто «конец» (т.е. есть много способов прийти к такому же выводу).

Последствия хирургии дробовика

Проблемы с этим стилем в основном такие же, как и при любом дублировании в программной системе; то есть дублирование одной и той же логики во многих местах может значительно увеличить затраты на внесение изменений в ту же логику позже. Некоторые из вышеупомянутых затрат поддаются измерению, другие - нет (по крайней мере, нетривиально). Есть также некоторые свидетельства того, что этот антипаттерн коррелирует с более высоким уровнем дефектов.[1]

Обычно следует ожидать некоторого сочетания следующих факторов:

  • Увеличение усилий разработчика и снижение пропускной способности
  • Соответствующая денежная стоимость вышеперечисленного (как при коммерческой разработке)
  • Психологические эффекты и возможное пренебрежение кодом

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

Смягчение

Аспектно-ориентированное программирование (АОП) направлено на сокращение этих форм инвазивных модификаций в пользу принятия «аспекта» или «проблемы». Решения имеют вид шаблонный код которые могут быть применены к области функций одновременно (через процесс ткачество ), что значительно сокращает количество дублированного кода. Использование Языки, специфичные для домена также становится все более распространенным там, где легкие компиляторы написаны для генерации большей части дублированного кода от имени программиста. Оба метода относятся к более широким категориям генерация кода и автоматизация.

Смотрите также

Рекомендации

  1. ^ «Исследование неприятных запахов в объектно-ориентированном дизайне - публикация конференции IEEE». Дои:10.1109 / ITNG.2006.31. S2CID  13107711. Цитировать журнал требует | журнал = (помощь)