Спагетти-код.
Исходный код программы с плохой структурой
Спагетти-код — это компьютерный исходный код, в котором закодирован настолько запутанный поток управления, что его трудно понять. Управляющие операторы направляют выполнение программы так, что вместо качественной структуры он напоминает варёные спагетти — перекрученные и спутанные. Такой код, как правило, трудно сопровождать.
Поскольку логика потока управления, закодированная с помощью оператора goto, обычно ведёт к запутанному потоку управления, использование goto часто ассоциируется с отнесением кода к спагетти-коду. Практика структурного программирования была задумана для того, чтобы устранить необходимость в операторе goto и его применении как один из способов избежать появления спагетти-кода. Обеспечение создания высококачественного программного обеспечения вместо спагетти-кода часто связано с такими аспектами, как использование более удачных инструментов, обучение разработчиков и совершенствование процессов разработки программного обеспечения.
Спагетти-код может также описывать антипаттерн, при котором объектно-ориентированный код пишется в процедурном стиле, например путём создания классов, методы которых чрезмерно длинны и неаккуратны, либо отказа от объектно-ориентированных концепций, таких как полиморфизм. Наличие такой разновидности спагетти-кода может значительно снизить понятность системы.
История
Неясно, когда был введён термин спагетти-код. Мартин Хопкинс одним из первых упомянул спагетти в этом контексте в 1972 году, написав, что «основная мотивация при отказе от оператора goto — это надежда, что получившиеся программы не будут выглядеть как тарелка спагетти». В книге 1978 года A primer on disciplined programming using PL/I, PL/CS, and PL/CT Ричард Конвей описывал программы, которые «имеют такую же чёткую логическую структуру, как тарелка спагетти», — эта фраза повторялась в книге 1979 года An Introduction to Programming, написанной им в соавторстве с Дэвидом Грисом. В статье 1988 года A spiral model of software development and enhancement этот термин используется для описания более старой практики модели «написал и исправил» (code and fix model), в которой не было планирования и которая в конечном итоге привела к разработке каскадной модели. В книге 1979 года Structured programming for the COBOL programmer автор Пол Нолл использует выражения спагетти-код и крысиное гнездо как синонимы для описания плохо структурированного исходного кода.
На конференции Ada – Europe '93 язык Ada был охарактеризован как заставляющий программиста «создавать понятный код вместо спагетти-кода» благодаря его ограничивающему механизму распространения исключений.
В публикации Национального бюро стандартов США 1980 года выражение спагетти-программа использовалось для описания старых программ, имевших «фрагментированные и разбросанные файлы».
В пародии на компьютерные языки 1981 года в журнале The Michigan Technic под названием «BASICally speaking...FORTRAN bytes!!» автор описывал FORTRAN, утверждая, что «он целиком состоит из спагетти-кода».
Ричард Хэмминг в своих лекциях описывал происхождение этого термина в контексте раннего программирования в двоичных кодах:
Если при исправлении ошибки вы хотели вставить какие-то пропущенные инструкции, вы брали непосредственно предшествующую инструкцию и заменяли её переходом в какое-нибудь пустое место. Туда вы помещали инструкцию, которую только что перезаписали, добавляли инструкции, которые хотели вставить, а затем — переход обратно в основную программу. Таким образом, программа вскоре превращалась в последовательность переходов управления в странные места. Когда, как почти всегда случается, в исправлениях обнаруживались ошибки, вы снова применяли тот же приём, используя какое-нибудь другое доступное место. В результате путь управления программы по памяти вскоре приобретал вид банки со спагетти. Почему было не вставить их просто в ход инструкций? Потому что тогда пришлось бы пройти всю программу целиком и изменить все адреса, которые ссылались на какие-либо из перемещённых инструкций! Только не это!
Примеры
Простой
Следующий код на BASIC — программа, печатающая числа от 1 до 100, — относительно простой пример кода, который легче понять при структурированном потоке управления вместо использования goto. Использование GOTO для организации цикла и отсутствие отступов делают логику менее прозрачной.
1 i=0
2 i=i+1
3 PRINT i
4 IF i>=100 THEN GOTO 6
5 GOTO 2
6 END
Следующий код даёт тот же результат, но использует структурированный оператор цикла и отступы для улучшения читаемости.
1 FOR i=1 TO 100
2 PRINT i
3 NEXT i
4 END
Более показательный
Следующий код реализует числовой алгоритм сортировки. Использование операторов goto придаёт потоку управления спагетти-подобный характер.
INPUT "How many numbers should be sorted? "; 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 "The sorted list is"
FOR i = 1 TO T
PRINT n(i)
NEXT i
Связанные понятия
Большой ком грязи
Большой ком грязи (big ball of mud) — это программная система, в которой отсутствует различимая архитектура. Хотя с точки зрения программной инженерии такие системы нежелательны, на практике они встречаются часто из-за коммерческого давления, текучести кадров разработчиков и программной энтропии. Термин был популяризирован Брайаном Футом и Джозефом Йодером, хотя они приписывают его авторство Брайану Марику.
Большой ком грязи — это беспорядочно структурированные, расползающиеся, неряшливые, скреплённые скотчем и проволокой джунгли спагетти-кода. Такие системы несут на себе безошибочные следы неконтролируемого роста и многократного, наспех выполненного ремонта. Информация беспорядочно используется совместно отдалёнными элементами системы, нередко до такой степени, что почти вся важная информация становится глобальной или дублируется.
Общая структура системы, возможно, никогда не была чётко определена.
Если же она и была определена, она могла размыться до неузнаваемости. Программисты с хоть какой-то долей архитектурного чутья сторонятся этих трясин. Только те, кому архитектура безразлична и кому, возможно, комфортно мириться с инерцией каждодневной рутины латания дыр в этих рушащихся дамбах, готовы работать над такими системами.
— Брайан Фут и Джозеф Йодер, Big Ball of Mud. Fourth Conference on Patterns Languages of Programs (PLoP '97/EuroPLoP '97) Monticello, Illinois, September 1997
Связанные с пастой
Вдохновлённые популярностью термина спагетти-код, появились и другие пастообразные термины, описывающие структурный характер кода: