Ingegneria del Software Java – Relazioni Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Associazioni Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche 1 Associazione Uno a Zero-Uno • Un esempio – Un’autovettura ha al più un proprietario Automobile Proprietario +Marca : String +Modello : String 0..1 +Nome +Cognome • Implementazione – Dato il verso di navigazione specificato è necessario avere una reference ad un oggetto Proprietario all’interno dell’oggetto Automobile – I due oggetti hanno cicli di vita indipendenti Automobile Proprietario +Marca: String +Modello: String +Titolare: Proprietario +Nome +Cognome Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Associazione Uno a Zero-Uno (2) • Classe Proprietario File: Proprietario.java Package: Auto public class Proprietario { private String Cognome; private String Nome; Proprietario(String Cognome, String Nome){ this.Cognome = Cognome; this.Nome = Nome; } public String getNome(){ return Nome; } public String getCognome(){ return Cognome; Corso di Ingegneria del Software Università “Federico II” di Napoli } } Ing. Antonio Coronato Consiglio Nazionale delle Ricerche 2 Associazione Uno a Zero-Uno (3) • Classe Automobile File: Automobile.java Package: Auto public class Automobile { private String Marca; private String Modello; private Proprietario Titolare; Automobile(String Marca, String Modello, Proprietario Titolare){ this.Marca = Marca; this.Modello = Modello; this.Titolare = Titolare; } void stampaProprietario(){ System.out.println("Dati del proprietario dell'auto "+Marca+" "+Modello); System.out.println("Nome: "+Titolare.getNome()); System.out.println("Cognome: "+Titolare.getCognome()); } } Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Associazione Uno a Zero-Uno (4) • Classe Main File: Main.java Package: Auto public class Main { Output Dati del proprietario dell'auto Alfa Romeo 156 public static void main(String[] args) { // Dichiarazione degli oggetti Nome: Coronato Cognome: Antonio Automobile Alfa; Automobile Ford; Dati del proprietario dell'auto Ford Fiesta Proprietario Coronato; Nome: Coronato Cognome: Antonio // Creazione degli oggetti Coronato = new Proprietario("Antonio","Coronato"); Alfa = new Automobile("Alfa Romeo","156",Coronato); Ford = new Automobile("Ford","Fiesta",Coronato); // Stampa report Alfa.stampaProprietario(); System.out.println(); Ford.stampaProprietario(); } Corso di }Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche 3 Associazione Uno a Uno • Un esempio – Un’autovettura ha un solo proprietario Automobile Proprietario +Marca : String +Modello : String 1 +Nome +Cognome • Implementazione – I due oggetti hanno cicli parzialmente di vita indipendenti • Nell’esempio precedente la reference all’oggetto Proprietario poteva valere NULL (valore zero della relazione) – Si deve gestire in maniera affidabile la cancellazione dell’oggetto Proprietario • Che cosa succede all’oggetto Automobile se il suo Proprietario viene eliminato dalIng.sistema? Antonio Coronato Corso di Ingegneria del Software Consiglio Nazionale delle Ricerche Università “Federico II” di Napoli Associazione Bi-direzionale • Esempio – Si tiene conto anche delle Autovetture possedute da un Proprietario Automobile +Marca : String +Modello : String Proprietario 0..* 0..1 +Nome +Cognome • Implementazione – E’ necessario avere una struttura di reference agli oggetti Automobile all’interno dell’oggetto Proprietario Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche 4 Associazione Zero (Uno) a Molti • Esempio – Si tiene conto anche delle Autovetture possedute da un Proprietario Automobile +Marca : String +Modello : String Proprietario 0..* +Nome +Cognome • Implementazione – Una soluzione basata su array Automobile Proprietario +Marca : String +Modello : String +Nome: String +Cognome: String +Auto: Automobile [ ] Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Associazione Zero (Uno) a Molti (2) • Classe Automobile File: Automobile.java Package: Auto public class Automobile { private String Marca; private String Modello; Automobile(String Marca, String Modello){ this.Marca = Marca; this.Modello = Modello; } public String getMarca(){ return Marca; } public String getModello(){ [] return Modello; } } Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche 5 Associazione Zero (Uno) a Molti (2) • Classe Proprietario File: Proprietario.java Package: Auto public class Proprietario { private String Cognome; private String Nome; private Automobile[] Auto; Proprietario(String Cognome, String Nome, Automobile[] Auto){ this.Cognome = Cognome; this.Nome this.Auto = Nome; = Auto; } public void stampaAuto(){ [] System.out.println("Report delle auto di "+Nome+" "+Cognome); for(int i = 0; i < Auto.length; i++) System.out.println("Marca: "+Auto[i].getMarca()+" Modello: "+Auto[i].getModello()); } del Software Corso di Ingegneria Ing. Antonio Coronato } Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Associazione Zero (Uno) a Molti (3) • Classe Main File: Main.java Package: Auto public class Main { public static void main(String[] args) { // Dichiarazione Output Automobile[] Auto; Report delle auto di Coronato Antonio Proprietario Coronato; Marca: Alfa Romeo Modello: 156 Marca: Ford Modello: Fiesta // Implementazione Auto = new Automobile[2]; Automobile Alfa = new Automobile("Alfa Romeo","156"); Automobile Ford = new Automobile("Ford","Fiesta"); Auto[0] = Alfa; Auto[1] = Ford; Coronato = new Proprietario("Antonio","Coronato",Auto); [] // Stampa report Coronato.stampaAuto(); } Software Corso di Ingegneria del Ing. Antonio Coronato } Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche 6 Associazione Zero (Uno) a Molti • Esempio – Si tiene conto anche delle Autovetture possedute da un Proprietario Automobile +Marca : String +Modello : String Proprietario 0..* +Nome +Cognome • Implementazione – Una soluzione basata su LinkedList – Maggiore dinamicità Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Aggregazioni Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche 7 Aggregazioni • Ancora una volta i cicli di vita degli oggetti devono essere indipendenti salvo molteplicità particolari • Si utilizzano le stesse soluzioni adottate per le associazioni Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Composizioni Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche 8 Composizioni • Un esempio Automobile +Marca : String +Modello : String 1 Motore +Cilindrata: Int +Potenza: Int • Implementazione – Gli oggetti hanno ciclo di vita condiviso Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche Composizioni (2) • Classe Motore File: Motore.java Package: Auto public class Motore { private int Cilindrata; private int Potenza; Motore(int Cilindrata, int Potenza){ this.Cilindrata = Cilindrata; this.Potenza = Potenza; } int getPotenza(){ return Potenza; } int getCilindrata(){ return Cilindrata; } } Corso di Ingegneria del Software Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche 9 File: Automobile.java Package: Auto public class Automobile { Composizioni (3) private String Marca; private String Modello; private Motore Mo; Automobile(String Marca, String Modello, int Cilindrata, int Potenza){ this.Marca = Marca; this.Modello = Modello; Mo = new Motore(Cilindrata,Potenza); } Automobile(String Marca, String Modello, Motore Mo){ this.Marca = Marca; this.Modello = Modello; this.Mo = Mo; } public String getMarca(){ return Marca; } public String getModello(){ return Modello; } public int getCilindrata(){ return Mo.getCilindrata(); } public int getPotenza(){ return Mo.getPotenza(); Corso di Ingegneria del Software } Ing. Antonio Coronato } Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche File: Main.java public class Main { Package: Auto Composizioni (4) public static void main(String[] args) { // Dichiarazione ed implementazione Automobile Alfa = new Automobile("Alfa Romeo","156",1900,150); • Classe Main Motore Mo = new Motore(1100,75); Automobile Ford = new Automobile("Ford","Fiesto",Mo); // Stampa report alfa System.out.println("Report Auto "); System.out.println("Marca: "+Alfa.getMarca()); System.out.println("Modello: "+Alfa.getModello()); Output Report Auto System.out.println("Cilindrata: "+Alfa.getCilindrata()); Marca: Alfa Romeo System.out.println("Potenza: "+Alfa.getPotenza()); Modello: 156 Cilindrata: 1900 Potenza: System.out.println(); 150 System.out.println(); Report Seconda Auto // Stampa report ford fiesta System.out.println("Report Seconda Auto "); Marca: Ford System.out.println("Marca: "+Ford.getMarca()); Modello: Fiesto System.out.println("Modello: "+Ford.getModello()); Cilindrata: 1100 System.out.println("Cilindrata: "+Ford.getCilindrata()); Potenza: 75 System.out.println("Potenza: "+Ford.getPotenza()); } } di Ingegneria del Software Corso Ing. Antonio Coronato Università “Federico II” di Napoli Consiglio Nazionale delle Ricerche 10