Mòdul 8

Pràctica 1: Planejar la feina...   
Tornar presentació tema
Pràctica 1 Pràctica 2 Pràctica 3 Pràctica 4 Pràctica 5 Pràctica 6 Pràctica 6  
     
     
  Planificar, planificar, planificar...  
     
  Cada vegada que et plantegis l'elaboració d'una aplicacio Java una mica complexa, cal que, abans de començar a escriure codi, tinguis una idea molt clara de l'estructura i dels lligams entre les classes i interfícies que la integraran.  
     
  La necessitat de fer-ho és ben evident: has de saber quines classes hauràs d'escriure i quines funcions farà cadascuna d'elles; si no, t'exposes a haver de retocar-les contínuament i, per extensió, les altres classes que s'hi relacionen: la experiència mostra com n'és de fàcil perdre el control d'allò que es va escrivint!  
     
  El procés de planificació consisteix en això: a partir de la llista de coses que vols que faci la teva aplicació escrita des del punt de vista de l'usuari final (que no té per què ser programador ni tan sols tenir idea de què és programar) anar pujant esglaons successius d'abstracció, fins arribar a l'esquema d'estructura de classes i interfícies, cadascuna amb la llista de funcionalitats que ha de tenir, tot just abans d'escriure'n el codi. Alguna cosa com ara això:  
     
 

Fase inicial:
(El punt de vista de l'usuari)

La meva aplicació ha de: Fer allò i allò altre...
etc...
L'usuari ha de poder:

Controlar tal cosa,
Crear elements de tal mena
Esborrar el que sigui,
Guardar a disc això i allò,
Recuperar del disc,
etc...

Disseny de la o les GUIs (Graphics User Interface: Interfícies gràfiques d'usuari)
GUI 1 : Una finestra

Un menú, amb els submenús
Sis botons per a...
Un camp de text editable..

GUI 2 : Una finestra

Tres botons per a...
Un label d'informació quant a...

GUI 3 : Una finestra Fer allò i allò altre...
etc...
GUI N : ...

 

Determinació de la funcionalitat dels components de les GUIs (Com es comporten aquests components i d'ón obtenen la informació per determinar-ne el comportament)
Botó A: Fa...
El listener és...
Botó B: Fa...
El listener és...
Camp de text editable:

El text es desa a la variable de classe X de la classe que representa...,
etc...

etc.  
Classes no gràfiques (Com interaccionen entre elles i amb les classes gràfiques de les GUIs)
Classe P: Fa...
Interacciona amb...
Classe Q: Fa...
Interacciona amb...
Classe R:

Fa...
Interacciona amb...

etc.  
etc.  
   
   
 
     
  Un pla pel Joc de la Vida  
     
  L'aplicació del Joc de la Vida tindrà un cert grau de complexitat i s'imposa, per tant, planificar-la bé. L'objectiu final és una aplicació autònoma i amb aquesta meta, cal pensar-la. Més tard, a la pràctica 7 d'aquest mateix mòdul, veuràs com, una vegada completada, pots afegir-li la funcionalitat d'applet per ser executada en una pàgina web, però, de moment obviaràs això. Si l'objectiu final fos fer-ne un applet, a la planificació hauries de tenir-ho en compte! però, aquí, només tindràs present el Joc de la Vida com a aplicació autònoma.  
     
  El planning pot ser aquest:  
     
 

Fase inicial:
(El punt de vista de l'usuari)

L'aplicació ha de: Aplicar les regles del Joc de la Vida amb configuracions d'éssers definides per l'usuari.
L'usuari ha de poder:

Posar i treure éssers del món a les posicions que vulgui i en el nombre que vulgui.
Veure què s'esdevé al món,
Fer avançar un pas l'estat del món,
Engegar i aturar un procés contínu,
Buidar el món d'essers, i
Sortir de l'aplicació.

Fase del disseny de la o les GUIs (Graphics User Interface: Interfícies gràfiques d'usuari)
GUI : Una sola finestra (JFrame), amb

Un MonVisible, fill de JPanel, on es visualitzen els estats del món, i on l'usuari, amb clics de ratolí, pot posar i treure éssers on vulgui i d'on vulgui.
Un JPanel amb quatre JButtons per a les accions de "Pas a pas", "Engegar/parar el procés continu", "Extermini" i "Sortir".
El JButton "Pas a pas" ha de quedar inhabilitat quan estigui en marxa el procés continu, i
El JButton "Engegar/parar el procés continu" ha de canviar d'etiqueta segons el procés continu estigui actiu o no.

Determinació de la funcionalitat dels components de les GUIs (Com es comporten aquests components i d'ón obtenen la informació per determinar-ne el comportament)
La finestra principal, classe Finestra, derivada de JFrame: Conté tots els controls gràfics: el Layout Manager és BorderLayout.
  • El MonVisible a CENTER
  • Un JPanel, pels botons, a SOUTH
Un objecte JPanel per posar-hi els botons: Conté tots els quatre botons: el Layout Manager és el de defecte: FlowLayout.
El MonVisible (derivat de JPanel):
  • Sensible a MouseEvents del ratolí: cal construir-hi un MouseAdapter
  • La distribució d'essers que reflexa prové de la classe Mon
  • Les seves dimensions les determina el nombre d'éssers que pot contenir i la mida d'aquests. Aquestes dades estan a la classe final Constants
Com que ha de ser accessible per altres classes, ha de ser un camp de la classe Finestra.
El botó (JButton) botoPasAPas, per a l'acció "Pas a pas"

El seu listener (un objecte ActionListener) ha d'actuar sobre l'objecte Mon.

Com que el boto de "Engegar/parar el procés continu" en canvia l'estat, ha de ser accessible pel listener d'aquest i, per tant, ha de ser un camp de la classe Finestra.

El botó (JButton) botoProcesContinu, per a l'acció "Engegar/parar el procés continu"

El seu listener (un objecte ActionListener) ha d'actuar sobre l'objecte Mon i sobre el botó "Pas a pas".

Com que en canviar-ne l'estat, en canvia el text, ha de ser accessible pel seu propi listener i, per tant, ha de ser un camp de la classe Finestra.

Un botó (JButton) per a l'acció "Extermini" El seu listener (un objecte ActionListener) ha d'actuar sobre l'objecte Mon
Un botó(JButton) per a l'acció "Sortir" El seu listener (un objecte ActionListener) ha de cridar el mètode System.exit()
Classes no gràfiques (Com interaccionen entre elles i amb les classes gràfiques de les GUIs)
Constants. Classe final que conté els paràmetres de l'aplicació: Conté només dues variables static:
  • dimensionsEsser: les dimensions en píxels d'un ésser
  • dimensionsMon: les dimensions en nombre d'essers del mon
Esser, que representa un ésser. Conté el camp boolean esViu , un mètode per canviar-ne aquest estat, i un mètode paint() per pintar-lo a l'objecte MonVisible
Mon. És la representació abstracta del mon en el qual viuen i moren els éssers del Joc de la Vida:

Conté una matriu bidimensional d'objectes Esser (els éssers) de dimensions llegides a Constants.

Ha de respondre al mètode mouseClicked() de l'objecte MouseAdapter de l'objecte MonVisible, tot canviant l'estat de l'objecte Esser corresponent a les coordenades de l'esdeveniment MouseEvent

També conté tots els mètodes necessaris per implementar les regles del Joc de la Vida. Per tant, ha de respondre als mètodes actionPerformed() dels objectes ActionListener dels botons "Pas a pas" i "Extermini".

Com que ha de ser accessible per altres classes, ha de ser un camp de la classe Finestra.

Procés continu, derivat de Thread, controla el procés continu del Joc de la Vida:

El fil (thread) el controla el mètode actionPerformed() de l'objecteActionListener del botó "Engegar/parar el procés continu" .

Com que ha de ser accessible per altres classes, ha de ser un camp de la classe Finestra.

 
     
  Sí, sí: tens raó: no pots mirar el planning anterior sense perdre't! Però és clar que l'ha redactat algú que ja té clar com ha de ser l'aplicació del Joc de la Vida. El que t'estem dient és que abans de posar-te a programar qualsevol aplicació que tu hagis concebut i que sigui, previsiblement, una mica complicada, cal que la planifiquis amb un planning com el que t'hem mostrat o d'alguna altra manera...  
     
  Et recomanem que, a mesura que, a les pràctiques següents, avancis en la construcció de l'aplicació del Joc de la Vida, tornis a aquesta pràctica i estudiïs una mica més allò que s'hi exposa.  
     
  Sort!