Стрільба дробом () — це антипатерн у розробці програмного забезпечення, який виникає, коли реалізація нової функціональності в вимагає внесення змін до великої кількості різних класів або модулів одночасно.

Це явище є поширеним у багатьох сценаріях, оскільки значна частина зусиль розробників зазвичай спрямована на додавання нових функцій для вдосконалення програмного продукту. Як наслідок, ці нововведення можуть вимагати одночасного додавання схожого коду в кількох місцях, часто лише з незначними варіаціями.

Через швидкий темп комерційної розробки програмного забезпечення часто бракує часу на структурну перебудову (або рефакторинг) системи, яка б дозволила впроваджувати нові функції без зайвих зусиль. У результаті набуває поширення практика програмування методом копіювання-вставлення (англ. copy-and-paste programming): код пишеться в одному місці, а потім просто копіюється в усі інші місця, де потрібна така реалізація (з внесенням необхідних змін безпосередньо на місці).

Такий підхід суперечить , також відомого як правило «Один і лише один раз» (англ. Once and Only Once). Головна проблема полягає в тому, що навіть незначна зміна логіки вимагає модифікації коду в багатьох частинах системи.

Крім того, будь-яка помилка в новій функціональності автоматично дублюється. Це перетворює процес налагодження на складну та трудомістку задачу, адже виправляти дефект доводиться у кожній копії окремо. Навіть за відсутності прямого копіювання, різні реалізації залишаються схожими, а тому потребують синхронних змін при оновленні вимог.

Фактично, цей стиль розробки надає перевагу короткостроковим покращенням (швидкому додаванню функцій) коштом довгострокової стабільності та зручності підтримки системи.

Приклад Класичним прикладом такої практики є журналювання (англ. logging), яке зазвичай передбачає додавання вступного коду до багатьох функцій одночасно, наприклад:

Може бути перетворено на:

У цьому випадку реалізація однієї вимоги призвела до додавання схожого коду до кількох функцій одночасно. Як наслідок, будь-яка зміна у вимогах (зокрема, додавання номерів рядків до логу) тепер вимагатиме значних зусиль.

Як ілюструє цей простий приклад, стрільба дробом не є синонімом програмування методом копіювання-вставки. Практику копіювання коду можна розглядати як «засіб», тоді як стрільба дробом є власне «наслідком» (іншими словами, до цього ж результату можна прийти різними шляхами).

Наслідки стрільби дробом Головні недоліки «стрільби дробом» подібні до загальних проблем дублювання коду. Коли однакова логіка розкидана по багатьох місцях, будь-які майбутні зміни стають значно дорожчими. Частину цих витрат можна легко обчислити, тоді як інші оцінити набагато важче. Крім того, існують свідчення, що цей антипатерн призводить до зростання кількості дефектів у системі.

Зазвичай слід очікувати поєднання таких наслідків:

Зростання трудовитрат розробників та зниження продуктивності (англ. throughput). Пов'язані з цим фінансові витрати (що є особливо критичним для комерційної розробки). Психологічні чинники та ймовірне занедбання коду.

Найпідступнішими серед них є психологічні наслідки, які здатні експоненціально прискорити . Якщо цей процес стає неконтрольованим, він може зробити цілі кодові бази непридатними для підтримки. Здебільшого, єдиний спосіб усунути цю проблему — повністю переписати код (що пов'язане зі значними фінансовими витратами).

Мінімізація проблеми Аспектно-орієнтоване програмування (АОП) дозволяє уникнути «інвазивних» змін, замінюючи їх «аспектами» (або «наскрізними задачами», ). Цей підхід базується на використанні , який охоплює одразу цілий набір функцій (через процес, відомий як , ). Це дає змогу суттєво зменшити дублювання.

Крім того, дедалі популярнішими стають предметно-орієнтовані мови (DSL). Для них застосовують спрощені компілятори, які здатні автоматично генерувати левову частку рутинного коду замість програміста. Обидва підходи є частиною загального напрямку генерації коду та автоматизації.

Див. також

Технічний борг Рефакторинг Запахи коду

Примітки

Посилання Стрільба дробом на сайті Refactoring.Guru