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

Поделись знанием:
Перейти к: навигация, поиск

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

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

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

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

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

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





Пример

Ниже приводится пример спагетти-кода на Бейсике, выполняющего простое действие — печать чисел от 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. 1 2 3 John Vlissides, Kyle Brown, Gerard Meszaros AntiPatterns: The Survival Guide. [sourcemaking.com/antipatterns/spaghetti-code Spaghetti code].

Ссылки

  • [www.vspu.ac.ru/~chul/dijkstra/goto/goto.htm О вреде оператора Go To] — статья Эдсгера Дейкстры.
  • [foldoc.org/spaghetti+code Spaghetti code] // FOLDOC.

Отрывок, характеризующий Спагетти-код

– Так завтра вы доложите государю?
– Непременно, а Кутузову не обещаю.
– Нет, обещайте, обещайте, Basile, [Василий,] – сказала вслед ему Анна Михайловна, с улыбкой молодой кокетки, которая когда то, должно быть, была ей свойственна, а теперь так не шла к ее истощенному лицу.
Она, видимо, забыла свои годы и пускала в ход, по привычке, все старинные женские средства. Но как только он вышел, лицо ее опять приняло то же холодное, притворное выражение, которое было на нем прежде. Она вернулась к кружку, в котором виконт продолжал рассказывать, и опять сделала вид, что слушает, дожидаясь времени уехать, так как дело ее было сделано.
– Но как вы находите всю эту последнюю комедию du sacre de Milan? [миланского помазания?] – сказала Анна Павловна. Et la nouvelle comedie des peuples de Genes et de Lucques, qui viennent presenter leurs voeux a M. Buonaparte assis sur un trone, et exaucant les voeux des nations! Adorable! Non, mais c'est a en devenir folle! On dirait, que le monde entier a perdu la tete. [И вот новая комедия: народы Генуи и Лукки изъявляют свои желания господину Бонапарте. И господин Бонапарте сидит на троне и исполняет желания народов. 0! это восхитительно! Нет, от этого можно с ума сойти. Подумаешь, что весь свет потерял голову.]
Князь Андрей усмехнулся, прямо глядя в лицо Анны Павловны.
– «Dieu me la donne, gare a qui la touche», – сказал он (слова Бонапарте, сказанные при возложении короны). – On dit qu'il a ete tres beau en prononcant ces paroles, [Бог мне дал корону. Беда тому, кто ее тронет. – Говорят, он был очень хорош, произнося эти слова,] – прибавил он и еще раз повторил эти слова по итальянски: «Dio mi la dona, guai a chi la tocca».
– J'espere enfin, – продолжала Анна Павловна, – que ca a ete la goutte d'eau qui fera deborder le verre. Les souverains ne peuvent plus supporter cet homme, qui menace tout. [Надеюсь, что это была, наконец, та капля, которая переполнит стакан. Государи не могут более терпеть этого человека, который угрожает всему.]
– Les souverains? Je ne parle pas de la Russie, – сказал виконт учтиво и безнадежно: – Les souverains, madame! Qu'ont ils fait pour Louis XVII, pour la reine, pour madame Elisabeth? Rien, – продолжал он одушевляясь. – Et croyez moi, ils subissent la punition pour leur trahison de la cause des Bourbons. Les souverains? Ils envoient des ambassadeurs complimenter l'usurpateur. [Государи! Я не говорю о России. Государи! Но что они сделали для Людовика XVII, для королевы, для Елизаветы? Ничего. И, поверьте мне, они несут наказание за свою измену делу Бурбонов. Государи! Они шлют послов приветствовать похитителя престола.]
И он, презрительно вздохнув, опять переменил положение. Князь Ипполит, долго смотревший в лорнет на виконта, вдруг при этих словах повернулся всем телом к маленькой княгине и, попросив у нее иголку, стал показывать ей, рисуя иголкой на столе, герб Конде. Он растолковывал ей этот герб с таким значительным видом, как будто княгиня просила его об этом.
– Baton de gueules, engrele de gueules d'azur – maison Conde, [Фраза, не переводимая буквально, так как состоит из условных геральдических терминов, не вполне точно употребленных. Общий смысл такой : Герб Конде представляет щит с красными и синими узкими зазубренными полосами,] – говорил он.