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.

Espageti kode honen presentziak sistema baten ulergarritasuna nabarmen murriztu dezake.

## 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. 

## 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. 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. David Griesekin batera idatzi zuen *An Introduction to Programming* liburuan errepikatu zuen 1979an. 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. 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.

Richard Hamming-ek bere hitzaldietan deskribatu zuen terminoaren etimologia kode bitarretako programazio goiztiarraren testuinguruan:

  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.

```basic
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:

```basic
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 loop*ek 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.

```basic
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 
## Ikus, gainera 
* Programazio-lengoaien arteko konparazioa

## 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