|
|
|
|
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! |
|
|
|
|
|
|
|