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