Diferència entre revisions de la pàgina «M3 - Programació estructurada / Continguts UF2: Classes i biblioteques»

De wikiserver
Dreceres ràpides: navegació, cerca
(Ús de classes addicionals)
(Biblioteques de classes: paquets)
Línia 78: Línia 78:
  
 
===Biblioteques de classes: paquets===
 
===Biblioteques de classes: paquets===
 +
 +
Normalment, per aplicar el principi de modularitat dins d’un programa n’hi ha prou a
 +
organitzar els mètodes dins de classes diferenciades, d’acord a algun criteri d’ordenació o de
 +
reutilització en el futur. Ara bé, per a casos on es vol crear un programa amb un cert grau de
 +
complexitat, pot succeir que el nombre de classes resultants també sigui força gran. En un cas
 +
com aquest, també podria ser convenient disposar d’un mecanisme que permeti organitzar
 +
conjunts de classes dins d’un programa, de la mateixa manera que una classe organitza un
 +
conjunt de mètodes. Això permet aplicar modularitat a conjunts de classes en bloc, en lloc de
 +
fer-ho a nivell individual, i també fer-les més fàcils de localitzar i gestionar. Una biblioteca de
 +
classes, o package en Java, és un conjunt de classes vinculades entre elles d’acord a algun
 +
criteri temàtic o d’organització del seu codi.
 +
Sovint, els criteris per decidir com dividir les classes d’un programa en conjunts de paquets
 +
(packages) diferents són força subjectius. En aquest cas, el que heu de tenir en compte és que
 +
es tracta d’una eina de la qual disposeu lliurement per organitzar els diferents fitxers d’un
 +
programa al vostre gust, de la mateixa manera que es pot organitzar un conjunt de fotografies
 +
referents a diversos viatges de moltes maneres usant una estructura de carpetes.
 +
En aquest sentit, cal dir que, si bé la majoria dels exemples amb els quals heu treballat fins ara
 +
(i amb els quals es continuarà treballant) són programes amb un nombre de mètodes massa
 +
limitat com per justificar de manera clara l’ús de paquets, es tracta d’un element prou
 +
important de Java com per fer necessari conèixer el seu funcionament.
 +
 
====Definició de paquets====
 
====Definició de paquets====
 +
 +
Per assignar un conjunt de classes a un package, primer cal triar un identificador, que servirà
 +
com el nom d’aquest. Com sempre, aquest identificador hauria de ser autoexplicatiu respecte
 +
a la funció de les classes que contindrà. Un cop triat, per fer que una classe hi pertanyi, n’hi
 +
ha prou que a la primera línia del seu fitxer amb el codi font s’escrigui la sentència mostrada
 +
tot seguit. La seva aparició ha de ser estrictament sempre a la primera línia de text, fins i tot
 +
abans de la declaració de classe.
 +
package identificadorPackage;
 +
Cal fer notar, doncs, que el concepte package en Java no té una entitat pròpia diferenciada. Al
 +
contrari que les classes, no és cap fitxer concret que cal editar. Serà donat implícitament per
 +
totes les classes que es declaren com a part d’ell en el seu codi font.
 +
Com a convenció de codi, l’identificador d’un package hauria de seguir un format especial, de
 +
la mateixa manera que hi ha convencions per als noms de les classes, mètodes i variables. El
 +
programa no deixa de funcionar si no es fa així, però val la pena seguir aquesta convenció, ja
 +
que és el format usat a la immensa majoria de programes en Java. En fer-ho, el vostre codi
 +
aporta la imatge d’estar fet per programadors seriosos i acurats. En aquest cas, es tracta que
 +
els noms dels packages s’escriuen sempre tots en minúscula i separant paraules diferents per
 +
un punt, de manera que tenen un aspecte semblant a l’URL escrit a la barra d’adreça d’un
 +
navegador web. Per exemple:
 +
package uf2.apartat1.exemple1;
 +
Estrictament, totes les classes del Java pertanyen a algun paquet. En cas de no incloure cap
 +
sentència import, es considera que aquella classe pertany a un package especial anomenat per
 +
defecte (default package). No és possible crear una classe que “no pertanyi a cap package”.
 +
Per tant, tots els programes que heu creat fins al moment s’han compost de classes que
 +
formaven part del package per defecte, tot i no usar la sentència import. La manera com té el
 +
Java d’ordenar les classes dins un programa en packages (inclòs el package per defecte)
 +
comporta dues restriccions que heu de tenir sempre en compte:
 +
y Donada una classe, aquesta únicament pot pertànyer a un package.
 +
y Donat un paquet, a dintre seu mai hi poden haver dues classes amb el mateix nom.
 +
 
====Ús de classes d’altres paquets====
 
====Ús de classes d’altres paquets====
 +
 +
Per referir-nos a una classe simplement s’havia de dir el seu nom (o el nom del seu fitxer).
 +
Atès que tota classe sempre pertany a una biblioteca, i dins de biblioteques diferents hi poden
 +
haver classes amb igual nom, pot ser interessant disposar d’una eina per dir exactament de
 +
quina classe s’està parlant en cada cas.
 +
El nom qualificat d’una classe és la combinació de l’identificador del seu package junt amb el
 +
seu nom, separats per un punt.
 +
El nom qualificat de les classes és útil ja que des del codi d’una classe que pertany a un
 +
paquet concret, només es poden usar directament classes amb què comparteixi el mateix nom
 +
de paquet. Si s’usa una classe d’un de diferent, el compilador donarà un error, dient que no la
 +
reconeix. Cal establir algun mecanisme per indicar exactament quina classe s’està usant. Java
 +
ofereix tres maneres, més o menys relacionades.
 +
1. Inicialització usant el nom qualificat
 +
D’una banda, per al cas de classes d’altres paquets, es pot usar el seu nom qualificat dins del
 +
codi font per referir-se a la seva inicialització.
 +
package uf2.apartat1.exemples;
 +
public class RegistreNotes {
 +
...
 +
//Ús del nom qualificat per accedir a una classe d’un altre package
 +
utilitats.arrays.CalculsArrayReals
 +
calculador
 +
=
 +
new
 +
utilitats.arrays.CalculsArrayReals();
 +
...
 +
}
 +
package utilitats.arrays;
 +
public class CalculsArrayReals {
 +
//Codi
 +
...
 +
}
 +
2. Importació explícita
 +
Una altra manera, molt més còmoda si una classe s’usa diverses vegades dins el codi, és
 +
importar-la prèviament a la capçalera del fitxer de codi font, entre la declaració del package i
 +
la declaració public class.... Per fer aquesta importació, cal especificar el nom qualificat de la
 +
classe que es vol usar. La sintaxi general és:
 +
import nomQualificat;
 +
En cas de voler usar més d’una classe, ja sigui de la mateixa biblioteca o de diferents, caldrà
 +
posar tantes sentències import com correspongui. Per exemple, si useu cinc classes que no
 +
pertanyen al mateix package que la classe que esteu creant, caldrà incloure cinc sentències
 +
import per separat. En aquest procés, les relacions de jerarquia entre els identificadors del
 +
package no importen, cal posar cada classe amb el seu package explícitament, una per una.
 +
Seguint l’exemple anterior de divisió de les classes CalculsArrayReals i RegistreNotes en
 +
packages diferents, per poder usar la primera classe a la segona d’aquesta manera, caldria fer-
 +
ho així:
 +
package uf2.apartat1.exemples;
 +
//Cal importar la classe "CalculsArrayReals", ja que és d’un altre package
 +
import utilitats.arrays.CalculsArrayReals;
 +
public class RegistreNotes {
 +
//Codi
 +
...
 +
}
 +
package utilitats.arrays;
 +
//No s’usa cap classe fora d’aquest package, no s’importa res
 +
public class CalculsArrayReals {
 +
//Codi
 +
...
 +
}
 +
3. Importació general
 +
Finalment, hi ha un tercer mecanisme que permet importar automàticament totes les classes
 +
dins una biblioteca. Aquest es fa servir sovint quan es volen usar moltes classes del mateix
 +
package i importar-les una a una es fa pesat. Es tracta d’usar un asterisc, “*”, en lloc del nom
 +
de la classe en el nom qualificat. Aquest fa de comodí i equival a dir “absolutament totes les
 +
classes del package”.
 +
package uf2.apartat1.exemples;
 +
//S’importarien totes les classes del package utilitats.arrays
 +
import utilitats.arrays.*;
 +
public class RegistreNotes {
 +
//Codi
 +
...
 +
}
  
 
==L’API del llenguatge Java==
 
==L’API del llenguatge Java==

Revisió del 20:06, 11 març 2018

Programes amb múltiples classes

  • La manera més directa de fer un programa modular és establir una correspondència un a un entre mòduls i fitxers on està escrit el codi font d’un programa.
  • Cada mòdul es representa amb un fitxer de codi font diferent.
  • En el cas de Java, un programa modular està compost de l’agregació de múltiples classes.

Què és una classe?

Tres consideracions des d'una perspectiva pràctica:

  • Un programa en Java. Els fitxers dels programes, pròpiament, són classes (al cap i a la fi, s’inicien amb la declaració public class...). En aplicar disseny descendent, el seu codi queda distribuït en un mètode principal (main), que indica la seva primera instrucció i el punt d’inici del seu flux de control, junt amb diferents mètodes addicionals que poden ser invocats directament.
  • Un repositori de mètodes. També s'usa el terme classe per referir-se a biblioteques de mètodes, que actuen com extensions en les instruccions disponibles per defecte en el llenguatge. Abans de poder fer-ho, però, cal inicialitzar-les correctament.
-L’exemple més clar és la classe Scanner, que ofereix un repertori de mètodes per controlar la lectura de dades des del teclat (nextLine(), nextInt(),hasNextFloat(), etc.).
  • Un tipus compost. Aquest mateix terme s'usa com a sinònim de tipus compost.
- l’exemple per antonomàsia és la classe String, utilitzada per referir-se a cadenes de text dins de Java. Els tipus compostos de Java permeten manipular dades complexes mitjançant la invocació de mètodes (charAt(...), indexof(...), etc.).

Semblences

- Els tres casos són exactament el mateix en darrera instància: codi font dins un fitxer anomenat NomClasse.java, amb la declaració public class NomClasse..., i estructurat com un seguit de mètodes declarats dins seu.
- Per tant, la classe Scanner ha estat desenvolupada per algú altre, dins d’un fitxer anomenat Scanner.java i que conté diferents mètodes.

Estructura d’un programa modular en Java

  • Totes les classes es codifiquen de la mateixa manera (com fitxers que contenen un seguit de mètodes que poden ser invocats).
  • Un programa és una seqüència ordenada d’instruccions que es van executant d’inici a fi.
- Mitjançant les estructures de control (selecció i repetició), és possible crear bifurcacions o bucles a la seqüència.
- Es poden trobar invocacions a mètodes, fent possible distribuir les instruccions en blocs diferents, que poden ser executats repetides vegades en diferents moments del procés.
- Tots els mètodes estan escrits dins un mateix fitxer, que conté el codi font de tot el programa.
- main és el mètode principal, el qual indica quina és la primera instrucció.
  • L’única diferència d’un programa modular en Java és que els mètodes, en lloc d’estar escrits tots en el mateix fitxer, estan distribuïts dins de diferents fitxers (diferents classes). tal com es contrasta a la figura 1.1.
  • Exemple, el programa modular es composa de tres fitxers diferents, anomenats Principal.java, Modul1.java i Modul2.java.
Classes i biblioteques
  • L’escriptura de mètodes en fitxers separats se sol fer d’acord a algun criteri d’ordre, com agrupar mètodes per funcionalitats semblants (una classe amb els mètodes relacionats amb operar amb arrays, una altra amb els que llegeixen dades des del teclat, etc.).
  • Per fer un programa modular cal decidir amb criteri com distribuir els diferents mètodes en diferents classes (i en quantes) i saber com invocar mètodes declarats a altres classes.
  • Main class: és l’única que disposa d’un mètode principal declarat en el seu codi.
  • Per executar un programa modular en Java, només cal executar aquesta classe principal. A partir d’aquí, l’execució de les diferents instruccions segueix el flux de control habitual, partint del mètode principal d’aquesta classe, tal com s’ha mostrat a la figura.
  • Les classes addicionals normalment tenen dos orígens. Poden ser classes creades per vosaltres mateixos, o bé creades per altres desenvolupadors. En qualsevol dels dos casos, totes estan declarades i codificades en fitxers .java per separat.

Definició de classes addicionals

  • Per dividir un programa en classes diferents, només cal crear tants fitxers com classes es vol, cadascun amb el seu nom i definició pròpia.
  • La classe principal ha de contenir com a mínim els mètodes main i inici.
  • La resta de classes contindrà els mètodes que es vulgui distribuir.
  • Excepte pel mètode principal a les classes addicionals, totes les classes són exactament iguals a nivell de sintaxi.

Ús de classes addicionals

  • En un programa modular, des d’una classe s’invoquen mètodes declarats a una classe diferent. Però cada mètode només està escrit un únic cop entre totes les classes del programa.
  • Per invocar mètodes escrits en fitxers diferents, primer cal un pas previ d’inicialització, a partir del qual es permet la invocació dels mètodes externs. En dur a terme aquest procés, s’assigna un identificador a partir del qual és possible invocar els mètodes d’aquella classe, usant-lo com a prefix a la invocació.
  • La sintaxi per fer-ho és la següent:
NomClasse identificador = new NomClasse();
identificador.nomMètode(paràmetres);
  • La inicialització només es fa una vegada.
  • L’àmbit i la validesa de l’identificador és el mateix que una variable.

Biblioteques de classes: paquets

Normalment, per aplicar el principi de modularitat dins d’un programa n’hi ha prou a organitzar els mètodes dins de classes diferenciades, d’acord a algun criteri d’ordenació o de reutilització en el futur. Ara bé, per a casos on es vol crear un programa amb un cert grau de complexitat, pot succeir que el nombre de classes resultants també sigui força gran. En un cas com aquest, també podria ser convenient disposar d’un mecanisme que permeti organitzar conjunts de classes dins d’un programa, de la mateixa manera que una classe organitza un conjunt de mètodes. Això permet aplicar modularitat a conjunts de classes en bloc, en lloc de fer-ho a nivell individual, i també fer-les més fàcils de localitzar i gestionar. Una biblioteca de classes, o package en Java, és un conjunt de classes vinculades entre elles d’acord a algun criteri temàtic o d’organització del seu codi. Sovint, els criteris per decidir com dividir les classes d’un programa en conjunts de paquets (packages) diferents són força subjectius. En aquest cas, el que heu de tenir en compte és que es tracta d’una eina de la qual disposeu lliurement per organitzar els diferents fitxers d’un programa al vostre gust, de la mateixa manera que es pot organitzar un conjunt de fotografies referents a diversos viatges de moltes maneres usant una estructura de carpetes. En aquest sentit, cal dir que, si bé la majoria dels exemples amb els quals heu treballat fins ara (i amb els quals es continuarà treballant) són programes amb un nombre de mètodes massa limitat com per justificar de manera clara l’ús de paquets, es tracta d’un element prou important de Java com per fer necessari conèixer el seu funcionament.

Definició de paquets

Per assignar un conjunt de classes a un package, primer cal triar un identificador, que servirà com el nom d’aquest. Com sempre, aquest identificador hauria de ser autoexplicatiu respecte a la funció de les classes que contindrà. Un cop triat, per fer que una classe hi pertanyi, n’hi ha prou que a la primera línia del seu fitxer amb el codi font s’escrigui la sentència mostrada tot seguit. La seva aparició ha de ser estrictament sempre a la primera línia de text, fins i tot abans de la declaració de classe. package identificadorPackage; Cal fer notar, doncs, que el concepte package en Java no té una entitat pròpia diferenciada. Al contrari que les classes, no és cap fitxer concret que cal editar. Serà donat implícitament per totes les classes que es declaren com a part d’ell en el seu codi font. Com a convenció de codi, l’identificador d’un package hauria de seguir un format especial, de la mateixa manera que hi ha convencions per als noms de les classes, mètodes i variables. El programa no deixa de funcionar si no es fa així, però val la pena seguir aquesta convenció, ja que és el format usat a la immensa majoria de programes en Java. En fer-ho, el vostre codi aporta la imatge d’estar fet per programadors seriosos i acurats. En aquest cas, es tracta que els noms dels packages s’escriuen sempre tots en minúscula i separant paraules diferents per un punt, de manera que tenen un aspecte semblant a l’URL escrit a la barra d’adreça d’un navegador web. Per exemple: package uf2.apartat1.exemple1; Estrictament, totes les classes del Java pertanyen a algun paquet. En cas de no incloure cap sentència import, es considera que aquella classe pertany a un package especial anomenat per defecte (default package). No és possible crear una classe que “no pertanyi a cap package”. Per tant, tots els programes que heu creat fins al moment s’han compost de classes que formaven part del package per defecte, tot i no usar la sentència import. La manera com té el Java d’ordenar les classes dins un programa en packages (inclòs el package per defecte) comporta dues restriccions que heu de tenir sempre en compte: y Donada una classe, aquesta únicament pot pertànyer a un package. y Donat un paquet, a dintre seu mai hi poden haver dues classes amb el mateix nom.

Ús de classes d’altres paquets

Per referir-nos a una classe simplement s’havia de dir el seu nom (o el nom del seu fitxer). Atès que tota classe sempre pertany a una biblioteca, i dins de biblioteques diferents hi poden haver classes amb igual nom, pot ser interessant disposar d’una eina per dir exactament de quina classe s’està parlant en cada cas. El nom qualificat d’una classe és la combinació de l’identificador del seu package junt amb el seu nom, separats per un punt. El nom qualificat de les classes és útil ja que des del codi d’una classe que pertany a un paquet concret, només es poden usar directament classes amb què comparteixi el mateix nom de paquet. Si s’usa una classe d’un de diferent, el compilador donarà un error, dient que no la reconeix. Cal establir algun mecanisme per indicar exactament quina classe s’està usant. Java ofereix tres maneres, més o menys relacionades. 1. Inicialització usant el nom qualificat D’una banda, per al cas de classes d’altres paquets, es pot usar el seu nom qualificat dins del codi font per referir-se a la seva inicialització. package uf2.apartat1.exemples; public class RegistreNotes { ... //Ús del nom qualificat per accedir a una classe d’un altre package utilitats.arrays.CalculsArrayReals calculador = new utilitats.arrays.CalculsArrayReals(); ... } package utilitats.arrays; public class CalculsArrayReals { //Codi ... } 2. Importació explícita Una altra manera, molt més còmoda si una classe s’usa diverses vegades dins el codi, és importar-la prèviament a la capçalera del fitxer de codi font, entre la declaració del package i la declaració public class.... Per fer aquesta importació, cal especificar el nom qualificat de la classe que es vol usar. La sintaxi general és: import nomQualificat; En cas de voler usar més d’una classe, ja sigui de la mateixa biblioteca o de diferents, caldrà posar tantes sentències import com correspongui. Per exemple, si useu cinc classes que no pertanyen al mateix package que la classe que esteu creant, caldrà incloure cinc sentències import per separat. En aquest procés, les relacions de jerarquia entre els identificadors del package no importen, cal posar cada classe amb el seu package explícitament, una per una. Seguint l’exemple anterior de divisió de les classes CalculsArrayReals i RegistreNotes en packages diferents, per poder usar la primera classe a la segona d’aquesta manera, caldria fer- ho així: package uf2.apartat1.exemples; //Cal importar la classe "CalculsArrayReals", ja que és d’un altre package import utilitats.arrays.CalculsArrayReals; public class RegistreNotes { //Codi ... } package utilitats.arrays; //No s’usa cap classe fora d’aquest package, no s’importa res public class CalculsArrayReals { //Codi ... } 3. Importació general Finalment, hi ha un tercer mecanisme que permet importar automàticament totes les classes dins una biblioteca. Aquest es fa servir sovint quan es volen usar moltes classes del mateix package i importar-les una a una es fa pesat. Es tracta d’usar un asterisc, “*”, en lloc del nom de la classe en el nom qualificat. Aquest fa de comodí i equival a dir “absolutament totes les classes del package”. package uf2.apartat1.exemples; //S’importarien totes les classes del package utilitats.arrays import utilitats.arrays.*; public class RegistreNotes { //Codi ... }

L’API del llenguatge Java

Mètodes estàtics

La classe Math

La classe Arrays

Javadoc

Sintaxi general

Paraules clau