stringtranslate.com

Код спагетти

«Код спагетти»уничижительное словосочетание, обозначающее неструктурированный и сложный в обслуживании исходный код . Код спагетти может быть вызван несколькими факторами, такими как изменчивые требования к проекту, отсутствие правил стиля программирования и недостаточность навыков или опыта инженеров-программистов . [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                                                                                               

Смотрите также

Рекомендации

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

Внешние ссылки