Lectura de codi existent
Identificar quines classes hi ha, quines responsabilitats tenen i com es relacionen dins del projecte base.
Activitat pràctica guiada per ampliar el projecte anterior incorporant una Academia com a repositori de personatges
En aquesta activitat partireu del projecte anterior, on ja teniu implementats els personatges, les subclasses principals i la lògica bàsica de treball amb aquest domini. La novetat serà afegir una nova peça al sistema: una classe Academia.
La Academia actuarà com un repositori de Personatge: hi podreu desar tots els aventurers disponibles, consultar-los, filtrar-los, ordenar-los i preparar a partir d’aquí el vostre Equip. D’aquesta manera, l’Equip continua tenint sentit dins del projecte, però ara passa a dependre d’una estructura superior que centralitza la gestió dels personatges.
La vostra feina serà entendre el codi existent i ampliar-lo amb aquesta nova capa de funcionalitat. Això us permetrà practicar lectura de codi, manteniment, ampliació de projectes reals i treball amb col·leccions sense haver de reconstruir tota l’arquitectura des de zero.
Els objectius estan agrupats per competències perquè es vegi més clar què practicareu al llarg de l’activitat.
Identificar quines classes hi ha, quines responsabilitats tenen i com es relacionen dins del projecte base.
Implementar una nova classe Academia i nous mètodes a partir d’uns requisits concrets sense trencar el comportament ja existent.
Recórrer, filtrar, cercar i ordenar estructures com ArrayList<Personatge> per resoldre problemes reals.
Consolidar encapsulació, herència, interfícies i separació de responsabilitats en una aplicació ja estructurada.
Abans d’afegir funcionalitats, cal entendre bé què us proporciona ja el projecte anterior i què hi falta encara.
El projecte inclou classes com Personatge, les seves subclasses i la lògica necessària per treballar amb equips. Ara heu de dissenyar i implementar una nova classe anomenada Academia, que actuarà com a repositori general de personatges.
Academia i les funcionalitats de repositori sobre la col·lecció de personatges.Equip i una Academia dins del sistema?Academia sigui el repositori de tots els personatges disponibles?En aquesta fase heu d’incorporar la nova peça principal de l’activitat: la classe Academia.
L’Academia representarà el repositori general de personatges disponibles per preparar equips o fer consultes globals sobre tots els aventurers registrats.
nom i ArrayList<Personatge> personatges.afegirPersonatge(...) i mostrarPersonatges().Ara començareu a ampliar l’Academia amb funcionalitats útils sobre la col·lecció de personatges.
Implementeu mètodes que permetin localitzar personatges dins del sistema.
buscarPerNom(String nom), existeixPersonatge(String nom)Implementeu mètodes que retornin subconjunts de la col·lecció segons una condició.
obtenirPersonatgesVius(), filtrarPerNivellMinim(int nivell), filtrarPerTipus(String tipus)Ampliació opcional: si voleu pujar una mica el nivell, podeu fer que algunes cerques no diferenciïn entre majúscules i minúscules.
Aquesta fase se centra a obtenir informació global a partir del conjunt de personatges disponibles a l’Academia.
calcularVidaMitjana(), obtenirPersonatgeMesNivell(), comptarPerTipus()Ara fareu que l’Academia pugui mostrar els personatges en diferents ordres segons el criteri que interessi.
nom, per nivell o per vida.Comparator per definir criteris d’ordenació diferents.personatges.sort(Comparator.comparing(Personatge::getNom));Un cop funcionin les operacions de consulta, podeu incorporar accions que modifiquin l’estat del sistema dins de l’Academia.
Implementeu una o més funcionalitats d’aquest tipus:
entrenarPersonatge(String nom) per augmentar-li el nivell.curarTotsElsPersonatges(int quantitat) per recuperar punts de vida.eliminarPersonatge(String nom) per treure’l del repositori.Personatge trobat: Lira (Arquer) - nivell 6
Personatges vius: 5
Vida mitjana del grup: 84.2
S'ha entrenat Thorin. Nou nivell: 8
Llistat de l'Academia ordenat per nivell:
Merlina - 9
Thorin - 8
Lira - 6
En aquesta fase heu de demostrar que les funcionalitats noves funcionen correctament amb dades de prova.
Academia.Equip a partir de personatges seleccionats de l’Academia.Quan el programa funcioni, respon aquestes preguntes per justificar les decisions de disseny que has pres.
Academia?Academia i l’Equip dins d’aquest nou plantejament?Aquest bloc us pot servir de suport quan arribeu a la part d’ordenació o quan vulgueu entendre millor algunes decisions de disseny.
Una interfície en Java és un contracte: defineix mètodes que una classe es compromet a implementar. No serveix per guardar estat com una classe normal, sinó per indicar quin comportament ofereix.
public interface OrdenablePerNivell {
void ordenarPerNivell();
}
Quan una classe implementa una interfície, ho indiquem amb la paraula clau implements.
public class Academia implements OrdenablePerNivell {
@Override
public void ordenarPerNivell() {
// implementacio del metode
}
}
Comparable i ComparatorComparable s’utilitza quan una classe té un ordre natural. Per exemple, si decidim que els personatges s’han d’ordenar per nom de manera predeterminada.
public class Personatge implements Comparable<Personatge> {
@Override
public int compareTo(Personatge altre) {
return this.getNom().compareTo(altre.getNom());
}
}
Comparator, en canvi, s’utilitza quan volem diferents criteris d’ordenació sense modificar la classe. És especialment útil en aquesta activitat, perquè l’Academia pot necessitar ordenar per nom, per nivell o per vida segons el cas.
personatges.sort(Comparator.comparing(Personatge::getNom));
personatges.sort(
Comparator.comparingInt(Personatge::getNivell).reversed()
);
Idea clau: si només voleu un criteri fix, Comparable pot tenir sentit. Si voleu flexibilitat i diversos criteris, normalment us interessarà més Comparator.
Si voleu anar més enllà, aquí teniu extensions per fer l’Academia més completa i més propera a un projecte real.
Sanador o una Exploradora i comprova si el sistema l’accepta sense grans canvis.Comparator.Personatge.Scanner i separeu la lògica del menú de la lògica del model.Comparable o Comparator segons si voleu un únic ordre o diversos criteris.ServeiAcademia.A sota tens una representació simplificada del plantejament final: reutilitzeu el projecte anterior i hi afegiu una Academia com a repositori general de personatges per preparar equips.
classDiagram
class Personatge {
- String nom
- int vida
- int nivell
+ boolean estaViu()
+ void mostrarInformacio()
}
class Guerrer {
- int forca
}
class Mag {
- int mana
}
class Arquer {
- int precisio
}
class Academia {
- String nom
- ArrayList~Personatge~ personatges
+ void afegirPersonatge(Personatge)
+ void mostrarPersonatges()
+ Personatge buscarPerNom(String)
+ ArrayList~Personatge~ filtrarPerTipus(String)
+ double calcularVidaMitjana()
+ void ordenarPerNivell()
}
class Equip {
- String nomEquip
- ArrayList~Personatge~ membres
+ void afegirPersonatge(Personatge)
}
class Principal {
+ main(String[] args)
}
Personatge <|-- Guerrer
Personatge <|-- Mag
Personatge <|-- Arquer
Academia "1" *-- "*" Personatge : repositori
Equip "1" *-- "*" Personatge : membres
Principal --> Academia : utilitza
Equip --> Academia : selecciona des de
Tip: el diagrama us pot ajudar a decidir on té sentit afegir cada funcionalitat nova.