Espageti kode
Espageti kodea informatikan erabiltzen den termino gutxiesgarri bat da, kontrol-egitura konplexu eta ulertezinak dituzten programak deskribatzeko. Iturburu kode mota honek izen hori darama espageti plater baten antza duelako; hau da, hari korapilatsu eta nahasi multzo baten itxura.
Tradizionalki, programazio estilo hau oinarrizko eta zaharkitutako hizkuntzekin lotu izan da, fluxua oso oinarrizko kontrol-sententzia bidez kontrolatzen baitzen; hala nola, goto eta lerro-zenbakiak erabiliz.
Programazio-lengoaia berrietan espageti kodea –egitura eskasarekin garatzen den kodea– hainbat faktoreren ondorioz gerta daiteke; hala nola, programazio-estiloaren arau faltarengatik, eta gaitasun edo esperientzia nahikorik ez duten programatzaileen ondorioz.[1]
Espageti kode honen presentziak sistema baten ulergarritasuna nabarmen murriztu dezake.[2]
Programazio-lengoaien bilakaera
60ko hamarkadan, programa baten fluxua zehazteko modu bakarra kateatutako IF sententzia eta Boolear aldagaien bidezkoa zen. Geroago, funtzioak idazteko aukera sortu zen, orokorretik zehatzetarakoa. Gaur egun, objektuetara bideratutako programazioarekin, modularitatea, abstrakzioa, kapsulatzea, desakoplamendua, herentzia eta antzeko kontzeptuak daude. Gaur egungo tresna eta kontzeptu guztiekin, kode mota hori idaztea saihesteko baliabide nahikoa dago.
Berregituraketa
Ez da onargarria espageti kodea idaztea hastapenetan ere, horrek programa ulertzea zailtzen baitu. Funtzio edo programa bat garatzeko prozesuan zehar ikusten bada kodearen konplexutasuna hazten ari dela eta kodea espageti bihurtzen ari dela, une egokia da dagoeneko osatutako zatia berrikusteko; hau da, berregituraketa egiteko. Garapenean zehar aldizkako garbitasuna egiteak konplexutasuna kontrolpean mantentzea ahalbidetzen du eta nabarmen handitzen ditu programatzailearen produktibitatea eta programaren ulermena.
Espageti kodetik egituratutako programaziora
Kazetaritzaren oinarizko arauekin konparazioa egin daiteke albiste bat idazteko moduari dagokionez. Arauek diote albistearen izenburuak informazio garrantzitsuena azaldu behar duela, ondoren lehen paragrafoan xehetasunak eman eta gero ataletan banatuz garatu behar dela. Era berean, programaren main atalean funtziorik orokorrenak agertu behar dira, eta bakoitzak funtzio espezifikoagoak deitu behar ditu ondoren.
"Berregituratu–metodoa erauzi" funtzioarekin automatikoki lor daiteke espageti kodeko if adarren bakoitza funtzio bat bihurtzea eta, ondorioz, ulergarritasuna nabarmen hobetuko da.
Egituratutako programaziotik objektuetara bideratutako programaziora
Behin funtzioak argi eta garbi ikusgarri daudenean, posible da ohartzea zeintzuk osatzen duten erantzukizun komun bat eta ez dauden gainerako kodearekin nahasita. Hori dela eta, funtzio horiek objektu desberdinetan bana daitezke, eta objektu horiek jada izango dituzte metodoak eta propietateak (pribatuak izan daitezkeenak eta, beraz, kodearen gainontzeko zatietatik ikusiezinak).
Espageti kodeak objektuetara bideraturako programazio-estiloan idazten den ereduaren aurkako eredu bat ere deskriba dezake, adibidez, metodoak luzeegia eta nahasia dituzten klaseak sortuz edo polimorfismoa bezalako objektuei dagozkien kontzeptuak alde batera utziz.[3]
Historia
Ez dago argi noiz iritsi zen espageti kode esaldia ohiko erabilerara; hala ere, 1977an hainbat erreferentzia agertu ziren, besteak beste, Guy Steeleren Macaroni is Better Than Spaghetti liburua.[4] 1978ko A primer on disciplined programming using PL/I, PL/CS and PL/CT liburuan, Richard Conway-k "espageti plateren egitura logiko garbi bera duten" programak deskribatu zituen esaldi batean.[5] David Griesekin batera idatzi zuen An Introduction to Programming liburuan errepikatu zuen 1979an.[6] 1988ko A spiral model of software development and enhancement paperean, terminoa kode eta konponketa ereduaren praktika zaharra deskribatzeko erabili zen, plangintzarik ez zuena eta azkenean ur-jauziaren eredua garatzera eraman zuena.[7] 1979ko Structured programming for the COBOL programmer liburuan, Paul Noll egileak spaghetti code eta arratoi habiak esaldiak sinonimo gisa erabilti zituen gaizki egituratutako iturburu kodeak deskribatzeko.[8]
Richard Hamming-ek bere hitzaldietan deskribatu zuen terminoaren etimologia kode bitarretako programazio goiztiarraren testuinguruan:[9]
Akats bat konpontzerakoan instrukzio batzuk gehitu behar bazenitu, aurreko instrukzioa hartu eta hutsik zegoen espazioren batera salto bat gehitzen zenuen. Espazio horretan, aurretik idatzitakoa berriro idazten zenuen, beharrezko instrukzioak gehitzen zenituen, eta azkenik, programaren atal nagusira itzultzeko beste salto bat gehitzen zenuen. Ondorioz, programak saltoz beteriko egitura hartzen zuen, kontrola toki ezohikoetara eramanez, eta programaren egiturak espageti lata baten itxura hartzen zuen. Baina zergatik ez gehitu instrukzio berriak zuzenean programaren fluxuan? Horrek esan nahiko luke programa osoa berrikusi eta mugitutako edozein instrukziori egiten zaizkion erreferentzia guztiak egokitu beharko zenituzkeela! Hau guztia saihesteko edozein trikimailu erabiliko zen, hori bai ezetz!
Adibideak
Hona hemen BASIC legoaian espageti kode gisa ulertuko litzatekeen adibide arrunt bat. Programak 1etik 100era bitarteko zenbakiak pantailan inprimatzen ditu, bakoitzaren berreketa barne. Atzera-eskaerarik ez da erabiltzen kodeak egiten dituen ekintza desberdinak bereizteko, eta programaren GOTO aginduak lerro zenbakien menpe egotea eragiten du. Batetik besterako jauziek exekuzioaren fluxua aurreikustea zailtzen du. Espageti kode estiloan eginiko benetako kodeak askoz konplexuagoak izan daitezke eta programaren mantentze kostuak nabarmen handitu ditzakete.
1 i=0
2 i=i+1
3 PRINT i;"Berreketa:";i*i
4 IF i>=100 THEN GOTO 6
5 GOTO 2
6 PRINT "Programa amaituta."
7 END
Hona hemen kode bera egituratutako programazio estiloan idatzita:
1 FOR i=1 TO 100
2 PRINT i;"Berreketa:";i*i
3 NEXT i
4 PRINT "Programa amaituta."
5 END
Ondorengo adibidean programak batetik bestera salto egiten du, baina salto hori formala da eta errazago aurreikusten da, for loopek eta Subroutine fluxu kontrola eskaintzen dutelako, aldiz goto aginduak fluxu kontrola arbitrarioa sustatzen du. Adibide hau txikia den arren, benetako programek kode lerro asko dituzte eta, ondorioz, mantentzea zaila da espageti kode estiloan idazten direnean.
Hona hemen GOTO aginduak barne hartzen dituen beste espageti kode adibide bat.
INPUT "Zenbat zenbaki ordenatu behar dira?"; T
DIM n(T)
FOR i = 1 TO T
PRINT "ZENBAKIA:"; i
INPUT n(i)
NEXT i
'Kalkuluak:
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 "Ordenatutako zerrenda honakoa da:"
FOR i = 1 TO T
PRINT n(i)
NEXT i
Beste kode batzuk
Ravioli kodea
Ravioli kodeak ondo egituratuta dauden eta bereizita erraz ulergarriak diren klaseez osatuta egon arren, osotasunean ulertzea oso konplexua den kodeari egiten dio erreferentzia.
Ravioli kodea kode zati txiki gehiegitan berregituratzean oinarritzen da eta horrek zati horiek jarraitzea zaila edo ia ezinezkoa bihurtzen du. Kasu hau objektuetara bideratutako programazioan ere gertatzen da, baina kodearen jatorria ez dago soilik funtzioen edo prozeduren artean barreiatuta, baita klase eta paketeen artean ere. Horrek kodearen trazabilitatea nabarmen zailtzen du.
Lasagna kodea
Kode mota honek geruzak hain konplexu eta elkarren mendeko bihurtzen ditu, non geruza batean egindako aldaketa batek beste batzuetan aldaketak egitea ezinbestekoa egiten duen.
Pizza kodea
Pizza kodeak arkitektura oso laua duen kodeari egiten dio erreferentzia.
Hotdog kodea
Hotdog kodea oso konplexua izatera irits daitekeen kodea da, eta horren ondorioz akats txiki batek programaren funtzionamendu osoa eten dezake.
Erreferentziak
- ↑ Pizka, Markus. (2004). «Straightening spaghetti-code with refactoring?» Software Engineering Research and Practice: 846–852. (Noiz kontsultatua: 2018-03-05).
- ↑ Abbes, M.; Khomh, F.; Gueheneuc, Y. G.; Antoniol, G.. (2011). «An Empirical Study of the Impact of Two Antipatterns, Blob and Spaghetti Code, on Program Comprehension» 2011 15th European Conference on Software Maintenance and Reengineering: 181–190..
- ↑ Moha, N.; Gueheneuc, Y. G.; Duchien, L.. (2010). «DECOR: A Method for the Specification and Detection of Code and Design Smells» IEEE Transactions on Software Engineering: 20–36..
- ↑ Guy Lewis Steele. 1977. Macaroni is better than spaghetti. In Proceedings of the 1977 symposium on Artificial intelligence and programming languages. Association for Computing Machinery, New York, NY, USA, 60–66. DOI:https://doi.org/10.1145/800228.806933
- ↑ Conway, Richard. (1978). «A primer on disciplined programming using PL/I, PL/CS, and PL/CT» Winthrop Publishers ISBN 978-0-87626-712-7..
- ↑ Conway, Richard; Gries, David. (1979). «An Introduction to Programming» Little, Brown.
- ↑ Boehm, Barry W.. (1988). «A spiral model of software development and enhancement» IEEE Computer doi: ..
- ↑ Noll, Paul. (1977). «Structured programming for the COBOL programmer: design, documentation, coding, testing» M. Murach & Associates.
- ↑ Hamming, Richard. (1996). Taylor & Francis ISBN 9056995006..
Ikus, gainera
Kanpo estekak
- Go To Statement Considered Harmful. The classic repudiation of spaghetti code by Edsger Dijkstra
- We don't know where to GOTO if we don't know where we've COME FROM by R. Lawrence Clark from DATAMATION, December, 1973
- Refactoring Java spaghetti code into Java bento code separating out a bowl full of code from one class into seven classes
- Objects and Frameworks – Taking a Step Back by Brian Rinaldi
- Programming Pasta - Spaghetti, Lasagna, Ravioli and Macaroni Code
- Pasta Theory of Programming