Resum

L’aplicació de la tècnica de disseny descendent permet organitzar el codi dels programes en diferents mètodes, de manera que resulta molt més senzill reescriure diverses parts del codi, en lloc d’haver-ho de fer més vegades. Ara bé, si el programa és complex i acaba requerint molts mètodes, la quantitat de mètodes de tota mena i la mida del seu fitxer també pot arribar a ser considerable. Una solució que permeten molts llenguatges de programació és plantejar els programes de manera modular. Aquests tipus de programes es divideixen en components fàcils de modificar i intercanviar, anomenats mòduls. Cada mòdul agrupa un conjunt de funcions o mètodes que realitzen tasques relacionades, d’acord a una temàtica. En contraposició a un programa modular, hi ha els programes monolítics, en els quals tot el codi es concentra en un únic mòdul.

En el cas del llenguatge Java, es fa una equivalència entre mòdul i classe. Per tant, un programa modular en aquest llenguatge és aquell en què el codi font està organitzat en diferents classes, en lloc de només una. Cada classe contindrà un conjunt de mètodes relacionats d’acord a una temàtica o un grup de tasques relacionades. Per tant, el codi s’escriurà usant diferents fitxers.

Una classe pot jugar diferents rols dins un programa en Java, però en qualsevol d’ells hi ha un factor comú. Sempre hi ha declarats un conjunt de mètodes que és possible invocar. Això es deu al fet que una classe, en darrera instància, no és més que un repositori de mètodes. Dins un programa modular hi ha diverses classes, cadascuna contenint diferents mètodes. D’entre elles, només una conté el mètode principal (main). Aquesta serà l’anomenada classe principal.

La definició de classes addicionals segueix exactament la mateixa sintaxi que la classe principal, però simplement no hi ha el mètode main. Es comença amb la declaració de classe (public class…) i a dins seu, dins de diferents blocs de codi, es van definint tots els mètodes que es vol que contingui.

L’execució d’un programa modular comença en el mètode main de la classe principal, com sempre, però la diferència és que dins el seu codi pot invocar mètodes tant definits en la pròpia classe com en qualsevol altra. Per invocar un mètode d’una altra classe, un mètode amb el codi font escrit en un fitxer diferent, primer cal inicialitzar la classe sobre una variable del tipus adient i després invocar el mètode usant la sintaxi: nomVariable.nomMètode(paràmetres). De fet, aquesta sintaxi no és nova ja que és el cas general de la que es fa servir per manipular cadenes de text o usar la classe Scanner. Fora d’aquesta particularitat, el flux de control del programa té les mateixes característiques que si tots els mètodes estiguessin dins una única classe.

El principal avantatge d’encapsular mètodes dins de classes separades és disposar d’un marc per poder reutilitzar mètodes en altres programes sense haver de copiar el codi font directament. Només cal incorporar al nou programa la classe on està declarat el mètode que cal usar i invocar els seus mètodes. A més a més, en dividir el codi en diferents fitxers segons certa temàtica, els programes modulars permeten facilitar la tasca de desenvolupar programari complex, de manera que sigui més fàcil generar i mantenir el codi, especialment quan es treballa en equip i cal realitzar tasques en paral·lel.

A més a més de la divisió en classes, Java ofereix una altra eina per aportar modularitat als programes. Igual que pot resultar còmode organitzar mètodes per temàtica, també es pot donar el cas de voler organitzar grups de classes, especialment en programes complexos on n’hi ha moltes. Per això existeixen les biblioteques de classes, o packages en Java. Un conjunt de classes vinculades entre elles d’acord a algun criteri temàtic o d’organització del seu codi.

Dins el codi font, un package és només un identificador. Per indicar que una classe hi pertany, només cal posar a la primera línia del seu codi font, abans fins i tot de la declaració d’inici de classe, la sentència package identificadorPackage. Java agruparà automàticament totes les classes que tinguin el mateix identificador. En realitat, l’organització de classes en packages també implica una certa organització de les classes dins el sistema de fitxers, però la immensa majora d’IDE actuals s’encarreguen de gestionar això automàticament.

Quan una classe vol usar-ne una altra pertanyent a un package diferent, per poder invocar els seus mètodes, abans cal importar-la . En cas contrari, Java no reconeix la classe i anuncia que hi ha un error de compilació. Per importar una classe externa, cal usar una sentència import nomPackage.nomClasse. Aquesta sentència s’escriu tot just abans de la declaració d’inici de la classe que vol fer ús de la classe externa. Si es volen usar diverses classes, cal escriure diversos cops la sentència, per al nom i package de cada classe. A part d’això, la resta de la sintaxi per invocar els seus mètodes no varia.

Amb la disposició de mecanismes per crear programes modulars a Java, ja sigui només amb diferents classes o també usant packages, sorgeix un problema. Cal disposar d’una documentació acurada on es pugui veure quins mètodes ofereix cada classe diferent i a quins packages hi ha les diferents classes. Afortunadament, l’entorn de treball de Java ofereix una eina auxiliar, anomenada javadoc que permet generar automàticament tota la documentació vinculada a les classes i packages d’un programa a partir d’informació extreta dels comentaris en el codi de les classes. Això permet estalviar molta feina.

Amb vista a realitzar un programa modular en Java, es disposa d’un avantatge addicional. El llenguatge mateix ofereix un enorme repertori de classes i packages que ja han estat implementats pels creadors del llenguatge: l’API de Java. Aquesta està documentada també en format javadoc, de manera que és possible saber totes les particularitats de les classes i packages que ofereix. Per poder usar les seves classes només cal importar-les. Un cop fet, podeu inicialitzar-les i invocar els seus mètodes de la manera habitual. Només hi ha dues particularitats.

D’una banda, a l’hora d’inicialitzar una classe, hi ha casos en què cal subministrar paràmetres d’entrada que modifiquen el comportament dels mètodes quan aquests s’invoquen. Per veure si cal o no incloure un paràmetre en inicialitzar una classe, caldrà cercar-ho a la seva documentació. Concretament, a l’apartat anomenat resum de constructors (Constructor Summary) s’indica la sintaxi de la inicialització. El nom d’aquest apartat es deu al fet que, formalment, quan s’inicialitza una classe es diu que s’invoca un dels seus constructors. Es pot triar qualsevol de les opcions ofertes a la llista de constructors, però segons quina s’esculli, la classe es pot comportar d’una manera diferent.

D’altra banda, hi ha uns mètodes especials anomenats estàtics que poden ser invocats sense haver d’inicialitzar la seva classe. S’identifiquen perquè a la documentació apareixen marcats amb la paraula clau static. Per invocar-los, en lloc d’una variable s’usa directament el nom de la classe: NomClasse.nomMètode(paràmetres). Algunes de les classes dins de l’API de Java, de fet, es componen principalment de mètodes estàtics. Dos exemples són la classe Arrays, que serveix per fer operacions complexes sobre arrays, i la classe Math que proporciona operacions matemàtiques no previstes per cap dels operadors sobre tipus primitius del llenguatge.

Com a punt final, val la pena comentar que algunes de les classes dins de l’API ja les heu usat amb anterioritat, per exemple, String o Scanner. Per tant, en certa manera, tots els programes que les han usat ja eren modulars!

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