WikiSort.ru - Не сортированное

ПОИСК ПО САЙТУ | о проекте

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

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

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

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

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

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

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

Пример

Ниже приводится пример спагетти-кода на Бейсике, выполняющего простое действие — печать чисел от 1 до 10 и их квадратов. Реальные примеры спагетти-кода гораздо более сложные и создают большие проблемы при сопровождении программ.

1 10 i = 0
2 20 i = i + 1
3 30 if i <= 10 then goto 70
4 40 if i > 10 then goto 50
5 50 print "Программа завершена."
6 60 end
7 70 print i; " в квадрате = "; i * i
8 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. 1 2 3 John Vlissides, Kyle Brown, Gerard Meszaros AntiPatterns: The Survival Guide. Spaghetti code.

Ссылки

Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".

Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.

Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .




Текст в блоке "Читать" взят с сайта "Википедия" и доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия.

Другой контент может иметь иную лицензию. Перед использованием материалов сайта WikiSort.ru внимательно изучите правила лицензирования конкретных элементов наполнения сайта.

2019-2024
WikiSort.ru - проект по пересортировке и дополнению контента Википедии