Код-спагеті

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Код-спагеті або Спагеті-код — погано спроєктована, слабко структурована, заплутана і важка для розуміння програма. Особливо це стосується тих, які містять багато операторів безумовного переходу (GOTO), винятків та інших конструкцій, що погіршують структурованість.[1] Є найпоширенішим антипаттерном програмування.

Код-спагеті названий так, тому що хід виконання програми схожий на спагеті, тобто звивистий і заплутаний. Іноді його називають "код-кенгуру" (kangaroo code) через велику кількість інструкцій JUMP.

Наразі термін застосовується не тільки до випадків зловживання GOTO, але і до будь-якого "багатозв'язного" коду, в якому один і той же невеликий фрагмент виконується у великій кількості різних ситуацій і виконує дуже багато різних логічних функцій.

Код-спагеті зазвичай виникає:[2]

  • від недосвідченості розробників;
  • від серйозного тиску щодо термінів, який може здійснюватись керівництвом (наприклад, якщо в компанії діє система мотивації за "роботу якомога швидше"), або розробник сам собі ставить такі терміни (бажання все зробити найшвидшим способом).

При цьому не є результатом навмисного заплутування.

Код-спагеті може бути налагоджений та працювати правильно і з високою продуктивністю, але він вкрай складний для супроводу та розвитку. Внесення змін до коду-спагеті для додавання нових функцій іноді має такий величезний потенціал внесення нових помилок, що рефакторинг стає неминучим.

Приклад[ред. | ред. код]

Нижче наводиться приклад коду-спагеті мовою BASIC, який виконує просту дію: виводить на екран числа від 1 до 10 та їх квадрати. Реальні приклади коду-спагеті набагато складніші і заплутаніші, вони створюють великі проблеми при супроводі програм. Цей приклад є дещо примітивним.

i = 0
i = i + 1
if i <= 10 then goto 7
if i > 10 then goto 5
print "Виконання програми завершене."
end
print i: " в квадраті = ": i * i
goto 2

Той самий код, написаний на BASIC в стилі структурного програмування:

for i = 1 to 10
  print i: " в квадраті = ": i * i
next i
print "Виконання програми завершене."

Такий самий код у функціональному стилі з використанням методу ітерації, написаний мовою Ruby:

(1..10).each {|i| puts "#{i}\t в квадраті = #{i**2}"}
puts "Виконання програми завершене."

Пов'язані терміни[ред. | ред. код]

  • Код-равіолі — код, який складається з величезної кількості незалежних компонентів, і щоб зрозуміти, як виправити помилку на стику компонентів, треба "прориватися" через міжкомпонентні інтерфейси.
  • Код-пахлава або код-лазанья — код, в якому занадто багато (для даного завдання) шарів абстракції.[3]
  • Код-катамарі — код, який колись був написаний із дотриманням принципів написання "чистого" коду, але в процесі розвитку "обліплений" функціональністю, так само як "катамарі" з гри для PlayStation[ru].

Примітки[ред. | ред. код]

  1. John Vlissides, Kyle Brown, Gerard Meszaros AntiPatterns: The Survival Guide. Spaghetti code Архівовано 27 Січня 2021 у Wayback Machine.. (англ.)
  2. Markus, Pizka (2004). Straightening spaghetti-code with refactoring?. Software Engineering Research and Practice: 846–852. Архів оригіналу за 5 Березня 2018. Процитовано 25 грудня 2020.  (англ.)
  3. Томов, Латчезар; Іванова, Валентина (жовтень 2014). Teaching Good Practices In Software Engineering by Counterexamples. Computer Science and Education in Computer Science (1): 397–405. Процитовано 25 грудня 2020.  (англ.)

Посилання[ред. | ред. код]