Код-спагеті
Код-спагеті або Спагеті-код — погано спроєктована, слабко структурована, заплутана і важка для розуміння програма. Особливо це стосується тих, які містять багато операторів безумовного переходу (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.
Примітки
- John Vlissides, Kyle Brown, Gerard Meszaros AntiPatterns: The Survival Guide. Spaghetti code. (англ.)
- Markus, Pizka (2004). Straightening spaghetti-code with refactoring?. Software Engineering Research and Practice: 846–852. Процитовано 25 грудня 2020. (англ.)
- Томов, Латчезар; Іванова, Валентина (жовтень 2014). Teaching Good Practices In Software Engineering by Counterexamples. Computer Science and Education in Computer Science (1): 397–405. Процитовано 25 грудня 2020. (англ.)
Посилання
- Про шкоду оператора GOTO — стаття відомого вченого в галузі комп'ютерних наук Едсгера Дейкстри (рос.)
- Spaghetti code — FOLDOC (англ.)