Код спагетти - Spaghetti code

Код спагетти это уничижительный фраза для неструктурированных и трудных для пониманияподдерживать исходный код. Спагетти-код может быть вызван несколькими факторами, такими как изменчивость проект требования, отсутствие стиль программирования правила, а также недостаточные способности или опыт.[1]

Смысл

Код, который злоупотребляет ИДТИ К заявления, а не структурное программирование конструкции, приводящие к запутанным и не поддерживаемым программам, часто называют спагетти-кодом.[2]Такой код имеет сложный и запутанный структура управления, в результате чего поток программы концептуально похож на миска спагетти, скрученный и запутанный.[3]В публикации 1980 г. Национальное бюро стандартов США, фраза программа спагетти использовался для описания старых программ, имеющих «фрагментированные и разрозненные файлы».[4]Код спагетти также может описывать антипаттерн в котором объектно-ориентированный код написан в процедурном стиле, например, путем создания классов, методы которых слишком длинные и беспорядочные, или отказа от объектно-ориентированных концепций, таких как полиморфизм.[5] Наличие этой формы спагетти-кода может значительно снизить понятность системы.[6]

История

Неясно, когда фраза «спагетти-код» вошла в обиход; однако в 1977 г. появилось несколько ссылок, в том числе Макароны лучше спагетти Стила, опубликованной в Proceedings of the 1977 г. симпозиума по искусственному интеллекту и языкам программирования. В книге 1978 года Учебник по дисциплинированному программированию с использованием PL / I, PL / CS и PL / CTРичард Конвей использовал этот термин для описания типов программ, которые «имеют такую ​​же чистую логическую структуру, как тарелка спагетти»,[7] фраза, повторенная в книге 1979 года Введение в программирование он в соавторстве с Дэвид Грис.[8] В статье 1988 г. Спиральная модель разработки и улучшения программного обеспечения, этот термин используется для описания старой практики код и исправить модель, который не был спланирован и в конечном итоге привел к развитию модель водопада.[9] В книге 1979 г. Структурированное программирование для программиста COBOL, автор Пол Нолл использует фразы код спагетти и крысиное гнездо как синонимы для описания плохо структурированного исходного кода.[10]

в Ада - Европа '93 конференция, Ада был описан как вынуждающий программиста «создавать понятный код вместо спагетти» из-за его ограничительного механизма распространения исключений.[11]

В 1981 году компьютерная подделка языков Техника Мичигана озаглавленный "ОБЩИМ языком ... байты FORTRAN !!", автор описал FORTRAN заявив, что «он полностью состоит из кода спагетти».[12]

Ричард Хэмминг описал в своих лекциях[13] этимология термина в контексте раннего программирования в двоичных кодах:

Если при исправлении ошибки вы хотели вставить некоторые пропущенные инструкции, вы взяли непосредственно предыдущую инструкцию и заменили ее переносом в какое-то пустое место. Там вы вставляете инструкцию, которую только что написали, добавляете инструкции, которые хотите вставить, а затем переходите обратно в основную программу. Таким образом, программа вскоре превратилась в последовательность переходов элемента управления в странные места. Когда, как это почти всегда бывает, в исправлениях были ошибки, вы снова использовали тот же трюк, используя другое доступное пространство. Как результат Путь управления программой через хранилище вскоре стал похож на банку спагетти. Почему бы просто не вставить их в инструкции? Потому что тогда вам придется просмотреть всю программу и изменить все адреса, относящиеся к любой из перемещенных инструкций! Что угодно, только не это!

Связанные фразы

Код равиоли

Равиоли код - это термин, относящийся к объектно-ориентированного программирования. Он описывает код, который содержит хорошо структурированный классы которые легко понять изолированно, но трудно понять в целом.[14]

Код лазаньи

Лазанья Код относится к коду, слои которого настолько сложны и взаимосвязаны, что внесение изменений в один слой потребует изменений во всех других слоях.[15]

Примеры

Далее следует то, что можно было бы считать тривиальным примером кода спагетти в БАЗОВЫЙ. Программа выводит на экран каждое из чисел от 1 до 100 вместе с квадратом. Отступы не используются для различения различных действий, выполняемых кодом, и того, что программа ИДТИ К заявления создают опору на номера строк. Переход от одной области к другой предсказать сложнее. Реальные случаи появления спагетти-кода более сложны и могут значительно увеличить затраты на обслуживание программы.

1я=02я=я+13РАСПЕЧАТАТЬя;"в квадрате =";я*я4ЕСЛИя>=100ТОГДАИДТИ К65ИДТИ К26РАСПЕЧАТАТЬ«Программа завершена».7КОНЕЦ

Вот тот же код, написанный на структурное программирование стиль:

1ЗАя=1К1002РАСПЕЧАТАТЬя;"в квадрате =";я*я3СЛЕДУЮЩИЙя4РАСПЕЧАТАТЬ«Программа завершена».5КОНЕЦ

Программа перескакивает из одной области в другую, но этот переход является формальным и более предсказуемым, потому что для петель и функции предоставлять управление потоком тогда как идти к заявление поощряет произвольный контроль потока. Хотя этот пример невелик, реальные программы состоят из многих строк кода и их трудно поддерживать, если они написаны в виде спагетти-кода.

Вот еще один пример кода спагетти со встроенными операторами GOTO.

ВХОД«Сколько чисел нужно отсортировать?»;ТТусклыйп(Т)ЗАя=1КТРАСПЕЧАТАТЬ"НОМЕР:";яВХОДп(я)СЛЕДУЮЩИЙяРасчеты:C=ТE180:C=INT(C/2)ЕСЛИC=0ТОГДАИДТИ КC330D=Т-CE=1I220:ж=EF230:грамм=ж+CЕСЛИп(ж)>п(грамм)ТОГДАЗАМЕНАп(ж),п(грамм)ж=ж-CЕСЛИж>0ТОГДАИДТИ КF230E=E+1ЕСЛИE>DТОГДАИДТИ КE180ИДТИ КI220C330:РАСПЕЧАТАТЬ"Отсортированный список"ЗАя=1КТРАСПЕЧАТАТЬп(я)СЛЕДУЮЩИЙя

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

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

  1. ^ Маркус, Пицка (2004). "Выпрямление спагетти-кода с помощью рефакторинга?" (PDF). Исследования и практика программной инженерии: 846–852. Получено 5 марта 2018.
  2. ^ Крэм, Дэвид; Хедли, Пол (2005). «Местоимения и процедурное значение: актуальность спагетти-кода и параноидального заблуждения» (PDF). Рабочие документы Оксфордского университета по лингвистике, филологии и фонетике. 10: 187–210. Получено 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. ^ Moha, N .; Gueheneuc, Y.G .; Duchien, L .; Меур, А. Ф. Ле (январь 2010 г.). «ДЕКОР: Метод определения и обнаружения кодовых и дизайнерских запахов». IEEE Transactions по разработке программного обеспечения. 36 (1): 20–36. CiteSeerX  10.1.1.156.1524. Дои:10.1109 / TSE.2009.50. ISSN  0098-5589.
  6. ^ Abbes, M .; Khomh, F .; Gueheneuc, Y.G .; Антониол, Г. (2011). Эмпирическое исследование влияния двух антипаттернов, кода Blob и Spaghetti, на понимание программы. 2011 15-я Европейская конференция по обслуживанию и реинжинирингу программного обеспечения. С. 181–190. CiteSeerX  10.1.1.294.1685. Дои:10.1109 / CSMR.2011.24. ISBN  978-1-61284-259-2.
  7. ^ Конвей, Ричард (1978). Учебник по дисциплинированному программированию с использованием PL / I, PL / CS и PL / CT. Издатели Winthrop. ISBN  978-0-87626-712-7.
  8. ^ Конвей, Ричард; Грис, Дэвид (1979). Введение в программирование (3-е изд.). Маленький, Браун. ISBN  978-0-316-15414-7.
  9. ^ Бем, Барри В. (май 1988 г.). «Спиральная модель разработки и улучшения программного обеспечения». IEEE Computer. 21 (2): 61–72. Дои:10.1109/2.59.
  10. ^ Нолл, Пол (1977). Структурированное программирование для программиста на COBOL: дизайн, документация, кодирование, тестирование. М. Мурач и партнеры.
  11. ^ Швилле, Юрген (1993). «Использование исключений и злоупотребление ими - 12 рекомендаций по правильной обработке исключений». Конспект лекций по информатике. Ада - Европа '93 (Труды). 688. Springer Berlin Heidelberg. С. 142–152. Дои:10.1007/3-540-56802-6_12.
  12. ^ МТСБС[требуется разъяснение ] (Март – апрель 1981 г.). «ОБЩИМ ОБРАЗОМ ... байты FORTRAN !!». Техника Мичигана. 99 (4).CS1 maint: несколько имен: список авторов (связь)
  13. ^ Хэмминг, Ричард (1996). Искусство заниматься наукой и разработкой. ISBN  9056995006.
  14. ^ Тройер, О. Де (13 мая 1991 г.). Модель объектно-ориентированных отношений: действительно объектно-ориентированная концептуальная модель. Передовая инженерия информационных систем. Заметки о численной механике жидкости и междисциплинарном проектировании. 141. С. 561–578. Дои:10.1007/3-540-54059-8_104. ISBN  978-3-319-98176-5.
  15. ^ Томов, Латчезар; Иванова, Валентина (октябрь 2014 г.). «Обучение передовым методам разработки программного обеспечения с помощью контрпримеров». Компьютерные науки и образование в области компьютерных наук (1): 397–405. Получено 5 марта 2018.

внешняя ссылка