Спагетти-код — уничижительное выражение для сложного в обслуживании и неструктурированного исходного кода компьютера . Код, разработанный с плохой структурой, может быть вызван любым из нескольких факторов, таких как изменчивые требования к проекту, отсутствие правил стиля программирования и инженеры-программисты с недостаточными способностями или опытом. [1]
Код, который злоупотребляет операторами GOTO вместо структурированных программных конструкций, что приводит к запутанным и неподдерживаемым программам, часто называют спагетти-кодом. [2] Такой код имеет сложную и запутанную структуру управления , что приводит к потоку программы, который концептуально похож на миску спагетти , перекрученную и запутанную. [3]
В публикации Национального бюро стандартов США 1980 года фраза «программа-спагетти» использовалась для описания старых программ, имеющих «фрагментированные и разбросанные файлы». [4]
Спагетти-код также может описывать антишаблон , в котором объектно-ориентированный код написан в процедурном стиле, например, путем создания классов, методы которых слишком длинные и запутанные, или отказа от объектно-ориентированных концепций, таких как полиморфизм . [5] Наличие этой формы спагетти-кода может значительно снизить понятность системы. [6]
Неясно, когда фраза спагетти-код вошла в обиход; однако, в 1977 году появилось несколько ссылок, включая «Макароны лучше спагетти » Гая Стила . [7] В книге 1978 года « A primer on disciplined programming using PL/I, PL/CS и PL/CT » Ричард Конвей описал программы, которые «имеют такую же четкую логическую структуру, как тарелка спагетти», [8] фраза, повторенная в книге 1979 года «Введение в программирование», которую он написал в соавторстве с Дэвидом Грайсом . [9] В статье 1988 года « Спиральная модель разработки и улучшения программного обеспечения » этот термин используется для описания старой практики модели кода и исправления , в которой отсутствовало планирование и которая в конечном итоге привела к разработке модели водопада . [10] В книге 1979 года « Структурное программирование для программиста на COBOL» автор Пол Нолл использует фразы спагетти-код и крысиное гнездо как синонимы для описания плохо структурированного исходного кода. [11]
На конференции Ada – Europe '93 было сказано, что Ada заставляет программиста «создавать понятный, а не спагетти-код» из-за его ограничительного механизма распространения исключений. [12]
В пародии на компьютерные языки, опубликованной в журнале The Michigan Technic в 1981 году под названием «По сути говоря...байты FORTRAN!!», автор описал FORTRAN, заявив, что «он полностью состоит из спагетти-кода». [13]
Ричард Хэмминг описал в своих лекциях [14] этимологию термина в контексте раннего программирования в двоичных кодах:
Если при исправлении ошибки вы хотели вставить некоторые пропущенные инструкции, то вы брали непосредственно предшествующую инструкцию и заменяли ее переносом на некоторое пустое место. Там вы вставляли инструкцию, которую только что переписали, добавляли инструкции, которые хотели вставить, а затем следовал перенос обратно в основную программу. Таким образом, программа вскоре становилась последовательностью переходов управления в странные места. Когда, как это почти всегда бывает, в исправлениях были ошибки, вы затем снова использовали тот же трюк, используя какое-то другое доступное место. В результате путь управления программы через хранилище вскоре принимал вид банки спагетти. Почему бы просто не вставить их в последовательность инструкций? Потому что тогда вам пришлось бы пройтись по всей программе и изменить все адреса, которые ссылались на любую из перемещенных инструкций! Все, что угодно, только не это!
Код равиоли — это термин, специфичный для объектно-ориентированного программирования . Он описывает код, который содержит хорошо структурированные классы , которые легко понять по отдельности, но трудно понять в целом. [15]
Код «Лазанья» относится к коду, слои которого настолько сложны и переплетены, что внесение изменений в один слой потребует внесения изменений во все остальные слои. [16]
Далее следует то, что можно было бы считать тривиальным примером спагетти-кода в BASIC . Программа выводит каждое из чисел от 1 до 100 на экран вместе с его квадратом. Отступы не используются для различения различных действий, выполняемых кодом, а GOTO
операторы программы создают зависимость от номеров строк . Поток выполнения из одной области в другую сложнее предсказать. Реальные случаи спагетти-кода более сложны и могут значительно увеличить расходы на обслуживание программы.
1 i = 0 2 i = i + 1 3 PRINT i ; "squared=" ; i * i 4 IF i >= 100 THEN GOTO 6 5 GOTO 2 6 PRINT "Программа завершена." 7 END
Вот тот же код, написанный в стиле структурного программирования :
1 ДЛЯ i = 1 ДО 100 2 ПЕЧАТЬ i ; "squared=" ; i * i 3 ДАЛЕЕ i 4 ПЕЧАТЬ "Программа завершена." 5 КОНЕЦ
Программа переходит из одной области в другую, но этот переход формален и более предсказуем, поскольку циклы и функции for обеспечивают управление потоком , тогда как оператор goto поощряет произвольное управление потоком. Хотя этот пример небольшой, реальные программы состоят из множества строк кода и их трудно поддерживать, если они написаны в стиле спагетти-кода.
Вот еще один пример спагетти-кода со встроенными операторами GOTO.
INPUT "Сколько чисел нужно отсортировать?" ; T DIM n ( T ) FOR i = 1 TO T PRINT "NUMBER:" ; i INPUT n ( i ) NEXT i 'Вычисления: C = T E180: C = INT ( C / 2 ) IF C = 0 THEN GOTO C330 D = T - C E = 1 I220: f = E F230: g = f + C IF n ( f ) > n ( g ) THEN SWAP n ( f ), n ( g ) f = f - C IF f > 0 THEN GOTO F230 E = E + 1 IF E > D THEN GOTO E180 GOTO I220 C330: PRINT "Список отсортирован" FOR i = 1 TO T PRINT n ( i ) NEXT i
{{cite journal}}
: CS1 maint: несколько имен: список авторов ( ссылка ) CS1 maint: числовые имена: список авторов ( ссылка )