Ciao.
continuo i miei studi in java, e mi sono inventato un programmino che simula un CUP, senza troppi controlli perché al momento non mi interessano.
Ero quasi soddisfatto del lavoro svolto, quando ho iniziato a scrivere la classe principale e mi sono accorto della quantità di codice ripetuto:
le classi basi sono (indipendentemente se concettualmente sono giuste o sbagliate)
public abstract class Persona { //ASTRATTA
private String nominativo;
public Persona(String nominativo) {
setNominativo(nominativo);
}
public String getNominativo() {
return nominativo;
}
public void setNominativo(String nominativo) {
this.nominativo = nominativo;
}
@Override
public String toString() {
return "Persona [" + getNominativo() + "]";
}
}
//POI
public class Medico extends Persona {
private String qualifica;
public Medico(String nominativo, String qualifica) {
super(nominativo);
setQualifica(qualifica);
}
public String getQualifica() {
return qualifica;
}
public void setQualifica(String qualifica) {
this.qualifica = qualifica;
}
@Override
public String toString() {
return "Medico [" + super.getNominativo() + ": " + getQualifica() + "]";
}
}
// E
public class Paziente extends Persona {
private int codice;
private Visita visita;
public Paziente(String nominativo, int codice) {
super(nominativo);
setCodice(codice);
this.visita=null;
}
public int getCodice() {
return codice;
}
public void setCodice(int codice) {
this.codice = codice;
}
public Visita getVisita() {
return visita;
}
public void setVisita(Visita visita) {
this.visita = visita;
}
@Override
public String toString() {
return "Paziente [" + super.getNominativo() + " - " + getCodice() + "]";
}
}
// POI LA CLASSE VISITA
public class Visita {
private String tipo;
private Persona medico;
public Visita() { }
public Visita(String tipo, Persona medico) {
setTipo(tipo);
setMedico(medico);
}
public String getTipo() {
return tipo;
}
public void setTipo(String tipo) {
this.tipo = tipo;
}
public Persona getMedico() {
return medico;
}
public void setMedico(Persona medico) {
this.medico = medico;
}
@Override
public String toString() {
return "Visita [" + getTipo() + ", [" + getMedico() + "]]";
}
}
// E INFINE PRENOTAZIONE
public class Prenotazione {
private Persona paziente;
private Visita visita;
public Prenotazione(Persona paziente, Visita visita) {
setPaziente(paziente);
setVisita(visita);
}
public Persona getPaziente() {
return paziente;
}
public void setPaziente(Persona paziente) {
this.paziente = paziente;
}
public Visita getVisita() {
return visita;
}
public void setVisita(Visita visita) {
this.visita = visita;
}
@Override
public String toString() {
return "Prenotazione [" + getPaziente() + ", " + getVisita() + "]";
}
}
la classe principale però, è piena di codice che per una sola istruzione o per un oggetto ha del codice molto simile tra metodo e metodo:
package CUP;
import java.util.*;
public class GestionePrenotazioni {
private List<Prenotazione> prenotazioni = new ArrayList<>();
private List<Persona> pazienti = new ArrayList<>();
private List<Persona> medici = new ArrayList<>();
private int cercaInPersone(List<Persona> lista, String nominativo) {
int res = -1;
for(int i=0; i< lista.size(); i++) {
if (nominativo.equalsIgnoreCase(lista.get(i).getNominativo()))
res = i;
}
return res;
}
public boolean addPaziente(String nominativo, int codice) {
if (cercaInPersone(pazienti, nominativo)!=-1)
return false;
return pazienti.add(new Paziente(nominativo, codice));
}
public boolean addMedico(String nominativo, String qualifica) {
if (cercaInPersone(medici, nominativo)!=-1)
return false;
return medici.add(new Medico(nominativo, qualifica));
}
public boolean associaVisita (String tipo, String paziente, String medico) {
int idxMedico = cercaInPersone(medici, medico);
if (idxMedico == -1) {
System.out.println("Inserire prima il medico");
return false;
}
int idxPaziente = cercaInPersone(pazienti, paziente);
if (idxPaziente == -1) {
System.out.println("Inserire prima il paziente");
return false;
}
Visita v = new Visita(tipo, medici.get(idxMedico));
Prenotazione p = new Prenotazione(pazienti.get(idxPaziente), v);
return prenotazioni.add(p);
}
private Prenotazione cercaPrenotazione(String paziente) {
for (int i=0; i< prenotazioni.size();i++) {
if (prenotazioni.get(i).getPaziente().getNominativo().equalsIgnoreCase(paziente)) {
return prenotazioni.get(i);
}
}
return null;
}
public void stampaPrenotazione(String paziente) {
Prenotazione p = cercaPrenotazione(paziente);
if (p != null) {
System.out.println(p);
}else {
System.out.println("Nessuna prenotazione trovata!");
}
};
}
mi piace aver racchiuso in un unico metodo ausiliario la ricerca del paziente e del medico, usando la classe Persona invece che le sottoclassi,
ma
AddMedico, addPaziente e associaVisita ha del codice ripetuto che vorrei ottimizzare ma non riesco......forse non si può.
Il programma funziona, ho omesso tutti i controlli per non dilungarmi troppo, infatti, nel tester ho scritto:
public class Tester {
public static void main(String[] args) {
GestionePrenotazioni gp = new GestionePrenotazioni();
gp.addMedico("Medico UNO", "Oculista");
gp.addMedico("Medico DUE", "Cardiologo");
gp.addPaziente("Paziente UNO", 123);
gp.addPaziente("Paziente DUE", 456);
gp.associaVisita("Oculistica", "Paziente UNO" , "Medico UNO");
gp.associaVisita("Cardiologica", "Paziente DUE" , "Medico DUE");
gp.stampaPrenotazione("Paziente UNO");
gp.stampaPrenotazione("Paziente DUE");
gp.stampaPrenotazione("Paziente TRE");
gp.addPaziente("Paziente TRE", 789);
gp.associaVisita("Oculistica", "Paziente TRE" , "Medico DUE");
gp.stampaPrenotazione("Paziente TRE");
}
}
l'output:
Prenotazione [Paziente [Paziente UNO - 123], Visita [Oculistica, [Medico [Medico UNO: Oculista]]]]
Prenotazione [Paziente [Paziente DUE - 456], Visita [Cardiologica, [Medico [Medico DUE: Cardiologo]]]]
Nessuna prenotazione trovata!
Prenotazione [Paziente [Paziente TRE - 789], Visita [Oculistica, [Medico [Medico DUE: Cardiologo]]]]
ed ho asociato una visita oculistica ad un cardiologo, ma quello che mi premeva era capire se si poteva ottimizzare il codice ad esempio con interfacce funzionali o se in questi casi, meglio lasciare così perché in effetti si agisce su oggetti diversi , un arrayList di Pazienti e uno di Medici che hanno alcuni attributi diversi tra loro.
Grazie. ciao
Tagan