Capítol 6

Descomposició

Quan hem d'escriure un codi informàtic d'una situació complexa, la primera pregunta que ens hem de fer és «quines parts formen aquesta situació?» En aquest capítol aprendrem a dividir qualsevol missió en fases, escollint noms que siguin clars, de manera que el programa pugui comprendre-ho quasi com si estigués escrit en el nostre idioma i, d'altra banda, sigui comprensible per a nosaltres rellegir el codi que hem escrit.

Dividir per vèncer

Fins ara hem resolt situacions senzilles: pujar un graó, avançar cinc caselles, recollir una perla. Però, i si la missió d'en Karel té tres parts ben diferenciades?

Imagina que en Karel ha de: 1) anar a buscar la primera perla, 2) anar a buscar la segona perla, i 3) tornar al punt de partida.

Si escrius totes les ordres seguides, obtens una llista sense categoritzar i que costa d'entendre. La solució és la descomposició: dividim la situació en parts, resolem cada part per separat i finalment agrupem totes les solucions. Cada part es converteix en una funció def.

Un programa que s'explica sol

Llegeix el codi següent. Sense saber els detalls de cada funció, entens el que fa el programa?

def recull_perla_est():
    move()
    move()
    grab()

def recull_perla_nord():
    turn_left()
    move()
    move()
    grab()

def torna_al_inici():
    turn_around()
    move()
    move()
    turn_right()
    move()
    move()

recull_perla_est()
recull_perla_nord()
torna_al_inici()

En Karel recull, en primer lloc, la perla de l'Est; després, la del Nord; finalment, torna a la casella d'inici. Les tres últimes línies del codi expliquen el pla sencer.

Si vols saber com es resol una de les tres situacions, llegeix la definició de la funció. Si vols entendre el pla general, llegeixes les tres últimes instruccions.

Nota: la instrucció turn_around() fa que en Karel giri 180°, és a dir, dona mitja volta però sense desplaçar-se.

Missió en tres fases

En Karel ha de fer 3 coses: recollir una perla, recollir-ne una altra i tornar al punt de partida.

Observa com el codi reflecteix exactament el pla de tres fases:

Les tres últimes línies del programa es llegeixen quasi com un pla escrit en llengua natural. Aquesta és la força de la descomposició: el codi explica el que fa sense que hagis d'anar línia per línia.

Descomposició i repetició juntes

La descomposició no exclou les iteracions for: pots combinar les dues tècniques. Una funció pot contenir un for al seu interior, i el programa principal pot cridar aquella funció tantes vegades com calgui.

En l'exemple de sota, en Karel ha de col·locar dues perles en dos llocs separats. Cada fase és una funció independent, que internament usa move() i drop():

Exercici

En Karel viu en un corredor horitzontal. Hi ha tres perles situades a les columnes 1, 3 i 5. Ha de recollir-les totes tres. Defineix una funció per a cada fase: recull_primera(), recull_segona() i recull_tercera(). A continuació, has de cridar les tres funcions, en ordre.

Pista: pensa en com en Karel queda posicionat després de cada fase. recull_primera() el deixa a la columna 1 mirant Est; recull_segona() ha de partir des d'allà i arribar a la columna 3, etc.