SOLUZIONE. Requisiti. Requisiti (cont.) Fase di analisi. Università di Roma La Sapienza Facoltà di Ingegneria

Documenti analoghi
Università di Roma La Sapienza Facoltà di Ingegneria

SOLUZIONE. Requisiti. Requisiti (cont.) Fase di analisi. Università di Roma La Sapienza Facoltà di Ingegneria

SOLUZIONE. Requisiti. Requisiti (cont.) Requisiti (cont.) Sapienza - Università di Roma Facoltà di Ingegneria

SAPIENZA Università di Roma Facoltà di Ingegneria dell Informazione, Informatica e Statistica

SOLUZIONE. Requisiti. Requisiti (cont.) Requisiti (cont.)

Progettazione del Software

SAPIENZA Università di Roma Facoltà di Ingegneria dell Informazione, Informatica e Statistica

SOLUZIONE. Requisiti. Requisiti (cont.) Fase di analisi. Università di Roma La Sapienza Facoltà di Ingegneria

SAPIENZA Università di Roma, Facoltà di Ingegneria

La fase di progetto e realizzazione. PROGETTAZIONE DEL SOFTWARE (Ing. Gestionale) Diagramma delle classi realizzativo

SOLUZIONE. Requisiti. Requisiti (cont.) Requisiti (cont.) Università di Roma La Sapienza Facoltà di Ingegneria

Fasi del ciclo di vita del software (riassunto)

Fasi del ciclo di vita del software (riassunto) Progetto: generalità. Progetto e realizzazione (riassunto)

SAPIENZA Università di Roma, Facoltà di Ingegneria

La fase di realizzazione. Realizzazione di una classe UML con soli attributi. Traduzione in Java del diagramma delle classi

Esempio su strutture dati dinamiche: ArrayList

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Fondamenti di Informatica I

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

SAPIENZA Università di Roma, Facoltà di Ingegneria

se invoco un metodo di Object che è ridefinito in Point, viene invocato il metodo definito in Point

Corso di Progettazione del Software

Sapienza - Università di Roma Facoltà di Ingegneria dell Informazione Corso di Laurea in Ingegneria Informatica

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

Fondamenti di Informatica T2 Modulo 2. Corso di Laurea in Ingegneria Informatica Anno accademico 2008/2009. Enumerativi

La fase di progetto e realizzazione. PROGETTAZIONE DEL SOFTWARE (Ing. Gestionale) Diagramma delle classi realizzativo

Ereditarietà (ultima)

La classe java.lang.object

Obiettivi dell esercitazione. Requisiti (cont.) Requisiti. Università di Roma La Sapienza A.A Facoltà di Ingegneria Sede di Latina

Esempio su strutture dati dinamiche: ArrayList

Esempio su strutture dati dinamiche: ArrayList

STRUTTURE DATI: OLTRE GLI ARRAY LISTE

Università degli Studi di Roma La Sapienza, Facoltà di Ingegneria. Corso di INGEGNERIA DEL SOFTWARE (Ing. Informatica, Nuovo Ordinamento)

Laboratorio di Sistemi Classi e relazioni Java

Realizzazione di una classe con un associazione

Bank. Bank. BankAccount. Bank. Bank. private BankAccount[] conti; // Posizione attuale private int posizioneattuale;...

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

Uguaglianza e copia di oggetti

Introduzione al Java Collections Framework. Java Collections Framework (cont.) Interfacce del Collections Framework

Corso di Laurea Ingegneria Civile Fondamenti di Informatica. Esercizi sui metodi. Carla Limongelli. Maggio Esercizi 1

Introduzione al Java Collections Framework

La fase di realizzazione. La fase di realizzazione (cont.) Traduzione in Java del diagramma degli use case

Astrazioni sui dati : Specifica di Tipi di Dato Astratti in Java

Programmazione II Compitino (Vers. B)

Muoversi all interno di un Vector. Vector e Enumeration. Enumeration. Collezioni di oggetti: Vector. La classe Object. Aggiungere oggetti a un Vector

16 - Ereditarietà, tipi e gerarchie

16 - Ereditarietà, tipi e gerarchie

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Corso di Laurea Ingegneria Civile Elementi di Informatica. Esercizi. Carla Limongelli. Esercizi 1

3. un metodo che restituisce l elenco delle matricole di tutti gli studenti del corso;

Progetto PI , passo A.3 versione del 28 marzo 2007

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

Esercitazione n 3. Capacità di analisi e di estensione di progetti esistenti Linguaggio Java:

Esercitazioni di Progettazione del Software. Esercitazione (Prova al calcolatore del 17 settembre 2010)

Fasi del ciclo di vita del software (riassunto) Progetto: generalità. Progetto e realizzazione (riassunto)

Generics & Collections

Il linguaggio Java. La superclasse universale Object

Sul pattern Iterator

Classi e array. Viene ora affrontato un problema di definizione di una classe in cui una variabile d istanza è di tipo array

Strutture dati. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05

Programmazione ad Oggetti. Java Parte II

Collezioni. (a cura del Prof. Marco Patella)

18 - Classi parzialmente definite: Classi Astratte e Interfacce

A. Lorenzi, A. Rizzi Java. Programmazione ad oggetti e applicazioni Android Istituto Italiano Edizioni Atlas

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Esercitazione. Docente Ing. Mariateresa Celardo

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Laboratorio 9 ( Java 4 ) Classe astratta per BFS su grafo

Indice. Prefazione. 3 Oggetti e Java 53

Esercitazione n 2. Obiettivi

Alcuni diagrammi. OCL (Object Constraint Language)

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Università degli Studi di Roma La Sapienza, Facoltà di Ingegneria. Corso di INGEGNERIA DEL SOFTWARE (Ing. Informatica, Nuovo Ordinamento)

Eccezioni. Comportamento di default (esempio) Propagazione delle eccezioni

Implementazione Java di un ADT

Capitolo 6. Uso della gerarchia. c 2005 Pearson Education Italia Capitolo 6-1 / 125

Programmazione a Oggetti Modulo B

Programmazione Java Struttura di una classe, Costruttore, Riferimento this

Programmazione a oggetti

Programmazione con Java

Programmazione ad oggetti Prova scritta 15 Gennaio 2013

Esempio: Interfacce. Gioco Interfacce

Il diagramma delle classi è raffigurato in Figura 1, insieme alla descrizione della responsabilità sulle associazioni.

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Esempi in Java di program.ne O-O

Java, Oggetti e Strutture Dati di G. Callegarin - Edizioni CEDAM

Esempio: Interfacce. Gioco Interfacce

Studente (Cognome Nome):

public static boolean occorre (int[] a, int n) { int i = 0; boolean trovato = false;

Politecnico di Milano Ingegneria del Software a.a. 2008/09

Array. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 11. A. Miola Dicembre 2007

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Implementazione ADT: Alberi

Riferimenti ad oggetti: Fondamenti di Informatica L-B Esercitazione n 4 Java: I/O, Costruttori e altro. Riferimenti ad oggetti: (Esempio)

Progetto E versione del 12 marzo 2007

Gestione delle eccezioni

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a luglio 2011

Confronti, equals. Operatori Relazionali, confronti Confronti fra Oggetti, ridefinizione di equals. Laboratorio di Programmazione - Luca Tesei

Implementazione con alberi binari di ricerca

Transcript:

Università di Roma La Sapienza Facoltà di Ingegneria Requisiti Corso di PROGETTAZIONE DEL SOFTWARE I (Corso di Laurea in Ingegneria Informatica) Proff. Giuseppe De Giacomo e Marco Cadoli Canali A-L & M-Z A.A. 2004-05 Compito d esame del 12 settembre 2005 SOLUZIONE Requisiti. L applicazione di interesse riguarda la progettazione di appartamenti. Di ogni appartamento interessano l indirizzo, una descrizione testuale, i locali che lo compongono e come questi sono connessi tra loro (si noti che se il locale A è connesso con il locale B, allora anche B è connesso con A). Di ciascun locale interessano i metri quadri ed una descrizione testuale. I locali sono suddivisi in vani generici di cui interessa il tipo ( singolo, doppio, corridoio ), bagni di cui interessa il numero di punti acqua, e cucine di cui interessa il numero di punti gas. Un appartamento è inizialmente in preparazione, alla fine dei lavori diviene pronto per la consegna, a questo punto possono essere richiesti ulteriori lavori (e quindi torna ad essere in preparazione) o può essere consegnato. Solo quando un appartemento è in preparazione si possono aggiungere ed eliminare locali da esso. U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 2 Requisiti (cont.) L utente dell applicazione vuole poter effettuare dei controlli sugli appartamenti. A questo scopo, si faccia riferimento ad uno use case che prevede che, dato un appartamento, si possa: Fase di analisi verificare che sia presente almeno un bagno ed una cucina tra i locali di cui è composto; restituire l insieme di tutti i vani generici che lo compongono. U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 3 U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 4

Diagramma delle classi Commento sul diagramma delle classi connesso_con 0..* Appartamento +indirizzo: Stringa +descrizione: Stringa { puo essere modificato solo quando e nello stato: "in preparazione" 1..1 formato_da Locale +mq: Reale +descrizione: Stringa 0..* { associazione 0..* simmerica {complete, disjoint Vano Cucina +tipo: Stringa Bagno +puntigas: Intero +puntiacqua: Intero Nella disegno e nella realizzazione successiva dobbiano tenere presente che solo se un appartemento è in preparazione si possono aggiungere ed eliminare locali dallo stesso. Quindi dovremo permettere ai clienti della classe Appartamento di tenere traccia dello stato in cui si trovano le sue istanze. U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 5 U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 6 Diagramma degli stati e delle transizioni classe Appartamento Diagramma degli use case in preparazione fine_lavori effettua Controlli richiesta_ulteriori_lavori pronto per la consegna consegna consegnato Utente U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 7 U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 8

Specifica dello use case InizioSpecificaUseCase Controlli verificabagnocucina (a: Appartamento): Booleano pre: nessuna post: result è true se a è composto da locali che includono almeno un bagno ed una cucina; result è false altrimenti. Fase di progetto insiemevani (a: Appartamento): Insieme(Locale) pre: nessuna post: result è l insieme formato dai vani che compongono a. FineSpecifica U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 9 U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 10 Algoritmi per le operazioni dello use-case Algoritmi per le operazioni degli use case (cont.) Adottiamo i seguenti algoritmi: Per l operazione verificabagnocucina: bool habagno = false; bool hacucina = false; per ogni link l formato_da di a if l.locale è istanza di Bagno habagno == true; else if l.locale è istanza di Cucina hacucina == true; return habagno AND hacucina; Per l operazione insiemevani: Insieme(vani) result = new Insieme(Vani); per ogni link l di formato_da di a se l.locale è istanza Vani aggiungi l.locale a result; return result; U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 11 U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 12

Responsabilità sulle associazioni Strutture di dati La seguente tabella delle responsabilità si evince da: 1. i requisiti, 2. la specifica degli algoritmi per le operazioni di classe e use-case, 3. i vincoli di molteplicità nel diagramma delle classi. Associazione Classe ha resp. formato da Appartamento SÌ 1,2 Locale SÌ 1,3 connesso con Locale SÌ 1 Locale SÌ 1 Abbiamo la necessità di rappresentare collezioni omogenee di oggetti, a causa: dei vincoli di molteplicità 0..* delle associazioni, delle variabili locali necessarie per algoritmi. Per fare ciò, utilizzeremo la classe Java InsiemeListaOmogeneo. U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 13 U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 14 API per le strutture di dati Corrispondenza fra tipi UML e Java // File insiemelista/insiemelistaomogeneo.java package insiemelista; public class InsiemeListaOmogeneo extends InsiemeLista { public InsiemeListaOmogeneo(Class cl) public InsiemeListaOmogeneo() public int size() public boolean isempty() public boolean contains(object e) public boolean add(object e) public boolean remove(object e) public Iterator iterator() public boolean containsall(collection c) public Object[] toarray() public Object[] toarray(object[] a) public boolean equals(object o) public Object clone() public String tostring() Riassumiamo le nostre scelte nella seguente tabella di corrispondenza dei tipi UML. Tipo UML Booleano Intero Stringa Insieme Rappresentazione in Java boolean int String InsiemeListaOmogeneo U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 15 U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 16

Tabelle di gestione delle proprietà di classi UML Altre considerazioni Riassumiamo le nostre scelte differenti da quelle di default mediante la tabella delle proprietà immutabili e la tabella delle assunzioni sulla nascita. Classe UML Appartamento Locale Proprietà immutabile indirizzo metriquadri Proprietà Classe UML nota alla nascita non nota alla nascita Sequenza di nascita degli oggetti: Non è necessario assumere un particolare ordine nella nascita degli oggetti. Valori alla nascita: Non esistano valori di default validi per tutti gli oggetti di ciascuna classe. U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 17 U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 18 Rappresentazione degli stati in Java API delle classi Java progettate Per la classe UML Appartamento, ci dobbiamo occupare della rappresentazione in Java del diagramma degli stati e delle transizioni. Scegliamo di rappresentare gli stati mediante una variabile int, secondo la seguente tabella. Rappresentazione in Java tipo var. int Stato nome var. stato in preparazione valore 1 pronto per la consegna valore 2 consegnato valore 3 A titolo di esempio, viene fornita la API della classe CCC: public class Appartamento { // COSTRUTTORE public Appartamento(String indirizzo) // GESTIONE ATTRIBUTI public String getindirizzo() public String getdescrizione() public void setdescrizione(string d) // GESTIONE ASSOCIAZIONI // - formatoda public void inseriscilinkformatoda(associazioneformatoda a) public void eliminalinkformatoda(associazioneformatoda a) public InsiemeListaOmogeneo getlinkformatoda() // GESTIONE STATI E TRASIZIONE public bool estinpreparazione() public void finelavori() public void richiestaulteriorilavori() public void consegna() U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 19 U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 20

Struttura dei file e dei package Fase di realizzazione +---insiemelista InsiemeListaOmogeneo.java InsiemeLista.java IteratorInsiemeLista.java \---appartamenti Appartamento.java Locale.java AssociazioneFormatoDa.java AssociazioneConnessoCon.java TipoLinkFormatoDa.java TipoLinkConnessoCon.java EccezionePrecondizioni.java Controlli.java +---vano Vano.java +---bagno Bagno.java \---cucina Cucina.java U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 21 U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 22 La classe Java Appartamento // File appartamenti/appartamento.java public class Appartamento { private final String indirizzo; private String descrizione; private InsiemeListaOmogeneo insiemeformatoda; private int stato; private final int INPREPARAZIONE = 1; private final int PRONTO = 2; private final int CONSEGNATO = 3; public Appartamento(String i, String d) { indirizzo = i; descrizione = d; insiemeformatoda = new InsiemeListaOmogeneo(TipoLinkFormatoDa.class); stato = INPREPARAZIONE; public String getindirizzo() { return indirizzo; public String getdescrizione() { return descrizione; public void setdescrizione(string d) { descrizione = d; public void inseriscilinkformatoda(associazioneformatoda a) { if (a!= null) insiemeformatoda.add(a.getlink()); U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 23 public void eliminalinkformatoda(associazioneformatoda a) { if (a!= null) insiemeformatoda.remove(a.getlink()); public InsiemeListaOmogeneo getlinkformatoda() { return (InsiemeListaOmogeneo)insiemeFormatoDa.clone(); public boolean estinpreparazione() { return stato == INPREPARAZIONE; public void finelavori() { if (stato == INPREPARAZIONE) stato = PRONTO; public void consegna() { if (stato == PRONTO) stato = CONSEGNATO; public void richiestaulteriorilavori() { if (stato == PRONTO) stato = INPREPARAZIONE;

// File appartamenti/locale.java import java.util.*; La classe Java Locale public abstract class Locale { private double mq; private String descrizione; private TipoLinkFormatoDa linkformatoda; private InsiemeListaOmogeneo insiemeprimo; private InsiemeListaOmogeneo insiemesecondo; public Locale(double m, String d) { mq = m; descrizione = d; insiemeprimo = new InsiemeListaOmogeneo(TipoLinkConnessoCon.class); insiemesecondo = new InsiemeListaOmogeneo(TipoLinkConnessoCon.class); public String getdescrizione() { return descrizione; public void setdescrizione(string d) { descrizione = d; public void inseriscilinkformatoda(associazioneformatoda a) { U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 24 if (a!= null) linkformatoda = a.getlink(); public void eliminalinkformatoda(associazioneformatoda a) { if (a!= null) linkformatoda = null; public TipoLinkFormatoDa getlinkformatoda() { return linkformatoda; public boolean halinkformatoda() { return linkformatoda!= null; public void inseriscilinkprimo(associazioneconnessocon a) { if (a!= null) insiemeprimo.add(a.getlink()); public void eliminalinkprimo(associazioneconnessocon a) { if (a!= null) insiemeprimo.remove(a.getlink()); public void inseriscilinksecondo(associazioneconnessocon a) { if (a!= null) insiemesecondo.add(a.getlink()); public void eliminalinksecondo(associazioneconnessocon a) { if (a!= null) insiemesecondo.remove(a.getlink()); public InsiemeListaOmogeneo getlinkconnessocon() { //ConnessoCon è simmetrica InsiemeListaOmogeneo ris = (InsiemeListaOmogeneo)insiemePrimo.clone(); Iterator it = insiemesecondo.iterator(); while(it.hasnext()) ris.add(it.next()); return ris; La classe Java AssociazioneFormatoDa // File appartamenti/associazioneordine.java public class AssociazioneFormatoDa { private AssociazioneFormatoDa(TipoLinkFormatoDa t) { link = t; private TipoLinkFormatoDa link; public TipoLinkFormatoDa getlink() { return link; public static void inserisci(tipolinkformatoda y) { if (y!= null && y.getappartamento().estinpreparazione() && //NB stato!(y.getlocale().halinkformatoda()) ) { //NB molteplicita AssociazioneFormatoDa k = new AssociazioneFormatoDa(y); k.link.getappartamento().inseriscilinkformatoda(k); k.link.getlocale().inseriscilinkformatoda(k); public static void elimina(tipolinkformatoda y) { if (y!= null && y.getappartamento().estinpreparazione() && //NB stato y.getlocale().getlinkformatoda().equals(y)) { //NB levo link giusto AssociazioneFormatoDa k = new AssociazioneFormatoDa(y); k.link.getappartamento().eliminalinkformatoda(k); k.link.getlocale().eliminalinkformatoda(k); U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 25

La classe Java AssociazioneConnessoCon // File appartamenti/associazioneconnessocon.java //NOTA: questa associazione deve essere simmetrica public class AssociazioneConnessoCon { private AssociazioneConnessoCon(TipoLinkConnessoCon t) { link = t; private TipoLinkConnessoCon link; public TipoLinkConnessoCon getlink() { return link; public static void inserisci(tipolinkconnessocon y) { if (y!= null) { AssociazioneConnessoCon k = new AssociazioneConnessoCon(y); k.link.getprimo().inseriscilinkprimo(k); k.link.getsecondo().inseriscilinksecondo(k); k.link.getprimo().inseriscilinksecondo(k); //NOTA k.link.getsecondo().inseriscilinkprimo(k); //manteniamo la simmetria public static void elimina(tipolinkconnessocon y) { if (y!= null) { AssociazioneConnessoCon k = new AssociazioneConnessoCon(y); k.link.getprimo().eliminalinkprimo(k); k.link.getsecondo().eliminalinksecondo(k); k.link.getprimo().eliminalinksecondo(k); //NOTA U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 26 k.link.getsecondo().eliminalinkprimo(k); //manteniamo la simmetria La classe Java TipoLinkFormatoDa // File appartamenti/tipolinkformatoda.java public class TipoLinkFormatoDa { private final Appartamento lappartamento; private final Locale illocale; public TipoLinkFormatoDa(Appartamento a, Locale l) throws EccezionePrecondizioni { if (a == null l == null) // CONTROLLO PRECONDIZIONI throw new EccezionePrecondizioni ("Gli oggetti devono essere inizializzati"); lappartamento = a; illocale = l; public boolean equals(object o) { if (o!= null && getclass().equals(o.getclass())) { TipoLinkFormatoDa t = (TipoLinkFormatoDa)o; return t.lappartamento == lappartamento && t.illocale == illocale; else return false; public Appartamento getappartamento() { return lappartamento; public Locale getlocale() { return illocale; U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 27

La classe Java TipoLinkConnessoCon La classe Java Vano // File appartamenti/tipolinkconnessocon.java public class TipoLinkConnessoCon { private final Locale primo; private final Locale secondo; public TipoLinkConnessoCon(Locale l1, Locale l2) throws EccezionePrecondizioni { if (l1 == null l2 == null) // CONTROLLO PRECONDIZIONI throw new EccezionePrecondizioni ("Gli oggetti devono essere inizializzati"); primo = l1; secondo = l2; public boolean equals(object o) { if (o!= null && getclass().equals(o.getclass())) { TipoLinkConnessoCon t = (TipoLinkConnessoCon)o; return t.secondo == secondo && t.primo == primo; else return false; public Locale getprimo() { return primo; public Locale getsecondo() { return secondo; U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 28 // File appartamenti/vano/vano.java package appartamenti.vano; import appartamenti.*; public class Vano extends Locale { private String tipo; public Vano(double mq, String d, String t) { super(mq, d); tipo = t; public String gettipo() { return tipo; public void settipo(string t) { tipo = t; U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 29 La classe Java Bagno La classe Java Cucina // File appartamenti/bagno/bagno.java package appartamenti.bagno; import appartamenti.*; public class Bagno extends Locale { private int puntiacqua; public Bagno(double mq, String d, int p) { super(mq, d); puntiacqua = p; public int getpuntiacqua() { return puntiacqua; public void setpuntiacqua(int p) { puntiacqua = p; // File appartamenti/cucina/cucina.java package appartamenti.cucina; import appartamenti.*; public class Cucina extends Locale { private int puntigas; public Cucina(double mq, String d, int p) { super(mq,d); puntigas = p; public int getpuntigas() { return puntigas; public void setpuntigas(int p) { puntigas = p; U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 30 U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 31

Realizzazione in Java dello use case // File appartamenti/controlli.java import java.util.*; import appartamenti.vano.*; import appartamenti.bagno.*; import appartamenti.cucina.*; public class Controlli { private Controlli(){ public static InsiemeListaOmogeneo insiemevani(appartamento a) { InsiemeListaOmogeneo result = new InsiemeListaOmogeneo(Vano.class); InsiemeListaOmogeneo locali = a.getlinkformatoda(); Iterator it = locali.iterator(); while(it.hasnext()) { Locale l = ((TipoLinkFormatoDa)it.next()).getLocale(); if (l instanceof Vano) result.add(l); return result; public static boolean verificabagnocucina(appartamento a) { boolean habagno = false; boolean hacucina = false; InsiemeListaOmogeneo locali = a.getlinkformatoda(); Iterator it = locali.iterator(); while(it.hasnext() && (!habagno!hacucina)) { Locale l = ((TipoLinkFormatoDa)it.next()).getLocale(); if (l instanceof Bagno) habagno = true; else if (l instanceof Cucina) hacucina = true; return habagno && hacucina; U. La Sapienza. Fac.Ingegneria. Progettazione del Software I. Soluzione compito 2005-09-12 32