stringtranslate.com

Спагетти-код

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

Значение

Код, который злоупотребляет операторами GOTO вместо структурированных программных конструкций, что приводит к запутанным и неподдерживаемым программам, часто называют спагетти-кодом. [2] Такой код имеет сложную и запутанную структуру управления , что приводит к потоку программы, который концептуально похож на миску спагетти , перекрученную и запутанную. [3]

В публикации Национального бюро стандартов США 1980 года фраза «спагетти-программа» использовалась для описания старых программ, имеющих «фрагментированные и разбросанные файлы». [4]

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

История

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

На конференции Ada – Europe '93 было сказано, что Ada заставляет программиста «создавать понятный, а не спагетти-код» из-за его ограничительного механизма распространения исключений. [12]

В пародии на компьютерные языки, опубликованной в журнале The Michigan Technic в 1981 году под названием «По сути говоря...байты FORTRAN!!», автор описал FORTRAN, заявив, что «он полностью состоит из спагетти-кода». [13]

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

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

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

Равиоли код

Код равиоли — это термин, специфичный для объектно-ориентированного программирования . Он описывает код, который содержит хорошо структурированные классы , которые легко понять по отдельности, но трудно понять в целом. [15]

Код лазаньи

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

Примеры

Далее следует то, что можно было бы считать тривиальным примером спагетти-кода в BASIC . Программа выводит каждое из чисел от 1 до 100 на экран вместе с его квадратом. Отступы не используются для различения различных действий, выполняемых кодом, а GOTOоператоры программы создают зависимость от номеров строк . Поток выполнения из одной области в другую предсказать сложнее. Реальные случаи спагетти-кода более сложны и могут значительно увеличить расходы на обслуживание программы.

1 i = 0 2 i = i + 1 3 PRINT i ; "squared=" ; i * i 4 IF i >= 100 THEN GOTO 6 5 GOTO 2 6 PRINT "Программа завершена." 7 END              

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

1 ДЛЯ i = 1 ДО 100 2 ПЕЧАТЬ i ; "squared=" ; i * i 3 ДАЛЕЕ i 4 ПЕЧАТЬ "Программа завершена." 5 КОНЕЦ           

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

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

 INPUT "Сколько чисел нужно отсортировать?" ; 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 "Список отсортирован" FOR i = 1 TO T PRINT n ( i ) NEXT i                                                                                               

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

Ссылки

  1. ^ Маркус, Пизка (2004). «Выпрямление спагетти-кода с помощью рефакторинга?» (PDF) . Исследования и практика программной инженерии : 846–852. Архивировано из оригинала (PDF) 5 марта 2018 г. . Получено 5 марта 2018 г. .
  2. ^ Крам, Дэвид; Хедли, Пол (2005). «Местоимения и процедурное значение: релевантность спагетти-кода и параноидального бреда» (PDF) . Oxford University Working Papers in Linguistics, Philology and Phonetics . 10 : 187–210. Архивировано из оригинала (PDF) 6 марта 2018 г. . Получено 5 марта 2018 г. .
  3. ^ Хорстманн, Кей (2008). "Глава 6 - Итерация". Java Concepts for 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, YG; Duchien, L.; Meur, AF Le (январь 2010 г.). «DECOR: Метод спецификации и обнаружения запахов кода и дизайна». IEEE Transactions on Software Engineering . 36 (1): 20–36. CiteSeerX 10.1.1.156.1524 . doi :10.1109/TSE.2009.50. ISSN  0098-5589. S2CID  14767901. 
  6. ^ Аббес, М.; Хомх, Ф.; Гехенёк, И.Г.; Антониол, Г. (2011). «Эмпирическое исследование влияния двух антипаттернов, кода Blob и Spaghetti, на понимание программ». 2011 15-я Европейская конференция по обслуживанию и реинжинирингу программного обеспечения . С. 181–190. CiteSeerX 10.1.1.294.1685 . doi :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 . Winthrop Publishers. ISBN 978-0-87626-712-7.
  9. ^ Конвей, Ричард; Грайс, Дэвид (1979). Введение в программирование (3-е изд.). Литтл, Браун. ISBN 978-0-316-15414-7.
  10. ^ Boehm, Barry W. (май 1988). «Спиральная модель разработки и улучшения программного обеспечения». IEEE Computer . 21 (2): 61–72. doi :10.1109/2.59. S2CID  1781829.
  11. ^ Нолл, Пол (1977). Структурное программирование для программиста на COBOL: проектирование, документирование, кодирование, тестирование . M. Murach & Associates.
  12. ^ Швилле, Юрген (1993). «Использование и злоупотребление исключениями — 12 рекомендаций по правильной обработке исключений». Lecture Notes in Computer Science . Ada – Europe '93 (Proceedings). Lecture Notes in Computer Science. Vol. 688. Springer Berlin Heidelberg. pp. 142–152. doi :10.1007/3-540-56802-6_12. ISBN 978-3-540-56802-5.
  13. MTSBS [ требуется разъяснение ] (март–апрель 1981 г.). «По сути говоря... байты FORTRAN!!». The Michigan Technic . 99 (4).{{cite journal}}: CS1 maint: несколько имен: список авторов ( ссылка ) CS1 maint: числовые имена: список авторов ( ссылка )
  14. ^ Хэмминг, Ричард (1996). Искусство заниматься наукой и инженерией . Тейлор и Фрэнсис. ISBN 9056995006.
  15. ^ De Troyer, O. (13 мая 1991 г.). Andersen, Rudolf; Bubenko, Janis A.; Sølvberg, Arne (ред.). Модель OO-бинарных отношений: по-настоящему объектно-ориентированная концептуальная модель (PDF) . Advanced Information Systems Engineering. Notes on Numerical Fluid Mechanics and Multidisciplinary Design. Vol. 498. pp. 561–578. doi :10.1007/3-540-54059-8_104. ISBN 978-3-319-98176-5. S2CID  10894568.
  16. ^ Томов, Лачезар; Иванова, Валентина (октябрь 2014 г.). «Обучение передовым методам разработки программного обеспечения с помощью контрпримеров». Компьютерные науки и образование в области компьютерных наук (1): 397–405 . Получено 5 марта 2018 г.

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