Fins ara, els programes que s'han escrit són de tipus monolític, és a dir, totes les accions s'executen dins d'un únic mètode (main) i de manera lineal (recorregut del programa únic). A partir d'ara, farem servir mètodes, que són blocs de codi que implementen una funció. Els mètodes permeten la modularitat, mitjançant la separació de les tasques en unitats autònomes declarades pel programador. Les instruccions que implementen s'escriuen una sola vegada, i estan ocultes d'altres mètodes.
Per tal d'entendre la diferència entre un mètode i un classe, anem a escriure el primer programa modular: una calculadora.
Creació d'una classe
Per començar, anem a crear una nova classe, però aquesta vegada intentarem entendre el que estam fent analitzant les parts importants del quadre de diàleg “New Java Class”.
Source folder: és la carpeta a on es desarà l'arxiu .java que estam creant.
Name: és el nom del .java que cream. No pot contenir espais i totes les paraules del nom han de començar amb majúscula.
Modifiers (public): Això fa que la classe sigui accessible des d'altres classes i és rellevant quan es té un codi més extens.
Superclass: és la classe de la que hereta les seves propietats el nostre codi. Això permet tenir a la nostra disposició mètodes, com ara el System.out.println, que no hem escrit. L'herència és molt important!!
public static void main: aquesta opció crea automàticament el mètode main.
Inherited abstract methods: permet fer servir mètodes de la superclasse.
Generate comments: Insereix línies de comentari per defecte al nostre codi.
Amb tot això, la classe dissenyada té el següent aspecte:
public class Calculadora {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
Declaració de mètodes
La declaració d'un mètode es realitza tal com hem vist al mètode main.
Aprofitarem que ara introduirem diversos mètodes per entendre exactament el que estam fent a la declaració. Agafarem com a exemple la següent declaració:
//Mètode de salutació inicial
public static void salutacioInicial(String nom) {
System.out.println("Hola " + nom);
}
A la declaració d'aquest mètode es pot llegir:
public: La primera posició de la declaració fixa la privadesa del mètode. Fins ara hem posat “public”, que vol dir que aquest mètode és accessible des de qualsevol altra classe. Però es podria haver posat “private”, i aquest mètode només es podria cridar des d'aquesta classe.
static: El mètode sempre es comporta de la mateixa manera. Més endavant s'arribarà a explicar completament.
void: El mètode no retorna cap valor de sortida per poder fer-lo servir a una altra banda. Si es vol que un mètode retorni alguna cosa, en aquest espai s'ha de declarar el tipus de dada de sortida (int, String, double,...).
Nom de mètode: Ha de recordar la seva funció real i la primera paraula ha de començar en minúscula seguida d'altres paraules en majúscula.
(paràmetres): Són les dades que el mètode necessita per fer la seva tasca i s'han de declarar entre parèntesi. Per exemple, al codi anterior, l'únic paràmetre d'entrada és el nom que volem que el mètode utilitzi. Si el mètode no rep el tipus de dada que té declarat, donarà errors.
Cridada a un mètode
S'ha de tenir present que, com que els mètodes creats a partir d'ara no estan dins del mètode main, no s'executaran per defecte, i només ho faran si els cridam adequadament.
Per fer aquesta cridada, s'ha d'escriure dins del mètode main (allà on interessi) el nom del mètode amb els paràmetres necessaris dins del parèntesi.
import java.util.Scanner;
public class Calculadora {
//Mètode principal (main)
public static void main(String[] args) {
//Declaració de variables
String nom;
//Es demana el nom de l'usuari
System.out.println("Escriu el teu nom:");
Scanner lectura = new Scanner(System.in);
nom = lectura.nextLine();
//Es crida al mètode
salutacioInicial(nom);
}
//Mètode de salutació inicial
public static void salutacioInicial(String nom) {
System.out.println("Hola " + nom);
}
}
Cal notar que a l'exemple s'ha introduït el paràmetre mitjançant una variable, encara que això no és necessari i es pot introduir directament un valor.
D'altra banda, el mètode salutacioInicial() és un mètode que no retorna cap valor per poder-lo utilitzar, és a dir, és un mètode void. Ara anem a crear un altre mètode que no tengui un retorn buit. Com que el nostre projecte és una calculadora, anem a crear el mètode suma(). Però abans de crear una mètode capaç d'operar dos nombres, el nostre programa ens ha de demanar quins dos nombres es volen operar.
Exercici: Afegeix el codi necessari perquè el programa demani a l'usuari quins són els dos valors que es volen operar (nombres reals). Recorda que ja tenim un Scanner creat i que es pot continuar fent servir.
Ara que ja sabem quins nombres operar, anem a crear un mètode capaç d'operar amb ells. En particular, anem a crear suma() de la següent manera:
//Mètode suma: suma 2 nombres reals
public static double suma(double a, double b){
return a + b;
}
S'ha de notar que en comptes de void, aquest mètode té la paraula clau double. Això fa que el valor de retorn sigui un nombre real. A més, el mètode retorna allò que està escrit després de la paraula clau return.
Per tal de cridar aquest mètode, no fa falta crear cap variable si no s'ha de fer servir reiteradament el resultat. Com al nostre cas simplement l'ha de mostrar un pic per pantalla, ens bastarà amb fer la cridada com es veu a continuació.
//Mètode principal (main)
public static void main(String[] args) {
//Declaració de variables
String nom;
//Es demana el nom de l'usuari
System.out.println("Escriu el teu nom:");
Scanner lectura = new Scanner(System.in);
nom = lectura.nextLine();
//Es crida al mètode
salutacioInicial(nom);
//Es demana quins són els nombres a operar
System.out.print("Introdueix el primer nombre per operar:");
double a = lectura.nextDouble();
System.out.print("Introdueix el segon:");
double b = lectura.nextDouble();
//Cridam al mètode
System.out.println("El resultat es = " + suma(a,b));
}
//Mètode de salutació inicial
public static void salutacioInicial(String nom) {
System.out.println("Hola " + nom);
}
//Mètode suma: suma 2 nombres reals
public static double suma(double a, double b){
return a + b;
}
Exercicis:
1. Crea els mètodes necessaris per afegir les següents funcionalitats: resta, multiplicació, divisió, arrel quadrada i elevar al quadrat.
2. Afegeix el codi necessari per crear un menú de control de flux (switch i case) que permeti seleccionar l'operació que es vol fer amb el dos números introduïts. Aquest codi ha de substituir la part a la que es demanen els nombres a operar i es crida al mètode.
Per tal de crear una calculadora més pràctica que ens permeti fer més d'una operació per execució, es pot introduir tot el codi de control de flux dins d'un bucle do..while, que es repeteixi sempre que el valor d'una variable booleana no sigui modificat.
boolean repetir = true;
Aquesta variable només serà modificada si l'usuari tria una opció extra dins del switch que provocarà la sortida del bucle i la fi del programa.
boolean repetir = true;
do{
switch{
...
case 8:
repetir==false;
break;
}
while(repetir == true);
Exercici: Introdueix el codi necessari perquè la calculadora pugui fer més d'una operació i afegeix un missatge de comiat quan l'usuari decideixi sortir de l'aplicació.