Ingegneria del Software - ICAR-CNR

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