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

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

Имея в виду

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

История

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

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

В 1981 году в издании Michigan Technic подделке компьютерных языков под названием «БАЗОВЫЕ БАЙТЫ ... FORTRAN bytes !!» автор описал FORTRAN, заявив, что «он полностью состоит из спагетти-кода».

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

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

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

Код равиоли

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

Код лазаньи

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

Примеры

Далее следует то, что можно было бы считать тривиальным примером кода спагетти в 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 "Program Completed.";

7 END

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

1 FOR i=1 TO 100
2     PRINT i;"squared=";i*i
3 NEXT i
4 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 = 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 "The sorted list is"
  FOR i = 1 TO T
    PRINT n(i)
  NEXT i

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

использованная литература

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