M3 - Programació estructurada / Continguts UF2: Disseny modular
De wikiserver
La revisió el 17:07, 10 març 2018 per Rsort (Discussió | contribucions) (→Accessibilitat de variables dins una classe)
Contingut
Descomposició funcional
- L’objectiu serà resoldre el problema general com a una suma de subproblemes més petits.
- La solució a cada subproblema s’anomena subrutina o subprograma, i a Java, mètode.
- Permet la reutilització del codi, facilita la seva lectura i el seu manteniment.
- Escriure codi més genèric facilita la seva reutilització.
Disseny descendent
- El mètode del disseny descendent consisteix en descompondre el problema a resoldre en altres més senzills. A aquests se'ls aplica el mateix procediment fins arribar a problemes prou petits que podem resoldre directament.
- Refinament de l’algorisme (stepwise refinement) és com es coneix aquest procediment de descomposició.
- Representació en forma d'arbre:
- - Cada node és un mòdul, o problema, o solució hipotètica.
- - Cada subarbre depenent d'aquest node es fa servir per a la resolució d'aquest subproblema.
- - El node del nivell més alt és el problema de partida.
- - L’algorisme serà correcte si la solució que es dóna a cada nivell ho és.
- - El programa es pot construir de sota a dalt creant primer procediments que resolguin els mòduls de detall que, un cop comprovats seran utilitzats per altres procediments més generals fins a arribar a la creació del programa.
Reutilització de subproblemes resolts
- La descomposició mitjançant disseny descendent permet reaprofitar la solució de subproblemes idèntics, o força semblants.
- Qualsevol subproblema d’un nivell donat pot ser part de qualsevol subproblema d’un nivell superior. Per remarcar
- En descompondre un problema, s'ha d'intentar fer-ho de manera que es forci l’aparició de subproblemes repetits, i així la seva resolució es pot reaprofitar en diversos llocs.
Aplicació correcta del disseny descendent
Diferents persones poden arribar a conclusions diferents sobre com dur a terme la descomposició. Entre totes les solucions diferents possibles, algunes es poden considerar millors que d’altres. De fet, res impedeix, partir d'una solució concreta i aplicar refinaments que la millorin.
Criteris per a l'avaluació de la descomposició:
- Si un problema que sembla a priori força complex es descompon en molts pocs nivells, potser val la pena fer una segona ullada. Inversament, si un problema no massa complex té massa nivells, potser s’ha anat massa lluny en la descomposició.
- Veure si el nombre de passes incloses a cadascun dels subproblemes no és excessivament gran i és fàcil de seguir i entendre. En cas contrari, potser encara faria falta aplicar nous nivells de descomposició.
- Repassar que els noms assignats als subproblemes siguin autoexplicatius i expressin clarament la tasca que estan resolent. Sense ni tan sols llegir les seves passes, caldria entendre perfectament què s’assoleix en resoldre’ls. En cas contrari, potser la descomposició no està agrupant conjunts de passes realment relacionades entre elles.
- Si absolutament cap dels subproblemes és reutilitzat enlloc, especialment en descomposicions en molts nivells, és molt possible que no s’hagi triat correctament la manera de descompondre alguns subproblemes.
- Vinculat al punt anterior, l’aparició de subproblemes molt semblants o idèntics, però tractats per separat en diferents llocs, també sol ser indici que no s’està aplicant la capacitat de reutilitzar subproblemes correctament.
Declaració de mètodes
S’anomena mètode a un conjunt d’instruccions amb un objectiu comú que es declaren de manera explícitament diferenciada dins del codi font mitjançant una etiqueta o identificador.
- En el mètode principal, anomenat main, és resol el problema general (o sigui, tot el programa).
- Invoca un mètode implica executar les seves instruccions.
- Declaració bàsica d’un mètode:
public void nomMetode() {
//Aquí dins aniran les seves instruccions
//...
}
- La declaració s'ha de fer entre les claus que identifiquen l’inici i fi de fitxer (public class NomClasse { ... }) i fora del bloc d’instruccions mètode principal, o qualsevol altre mètode. Normalment, se sol fer immediatament a continuació del mètode principal.
Exemple 1:
public class LlibreQualificacions {
public void mostrarMissatge(){
System.out.println( "Benvingut al llibre de qualificacions!" );
} // fi del mètode
}
Canvis en el mètode principal en declarar altres mètodes
- Tot el codi que aniria normalment dins el bloc d’instruccions del mètode principal s’ubica en un nou mètode auxiliar, i dins el mètode principal simplement s’invoca aquest nou mètode.
Exemple 2:
public class LlibreQualificacions {
public static void main(String[] args) {
mostrarMissatge();
System.out.println("Final");
}
public static void mostrarMissatge(){
System.out.println( "Benvingut al llibre de qualificacions!" );
} // fi del mètode
}
- La crida fa que el mètode mostrarMissatge realitzi la seva tasca. Quan el mètode mostrarMissatge completa la seva tasca, el mètode main continua la seva execució.
Accessibilitat de variables dins una classe
En el moment que s’aplica disseny descendent i les parts del codi d’un programa es descomponen amb mètodes, apareix un problema.
- Els diferents mètodes serveixen per processar una informació comuna a tots. Això implica que han de poder manipular i compartir algunes de les variables definides per resoldre el problema.
- Àmbit d’una variable: donada una variable, només es considerarà declarada des de la línia on s’ha fet fins a trobar la clau tancada següent (}). Per tant, les variables definides dins d'un mètode només són accessibles per ell.
- Qualsevol dada que hagi de ser accedida en més d’un subproblema per tal de resoldre’l, caldrà declarar-la com una variable global.
- Variable global: és una variable que pot ser accedida des de qualsevol instrucció dins un mateix fitxer de codi font. El seu àmbit és tot el fitxer i per tant, es podran accedir des de qualsevol mètode.
- Variable local: és una variable accessible en un bloc concret de codi.