Resum

A l’hora de veure com resoldre problemes complexos hi ha diferents estratègies. Una d’elles és el disseny descendent, que es basa en partir d’un problema general i dividir-lo en problemes més simples, denominats subproblemes. D’entre tots aquests, els considerats encara massa complexos es tornen a dividir en nous subproblemes. I així successivament fins que tots els subproblemes resultants es consideren prou senzills com per poder ser resolts directament. S’anomena descendent perquè partint del problema gran es passa a problemes més petits.

El procés de descomposició en subproblemes té dos objectius importants. D’una banda, reduir el problema general a un conjunt d’etapes parcials, cadascuna de les quals es compon d’un conjunt de passes reduït, cosa que les fa fàcils d’entendre. D’altra banda, si la descomposició es porta a terme amb vista, també hi ha la possibilitat de trobar que un mateix subproblema apareix diverses vegades, de manera que pot ser reaprofitat en diferents llocs. D’aquesta manera, només cal definir-lo un sol cop però es pot usar en diverses parts del problema general.

Aquesta estratègia també es pot aplicar a l’hora de crear programes on cal resoldre tasques de certa magnitud. En aquest context, les passes per dur a terme una tasca són les instruccions del programa. Per tant, l’objectiu és crear conjunt d’instruccions amb un objectiu comú que es declaren de manera explícitament diferenciada dins del codi font, cada conjunt associat a un únic subproblema. Els llenguatges de programació permeten dur a terme exactament això, anomenant a aquests conjunts funcions. A cada funció, se la diferencia de les altres mitjançant l’assignació d’una etiqueta o identificador.

Per tant, per cada subproblema a resoldre, dins del codi font s’haurà de definir una funció diferent. En el llenguatge Java, aquests conjunts d’instruccions se’ls anomena mètodes, en lloc de funcions, però a efectes pràctics, es consideren el mateix. La sintaxi general d’un bloc d’instruccions associat a un mètode és public void nomMètode() { … }. Com en altres tipus d’estructura, les claus delimiten els conjunts d’instruccions que conté. Dins les instruccions d’un mètode hi pot haver qualsevol tipus d’estructura (lineal, selecció o repetició).

Un cop s’ha definit un mètode, amb un bloc d’instruccions associat en el seu interior, es pot invocar des de qualsevol part del vostre codi font. Per fer-ho, només cal posar el nom del mètode com si es tractés d’una instrucció més: nomMètode();. Quan es fa això, el comportament del programa serà equivalent a reemplaçar la instrucció d’invocació del mètode per totes les instruccions que hi té contingudes. S’executaran totes, de la darrera a la última, seguint el flux de control esperat.

Els mètodes són una eina molt útil. Ara bé, tot i que la identificació de subproblemes d’acord a diferents nivells de complexitat és suficient per poder descompondre el programa en bocins de codi amb objectius parcials diferenciats, i fer-lo més fàcil de seguir, no sempre és suficient per oferir un alt grau de reusabilitat. En la majoria de casos, el programa resultant dividit amb mètodes és directament equivalent a trossejar un programa on només hi ha el mètode principal. En realitat, a l’hora de plantejar quins subproblemes hi ha, i la seva declaració associada en forma de mètode al codi, a part del seu nom i què fan, també és possible definir certs aspectes vinculats a les dades que han de tractar: els seus paràmetres d’entrada i sortida.

Un paràmetre és un identificador usat dins la descripció d’un procés, el valor del qual en realitat pot variar per diferents aplicacions d’aquest procés. En el cas dels d’entrada, es tracta d’un valor que s’estableix immediatament abans de seguir un procés, de manera que indica les dades que ha de tractar o modifica el seu comportament. El de sortida (només un), en canvi, indica un resultat final obtingut després de realitzar un procés determinat.

La llista de paràmetres d’entrada s’escriu entre els parèntesis a la seva declaració. Aquesta llista pren una estructura semblant a fer un seguit de declaracions de variables separades per comes: public void nomMètode (tipusParam1 numParam1, tipusParam2 nomParam2, etc.) { … }.

La sintaxi de la invocació d’un mètode és diferent quan aquest té definits paràmetres d’entrada. Entre els parèntesis de la invocació cal posar un conjunt de valors separats per comes. El nombre de valors ha de ser sempre idèntic al nombre de paràmetres declarats al mètode i el tipus de cada valor ha de coincidir també amb el declarat, seguint el mateix ordre. Quan s’invoca un mètode amb un conjunt de paràmetres d’entrada declarats, el primer que fa el programa és mirar la llista de paràmetres i declarar, implícitament dins el codi del mètode, tantes variables com paràmetres d’entrada, amb els mateixos noms. Llavors agafa cada valor especificat a la invocació i copia, un per un i en el mateix ordre, aquests valors dins les variables creades a partir de la llista de paràmetres.

Un cop es comença a executar el codi del mètode, les variables representades pels seus paràmetres d’entrada poden ser usades com qualsevol variable declarada a la primera línia del programa: els seus valors poden ser llegits directament, poden usar-se dins d’expressions més o menys complexes, tenen un àmbit igual en tot el mètode, etc. Fins i tot poden veure modificat el seu valor inicial. Ara bé, heu de tenir ben clar que els valors que contenen són còpies de l’original. Per tant, el valor usat a la invocació mai es veurà alterat.

En funció d’això, el comportament del mètode pot ser diferent per invocacions que usin valors diferents com a paràmetres d’entrada.

La raó de ser del paràmetre de sortida parteix del fet que, si us hi fixeu una mica, us adonareu d’una característica comuna a molts dels casos en què un problema, en qualsevol nivell, es divideix en subproblemes més simples. Sovint, conceptualment, la manera com es resol és realitzant un seguit de tasques on s’obtenen resultats parcials, que al final són combinats o aprofitats dins el procés general per obtenir el resultat final (la resolució del problema). Per tant, un mètode també es pot usar per fer un càlcul parcial, de manera que es comporti de manera molt semblant a una expressió, però amb la potència que aporta poder usar qualsevol instrucció i estructures de control, i no només operacions.

Atès que un programa genera i tracta dades, el primer que cal decidir és a quin tipus de dades pertanyerà el valor d’aquest resultat. Un cop decidit, la sintaxi per declarar un mètode amb un paràmetre de sortida posa aquest tipus tot just abans del seu nom: public tipusParamSortida nomMètode(llistaParamEntrada) { … }.

El codi del mètode serà el que correspongui per tal d’obtenir el resultat esperat, d’acord al seu propòsit. En aquest aspecte, res canvia quant a com heu programat mètodes fins ara. Ara bé, dins d’aquest codi caldrà decidir, d’entre totes les dades que tracta internament, quina es correspon al resultat final. Un cop ho heu establert, la sentència que indica que ja heu acabat la tasca a fer i disposeu del resultat és return resultat;. Donat el nom de la sentència usada, sovint al paràmetre de sortida se l’anomena també valor de retorn d’un mètode.

Quan un mètode disposa d’un paràmetre de sortida, la instrucció per invocar-lo es comporta exactament com una expressió. Aquesta s’avaluarà en el valor de retorn. Aquest valor pot ser manipulat com el resultat de qualsevol altra expressió basada només en operacions i operadors: es pot assignar a una variable, usar dins d’una altra expressió més complexa, etc.

A part de ser una eina per poder declarar mètodes amb més funcionalitats, un ús adient de paràmetres d’entrada i sortida pot millorar molt la llegibilitat del codi d’un programa. Per fer-ho, es basa en el principi d’encapsulació / ocultació, definit formalment com la segregació dels elements en què es descompon un problema general, de manera que se separa la seva interfície contractual de la seva implementació. El que vol dir això és que un mètode permet resumir en una sola etiqueta un procés de manipulació dels paràmetres d’entrada a un paràmetre de sortida. Si l’etiqueta s’ha triat acuradament, no cal saber exactament tots els detalls de com es duu a terme aquest procés. Per algú que llegeixi el codi font del programa i es trobi amb una instrucció d’invocació del mètode, ha de tenir prou amb el nom per tenir una idea clara de què fa, sense que hagi de llegir el seu codi font detalladament per entendre-ho.

Anar a la pàgina següent:
Resultats d'aprenentatge