Спагетти-код (также индусский код[1]) — плохо спроектированная, слабо структурированная, запутанная и трудная для понимания программа, особенно содержащая много операторов GOTO (особенно переходов назад), исключений и других конструкций, ухудшающих структурированность[2]. Самый распространённый антипаттерн программирования.

Спагетти-код назван так, потому что ход выполнения программы похож на миску спагетти, то есть извилистый и запутанный. Иногда называется «кенгуру-код» (kangaroo code) из-за множества инструкций «jump».

В настоящее время термин применяется не только к случаям злоупотребления GOTO, но и к любому «многосвязному» коду, в котором один и тот же небольшой фрагмент исполняется в большом количестве различных ситуаций и выполняет очень много различных логических функций[2].

Спагетти-код обычно возникает:

  • от неопытности разработчиков;
  • от серьёзного давления по срокам, как установленного руководством (например, в принятой в компании системе мотивации на «работу быстрее»), так и установленного разработчиком самому себе (желание всё сделать наиболее быстрым способом)

при этом не является результатом преднамеренного запутывания.

Спагетти-код может быть отлажен и работать правильно и с высокой производительностью, но он крайне сложен в сопровождении и развитии[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 "Программа завершена."

Связанные понятия править

По аналогии со «спагетти-кодом» программисты придумали ещё несколько понятий, пока не общепринятых.

  • Равиоли-код — код, состоящий из огромного числа независимых компонентов, и чтобы понять, как исправить ошибку на стыке компонентов, надо «прорываться» через межкомпонентные интерфейсы.
  • Пахлава-код или лазанья-код — код, в котором слишком много (для данной задачи) слоёв абстракции.
  • Катамари-код — код, некогда чистый, но в процессе развития облеплявшийся функциональностью, как «катамари» из игры для 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.

Ссылки править