Хвосты спагетти
«Код спагетти» — уничижительное словосочетание, обозначающее неструктурированный и сложный в обслуживании исходный код . Код спагетти может быть вызван несколькими факторами, такими как изменчивые требования к проекту, отсутствие правил стиля программирования и инженеров-программистов . недостаточность навыков или опыта [1]
Значение [ править ]
Код, в котором чрезмерно используются операторы GOTO , а не конструкции структурированного программирования , что приводит к запутанным и неподдерживаемым программам, часто называют спагетти-кодом. [2] Такой код имеет сложную и запутанную структуру управления , в результате чего поток программы концептуально похож на тарелку спагетти , запутанную и запутанную. [3]
В публикации Национального бюро стандартов США в 1980 году фраза « программа спагетти» использовалась для описания старых программ, имеющих «фрагментированные и разрозненные файлы». [4]
Код-спагетти также может описывать антишаблон, в котором объектно-ориентированный код написан в процедурном стиле, например, путем создания классов, методы которых слишком длинные и беспорядочные, или отказа от объектно-ориентированных концепций, таких как полиморфизм . [5] Наличие этой формы спагетти-кода может существенно снизить понятность системы. [6]
История [ править ]
Неясно, когда фраза «спагетти-код» вошла в обиход; однако в 1977 году появилось несколько упоминаний, в том числе «Макароны лучше, чем спагетти» Гая Стила . [7] В книге 1978 года «Букварь по дисциплинированному программированию с использованием PL/I, PL/CS и PL/CT» Ричард Конвей описал программы, которые «имеют такую же чистую логическую структуру, как тарелка спагетти». [8] фраза повторена в книге 1979 года «Введение в программирование», которую он написал в соавторстве с Дэвидом Грайсом . [9] В статье 1988 года «Спиральная модель разработки и улучшения программного обеспечения » этот термин используется для описания старой практики модели кода и исправлений , которая не имела планирования и в конечном итоге привела к развитию водопадной модели . [10] В книге 1979 года « Структурное программирование для программистов COBOL» автор Пол Нолл использует фразы «спагетти-код» и «крысиное гнездо» как синонимы для описания плохо структурированного исходного кода. [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 * i
4 IF i >= 100 THEN ПЕРЕЙТИ К 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
См. также [ править ]
- Большой ком грязи , программа без какой-либо заметной архитектуры.
- Международный конкурс запутанного кода на языке C — соревнование по созданию приятного и непонятного кода на языке C.
- Технический долг
- Элементы стиля программирования
Ссылки [ править ]
- ^ Маркус, Пицка (2004). «Исправление спагетти-кода с помощью рефакторинга?» (PDF) . Исследования и практика в области программной инженерии : 846–852. Архивировано из оригинала (PDF) 5 марта 2018 года . Проверено 5 марта 2018 г.
- ^ Крам, Дэвид; Хедли, Пол (2005). «Местоимения и процедурное значение: актуальность спагетти-кода и параноидального бреда» (PDF) . Рабочие документы Оксфордского университета по лингвистике, филологии и фонетике . 10 : 187–210. Архивировано из оригинала (PDF) 6 марта 2018 года . Проверено 5 марта 2018 г.
- ^ Хорстманн, Кей (2008). «Глава 6 — Итерация» . Концепции Java для AP Computer Science (5-е изд. [т.е. 2-е изд.]. Изд.). Хобокен, Нью-Джерси: J. Wiley & Sons. стр. 235–236. ISBN 978-0-470-18160-7 . Проверено 2 января 2017 г.
- ^ Национальное бюро стандартов США (1980). Специальное техническое издание ASTM . Типография правительства США.
- ^ Моха, Н.; Генеук, Ю.Г.; Дюсьен, Л.; Мер, А. Ф. Ле (январь 2010 г.). «ДЕКОР: метод спецификации и обнаружения запахов кода и дизайна». Транзакции IEEE по разработке программного обеспечения . 36 (1): 20–36. CiteSeerX 10.1.1.156.1524 . дои : 10.1109/TSE.2009.50 . ISSN 0098-5589 . S2CID 14767901 .
- ^ Аббес, М.; Хомх, Ф.; Генеук, Ю.Г.; Антониол, Г. (2011). «Эмпирическое исследование влияния двух антипаттернов, кода Blob и кода спагетти, на понимание программы». 2011 15-я Европейская конференция по сопровождению и реинжинирингу программного обеспечения . стр. 181–190. CiteSeerX 10.1.1.294.1685 . дои : 10.1109/CSMR.2011.24 . ISBN 978-1-61284-259-2 . S2CID 14152638 .
- ^ Гай Льюис Стил. 1977. Макароны лучше спагетти. В материалах симпозиума 1977 года по искусственному интеллекту и языкам программирования. Ассоциация вычислительной техники, Нью-Йорк, штат Нью-Йорк, США, 60–66. DOI: https://doi.org/10.1145/800228.806933.
- ^ Конвей, Ричард (1978). Учебник по дисциплинированному программированию с использованием PL/I, PL/CS и PL/CT . Издательство Уинтроп. ISBN 978-0-87626-712-7 .
- ^ Конвей, Ричард; Грис, Дэвид (1979). Введение в программирование (3-е изд.). Маленький, Браун. ISBN 978-0-316-15414-7 .
- ^ Бём, Барри В. (май 1988 г.). «Спиральная модель разработки и улучшения программного обеспечения». IEEE-компьютер . 21 (2): 61–72. дои : 10.1109/2.59 . S2CID 1781829 .
- ^ Нолл, Пол (1977). Структурное программирование для программиста COBOL: проектирование, документация, кодирование, тестирование . М. Мурач и партнеры.
- ^ Швилле, Юрген (1993). «Использование исключений и злоупотребление ими — 12 рекомендаций по правильной обработке исключений». Конспекты лекций по информатике . Ада – Европа '93 (Материалы). Конспекты лекций по информатике. Том. 688. Шпрингер Берлин Гейдельберг. стр. 142–152. дои : 10.1007/3-540-56802-6_12 . ISBN 978-3-540-56802-5 .
- ^ МТСБС [ нужны разъяснения ] (март – апрель 1981 г.). «Говоря по сути… байты FORTRAN!!». Мичиганский Техник . 99 (4).
{{cite journal}}
: CS1 maint: несколько имен: список авторов ( ссылка ) CS1 maint: числовые имена: список авторов ( ссылка ) - ^ Хэмминг, Ричард (1996). Искусство заниматься наукой и инженерией . Тейлор и Фрэнсис. ISBN 9056995006 .
- ^ Де Тройер, О. (13 мая 1991 г.). Андерсен, Рудольф; Бубенко Янис А.; Сёльвберг, Арне (ред.). Объектно-бинарная модель отношений: действительно объектно-ориентированная концептуальная модель (PDF) . Передовая инженерия информационных систем. Заметки по числовой механике жидкости и междисциплинарному проектированию. Том. 498. стр. 561–578. дои : 10.1007/3-540-54059-8_104 . ISBN 978-3-319-98176-5 . S2CID 10894568 .
- ^ Томов, Лачезар; Иванова, Валентина (октябрь 2014 г.). «Обучение передовому опыту разработки программного обеспечения на контрпримерах» . Информатика и образование в области компьютерных наук (1): 397–405 . Проверено 5 марта 2018 г.
Внешние ссылки [ править ]
- Перейти к заявлению, которое считается вредным . Классический отказ от спагетти-кода Эдсгера Дейкстры
- Мы не знаем, куда идти, если не знаем, откуда мы пришли. Р. Лоуренс Кларк из DATAMATION, декабрь 1973 г. Архивировано 16 июля 2018 г. на Wayback Machine.
- Рефакторинг кода спагетти Java в код Java bento , разделяющий чашу, полную кода, из одного класса на семь классов.
- «Объекты и фреймворки – шаг назад », Брайан Ринальди
- Программирование пасты — код спагетти, лазаньи, равиоли и макарон, заархивировано 21 января 2023 г. в Wayback Machine.
- Паста Теория программирования