Спагетти-код
Спагетти-код (также индусский код[1]) — плохо спроектированная, слабо структурированная, запутанная и трудная для понимания программа, особенно содержащая много операторов GOTO (как правило, переходов назад), исключений и других конструкций, ухудшающих структурированность[2]. Самый распространённый антипаттерн программирования.
Спагетти-код назван так, потому что ход выполнения программы похож на миску спагетти, то есть извилистый и запутанный. Иногда называется «кенгуру-код» (kangaroo code) из-за множества инструкций «jump».
В настоящее время термин применяется не только к случаям злоупотребления GOTO, но и к любому «многосвязному» коду, в котором один и тот же небольшой фрагмент исполняется в большом количестве различных ситуаций и выполняет очень много различных логических функций[2].
Спагетти-код обычно возникает от:
- неопытности разработчиков
- давления по срокам, установленного руководством (например, в принятой в компании системе мотивации на «работу быстрее»)[3]
- давления по срокам, установленного разработчиком самому себе (желание всё сделать наиболее быстрым способом)
- оптимизации времени исполнения программы[4]
при этом не является результатом преднамеренного запутывания.
Спагетти-код может быть отлажен и работать правильно и с высокой производительностью, но он крайне сложен в сопровождении и развитии[2]. Правка спагетти для добавления новой функциональности иногда несёт такой огромный потенциал внесения новых ошибок, что рефакторинг (главное лекарство от спагетти) становится неизбежным.
Пример
Ниже приводится пример спагетти-кода на Бейсике, выполняющего простое действие — печать чисел от 1 до 10 и их квадратов. Реальные примеры спагетти-кода гораздо более сложные и создают большие проблемы при сопровождении программ.
10 i = 0
20 i = i + 1
30 if i <= 10 then goto 70
40 if i > 10 then goto 50
50 print "Программа завершена."
60 end
70 print i: " в квадрате = ": i * i
80 goto 20
Тот же код, написанный на Бейсике в стиле структурного программирования:
for i = 1 to 10
print i: " в квадрате = ": i * i
next i
print "Программа завершена."
Тот же код в функциональном стиле с использованием метода итерации, написанный на языке Ruby:
(1..10).each {|i| puts "#{i}\t в квадрате = #{i**2}"}
puts "Программа завершена."
Связанные понятия
По аналогии со «спагетти-кодом» программисты придумали ещё несколько понятий, пока не общепринятых.
- Равиоли-код (Ravioli code) — Код, состоящий из огромного числа независимых компонентов, и чтобы понять, как исправить ошибку на стыке компонентов, надо «прорываться» через межкомпонентные интерфейсы. Его легко понять в классе, но не в контексте всего проекта[5][]
- Пахлава-код или Лазанья-код (Lasagna code) — Код, в котором слишком много (для данной задачи) слоёв абстракции. В попытке использовать принцип «слоёного теста» для избавления от спагетти кода, слои оказываются слишком зависимы друг от друга и любое изменение в одном уровне портит весь проект[5][]
- Пицца код (Pizza code) — Слишком плоская архитектура кода («спагетти» размазались по тарелке)[5][]
- Катамари-код — Код, некогда чистый, но в процессе развития облеплявшийся функциональностью, как «катамари» из игры для Playstation.
См. также
- IOCCC
Примечания
- ↑ Миллионы легендарных индийских программистов на грани увольнения за ненадобностью. Программисты из других стран на очереди - CNews . CNews.ru. Дата обращения: 21 сентября 2023. Архивировано 24 октября 2023 года.
- ↑ 1 2 3 John Vlissides, Kyle Brown, Gerard Meszaros AntiPatterns: The Survival Guide. Spaghetti code Архивная копия от 27 января 2021 на Wayback Machine.
- ↑ spmbt. О достоинствах спагетти-методологии // Habr : сайт ИТ статей. — 2014. — 1 января. Архивировано 27 апреля 2024 года.
- ↑ «Чистый» код, ужасная производительность . Хабр (13 апреля 2023). Дата обращения: 27 апреля 2024.
- ↑ 1 2 3 ZEL-Услуги | ИТ-компания. Что такое «Спагетти код»? Почему код «Равиоли», «Лазанья», «Пицца» — угроза бизнесу? // dzen.ru : сайт. — 2020. — 16 декабря.
Ссылки
- О вреде оператора Go To — статья Эдсгера Дейкстры.
- Spaghetti code // FOLDOC.