Хвосты спагетти
«Код спагетти» — уничижительное словосочетание, обозначающее трудный в обслуживании и неструктурированный исходный код . Код спагетти может быть вызван несколькими факторами, такими как изменчивые требования к проекту, отсутствие правил стиля программирования и инженеров-программистов . недостаточные способности или опыт [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 i=02 i=i+13 PRINT i;"squared=";i*i4 IF i>=100 THEN GOTO 65 GOTO 26 PRINT "Program Completed."7 END
Вот тот же код, написанный в стиле структурированного программирования :
1 FOR i=1 TO 1002 PRINT i;"squared=";i*i3 NEXT i4 PRINT "Program Completed."5 END
Программа переходит из одной области в другую, но этот переход формальный и более предсказуемый, поскольку циклы for и функции обеспечивают управление потоком , тогда как оператор goto обеспечивает произвольное управление потоком. Хотя этот пример небольшой, реальные программы состоят из множества строк кода, и их трудно поддерживать, если они написаны в виде спагетти-кода.
Вот еще один пример кода спагетти со встроенными операторами 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 'Calculations: C = TE180: C = INT(C / 2) IF C = 0 THEN GOTO C330 D = T - C E = 1I220: f = EF230: 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 I220C330: PRINT "The sorted list is" 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.
- Паста Теория программирования