Спагетти-код

Спагетти-код (также индусский код[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.

См. также

править

Примечания

править
  1. Миллионы легендарных индийских программистов на грани увольнения за ненадобностью. Программисты из других стран на очереди - CNews. CNews.ru. Дата обращения: 21 сентября 2023. Архивировано 24 октября 2023 года.
  2. 1 2 3 John Vlissides, Kyle Brown, Gerard Meszaros AntiPatterns: The Survival Guide. Spaghetti code Архивная копия от 27 января 2021 на Wayback Machine.
  3. spmbt. О достоинствах спагетти-методологии // Habr : сайт ИТ статей. — 2014. — 1 января. Архивировано 27 апреля 2024 года.
  4. «Чистый» код, ужасная производительность. Хабр (13 апреля 2023). Дата обращения: 27 апреля 2024.
  5. 1 2 3 ZEL-Услуги | ИТ-компания. Что такое «Спагетти код»? Почему код «Равиоли», «Лазанья», «Пицца» — угроза бизнесу? // dzen.ru : сайт. — 2020. — 16 декабря.

Ссылки

править