Код-спагеті або Спагеті-код — погано спроєктована, слабко структурована, заплутана і важка для розуміння програма. Особливо це стосується тих програм, які містять багато операторів безумовного переходу (GOTO), винятків та інших конструкцій, що погіршують структурованість. Є найпоширенішим антипаттерном програмування.
Код-спагеті названий так, тому що хід виконання програми схожий на спагеті, тобто звивистий і заплутаний. Іноді його називають "код-кенгуру" (kangaroo code) через велику кількість інструкцій JUMP.
Наразі термін застосовується не тільки до випадків зловживання GOTO, але і до будь-якого "багатозв'язного" коду, в якому один і той же невеликий фрагмент виконується у великій кількості різних ситуацій і виконує дуже багато різних логічних функцій.
Код-спагеті зазвичай виникає:
- від недосвідченості розробників;
- від серйозного тиску щодо термінів, який може здійснюватись керівництвом (наприклад, якщо в компанії діє система мотивації за "роботу якомога швидше"), або розробник сам собі ставить такі терміни (бажання все зробити найшвидшим способом).
При цьому не є результатом навмисного заплутування.
Код-спагеті може бути налагоджений та працювати правильно і з високою продуктивністю, але він вкрай складний для супроводу та розвитку. Внесення змін до коду-спагеті для додавання нових функцій іноді має такий величезний потенціал внесення нових помилок, що рефакторинг стає неминучим.
Приклад
Нижче наводиться приклад коду-спагеті мовою 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 "Виконання програми завершене."
Пов'язані терміни
- Код-равіолі — код, який складається з величезної кількості незалежних компонентів, і щоб зрозуміти, як виправити помилку на стику компонентів, треба "прориватися" через міжкомпонентні інтерфейси.
- Код-пахлава або код-лазанья — код, в якому занадто багато (для даного завдання) шарів абстракції.
- Код-катамарі — код, який колись був написаний із дотриманням принципів написання "чистого" коду, але в процесі розвитку "обліплений" функціональністю, так само як "катамарі" з [en].
Примітки
- John Vlissides, Kyle Brown, Gerard Meszaros AntiPatterns: The Survival Guide. Spaghetti code [ 27 Січня 2021 у Wayback Machine.]. (англ.)
- Markus, Pizka (2004). (PDF). Software Engineering Research and Practice: 846—852. Архів оригіналу (PDF) за 5 Березня 2018. Процитовано 25 грудня 2020. (англ.)
- Томов, Латчезар; Іванова, Валентина (жовтень 2014). Teaching Good Practices In Software Engineering by Counterexamples. Computer Science and Education in Computer Science (1): 397—405. Процитовано 25 грудня 2020. (англ.)
Посилання
- Про шкоду оператора GOTO [ 9 Січня 2020 у Wayback Machine.] — стаття відомого вченого в галузі комп'ютерних наук Едсгера Дейкстри (рос.)
- Spaghetti code — FOLDOC (англ.)
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Kod spageti abo Spageti kod pogano sproyektovana slabko strukturovana zaplutana i vazhka dlya rozuminnya programa Osoblivo ce stosuyetsya tih program yaki mistyat bagato operatoriv bezumovnogo perehodu GOTO vinyatkiv ta inshih konstrukcij sho pogirshuyut strukturovanist Ye najposhirenishim antipatternom programuvannya Kod spageti nazvanij tak tomu sho hid vikonannya programi shozhij na spageti tobto zvivistij i zaplutanij Inodi jogo nazivayut kod kenguru kangaroo code cherez veliku kilkist instrukcij JUMP Narazi termin zastosovuyetsya ne tilki do vipadkiv zlovzhivannya GOTO ale i do bud yakogo bagatozv yaznogo kodu v yakomu odin i toj zhe nevelikij fragment vikonuyetsya u velikij kilkosti riznih situacij i vikonuye duzhe bagato riznih logichnih funkcij Kod spageti zazvichaj vinikaye vid nedosvidchenosti rozrobnikiv vid serjoznogo tisku shodo terminiv yakij mozhe zdijsnyuvatis kerivnictvom napriklad yaksho v kompaniyi diye sistema motivaciyi za robotu yakomoga shvidshe abo rozrobnik sam sobi stavit taki termini bazhannya vse zrobiti najshvidshim sposobom Pri comu ne ye rezultatom navmisnogo zaplutuvannya Kod spageti mozhe buti nalagodzhenij ta pracyuvati pravilno i z visokoyu produktivnistyu ale vin vkraj skladnij dlya suprovodu ta rozvitku Vnesennya zmin do kodu spageti dlya dodavannya novih funkcij inodi maye takij velicheznij potencial vnesennya novih pomilok sho refaktoring staye neminuchim PrikladNizhche navoditsya priklad kodu spageti movoyu BASIC yakij vikonuye prostu diyu vivodit na ekran chisla vid 1 do 10 ta yih kvadrati Realni prikladi kodu spageti nabagato skladnishi i zaplutanishi voni stvoryuyut veliki problemi pri suprovodi program Cej priklad ye desho primitivnim i 0 i i 1 if i lt 10 then goto 7 if i gt 10 then goto 5 print Vikonannya programi zavershene end print i v kvadrati i i goto 2 Toj samij kod napisanij na BASIC v stili strukturnogo programuvannya for i 1 to 10 print i v kvadrati i i next i print Vikonannya programi zavershene Takij samij kod u funkcionalnomu stili z vikoristannyam metodu iteraciyi napisanij movoyu Ruby 1 10 each i puts i t v kvadrati i 2 puts Vikonannya programi zavershene Pov yazani terminiKod ravioli kod yakij skladayetsya z velicheznoyi kilkosti nezalezhnih komponentiv i shob zrozumiti yak vipraviti pomilku na stiku komponentiv treba prorivatisya cherez mizhkomponentni interfejsi Kod pahlava abo kod lazanya kod v yakomu zanadto bagato dlya danogo zavdannya shariv abstrakciyi Kod katamari kod yakij kolis buv napisanij iz dotrimannyam principiv napisannya chistogo kodu ale v procesi rozvitku obliplenij funkcionalnistyu tak samo yak katamari z en PrimitkiJohn Vlissides Kyle Brown Gerard Meszaros AntiPatterns The Survival Guide Spaghetti code 27 Sichnya 2021 u Wayback Machine angl Markus Pizka 2004 PDF Software Engineering Research and Practice 846 852 Arhiv originalu PDF za 5 Bereznya 2018 Procitovano 25 grudnya 2020 angl Tomov Latchezar Ivanova Valentina zhovten 2014 Teaching Good Practices In Software Engineering by Counterexamples Computer Science and Education in Computer Science 1 397 405 Procitovano 25 grudnya 2020 angl PosilannyaPro shkodu operatora GOTO 9 Sichnya 2020 u Wayback Machine stattya vidomogo vchenogo v galuzi komp yuternih nauk Edsgera Dejkstri ros Spaghetti code FOLDOC angl