Diagramma delle classi UML

Documenti analoghi
SAPIENZA Università di Roma, Facoltà di Ingegneria

Corso Linguaggi di programmazione II - Unina Esercitazione (prova intercorso)

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

QUEUE : considerazioni. QUEUE : considerazioni. QUEUE : esempio. QUEUE : esempio

Algoritmi e Strutture Dati. Tipo di dato astratto e Strutture dati elementari

SAPIENZA Università di Roma, Facoltà di Ingegneria

Realizzazione di una classe con un associazione

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

INFORMATICA GRAFICA - FONDAMENTI DI INFORMATICA Ing. Civile - Edile/Architettura Dott. Penzo SOLUZIONE PROVA SCRITTA DEL 16/09/2002.

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

Politecnico di Milano. Ingegneria del Software a.a. 2006/07. Appello del 14 settembre 2007 Cognome Nome Matricola

Java. Linguaggi di Programmazione Linguaggi Speciali & Tecnologie dei Linguaggi di Programmazione: Scritto del 30 Giugno 2006

Laboratorio di Programmazione II Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona

Programmazione ad Oggetti Modulo A (Esame del 11/9/2015)

// inizializzazione della biblioteca con utenti, libri e prestiti // non richiesta Biblioteca.inizializza();

Programmazione ad oggetti

Programmazione a oggetti e JAVA. Prof. B.Buttarazzi A.A. 2011/2012

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

L ambizione dei design pattern (letteralmente schemi di programmazione) è quella di offrire soluzioni a problemi ricorrenti che facilitano lo

ARRAYLIST. Programmazione con Java ArrayList e Generics 2 08/06/2014. Daniela Micucci daniela.micucci@unimib.it

Synchronized (ancora)

Esercitazione 6. Tutor: Ing. Diego Rughetti. Anno Accademico 2007/2008

Esercizi della lezione 5 di Java

Scope e visibilità per classi

R. Focardi 2002 Laboratorio di Ingegneria del Software Slide 1. Applicazioni = programmi stand-alone

esercizi Esercizi / problemi

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A Esercitazione. Programmazione Object Oriented in Java

Reflection in Java. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 21 Dicembre 2006

Parcheggio.rtf 1/8 6 gennaio Prova di programmazione: parcheggio a pagamento

COMPITO DI LABORATORIO DI PROGRAMMAZIONE Luglio Soluzione degli Esercizi

Programmazione Orientata agli Oggetti in Linguaggio Java

Corso di Laurea in Ingegneria Gestionale Esame di Informatica - a.a luglio 2013

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Strutture dati "classiche"

Progetto ingegneria del software: la torre di Hanoi

Programmazione Orientata agli Oggetti in Linguaggio Java

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a I scritto Febbraio 11 Febbraio 2011

JAVA in ACTION. Jacopo Torrini. Dipartimento di Ingegneria dell'informazione Laboratorio di Tecnologie del Software.

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Primo scritto 11 Gennaio 2008

Lezione 6 Collezioni. Il concetto astratto di collezione. Servizio minimo: IContainer. Stack (pila)

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a giugno 2013

! Programmazione strutturata ! TDA. ! Classi, incapsulamento, ! OO. ! Scambio messaggi, eredità, polimorfismo. ! OO in Java

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

/** * VETTORE DINAMICO elementi */ private Vector elementi; /** * METODO COSTRUTTORE */ public coda() { elementi=new Vector(); }

ORM: Approccio DAO. Versione preliminare. Antonella Poggi. Dipartimento di informatica e Sistemistica Sapienza Università di Roma

Activation In sintesi: è inutile avere attivi degli oggetti se non vengono utilizzati

Programmazione Orientata agli Oggetti in Linguaggio Java

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Esercizi classi e array

UML Diagrammi delle classi. UML Diagramma classi 1

Definizione di classi con array di oggetti

Programmazione Orientata agli Oggetti in Linguaggio Java

Ottava Esercitazione. introduzione ai thread java mutua esclusione

Programmazione ad Oggetti: JAVA. Esercitazione

Oggetti Lezione 3. aspetti generali e definizione di classi I

Soluzioni degli esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo)

Gestione delle eccezioni in Java

Tipi astratti di dato e loro realizzazione in Java

Java Collection Framework. L14 JCF unina 1

Struttura di un programma Java. Package. Uso dei package

Fondamenti di Informatica C Esercitazioni di Laboratorio / 3 Outline

Esercizi sulla definizione di classi (Fondamenti di Informatica 1 Walter Didimo) Soluzioni

Main System Monitor Keyboard

Specifica i tipi di oggetti a creare, utilizzando un istanza prototipo, e crea nuove istanze tramite la copia di questo prototipo.

Finestra.java. static String nomicolonne[] = {"ind.","cognome","nome","telefono"," "}; //nomi delle colonne della tabella

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

Esercitazioni 7 e 8. Bounded Buffer con sincronizzazione Java (1)

Organizzazione della lezione. Lezione 18 Remote Method Invocation - 6. (con callback) L accesso al registry per il rebind()

Gestione delle Eccezioni

SOMMARIO Coda (queue): QUEUE. QUEUE : specifica QUEUE

Programmazione Java: Variabili membro, Metodi La parola chiave final

ARRAY E STRINGHE. G. Frosini Slide 1

Corso di Tecniche di Programmazione

Esempio: il conto bancario

Telematica II 15. Esercitazione/Laboratorio 5

Programmazione Java: Come contenere oggetti

Parola chiave extends

Prova d Esame Compito A

Programmazione CORBA in Java

Prova d Esame Compito B

Ingegneria del Software

Programmazione a Oggetti Lezione 10. Ereditarieta

Corso Base. ActionSMS. Maurizio Cozzetto, Francesco Sarasini

Flussi, lettori e scrittori

7 Esercitazione (svolta): Callback. Polling. Java RMI: callback. Server. Server. Client. Client. due possibilità:

UnicastRemoteObject. Massimo Merro Programmazione di Rete 103 / 124

Esempi di esercizi d esame

Transcript:

Università di Roma La Sapienza, Facoltà di Ingegneria Corso di PROGETTAZIONE DEL SOFTWARE (Ing. Gestionale) Giuseppe De Giacomo e Monica Scannapieco, A.A. 2003-04 SOLUZIONE ESAME DEL 11/07/2003 Roma, 9 marzo 2004 1 Diagramma delle classi UML 2

Diagramma e specifica degli use case //UML-usecase-diagram.txt _ _ /--------------\ - - ------------ Verifiche / \ Scene produttore \--------------/ InizioSpecificaUseCase VerificheScene metripellicola(s: Scena): reale pre: nessuna post: result e la somma dei metri di pellicola utilizzati complessivamente in tutti i ciak di tutti i setup della scena s dovesigira(s: Scena): stringa pre: nessuna post: result e la stringa che identifica la location se s e una scena in esterno o il teatro di posa se s e una scena in interno. FineSpecifica 3 Responsabilità sulle associazioni Dalla specifica dello use case e delle molteplicità minime nel diagramma delle classi emerge che: Scena ha responsabilità su relativo a Setup ha responsabilità su relativo a e su di ScenaInEsterno ha responsabilità su situata le altre classi non hanno responsabilità sulle associazioni. 4

Diagramma delle classi realizzativo 5 La classe Java TipoLinkRelativoA // File TipoLinkRelativoA.java public class TipoLinkRelativoA { //Rappr. componenti della tupla private final Scena lascena; private final Setup ilsetup; //Costruttore public TipoLinkRelativoA(Scena x, Setup y) { lascena = x; ilsetup = y; //Accesso alle componenti public Scena getscena() { return lascena; public Setup getsetup() { return ilsetup; //Overriding di funzioni speciali ereditate da Object //Nota TipoLinkRelativoA e un tipo non una classe: //va rdefinito equals per effettuare test di uguaglianza profonda public boolean equals(object o) { if (o!= null && getclass().equals(o.getclass())) { TipoLinkRelativoA b = (TipoLinkRelativoA)o; return b.lascena!= null && b.ilsetup!= null && b.lascena.equals(lascena) && b.ilsetup.equals(ilsetup); else return false; 6

La classe Java AssociazioneRelativoA // File AssociazioneRelativoA.java public class AssociazioneRelativoA { private AssociazioneRelativoA(TipoLinkRelativoA x) { link = x; private TipoLinkRelativoA link; public TipoLinkRelativoA getlink() { return link; public static void inserisci(tipolinkrelativoa y) { if (y.getscena()!= null && y.getsetup()!= null) { AssociazioneRelativoA k = new AssociazioneRelativoA(y); y.getscena().inseriscilinkrelativoa(k); y.getsetup().inseriscilinkrelativoa(k); public static void elimina(tipolinkrelativoa y) { if (y.getscena()!= null && y.getsetup()!= null) { AssociazioneRelativoA k = new AssociazioneRelativoA(y); y.getscena().eliminalinkrelativoa(k); y.getsetup().eliminalinkrelativoa(k); 7

L interfaccia Java SupportoAssociazioneRelativoA public interface SupportoAssociazioneRelativoA { void inseriscilinkrelativoa(associazionerelativoa a); void eliminalinkrelativoa(associazionerelativoa a); 8 // File Scena.java import java.util.*; La classe Java Scena abstract public class Scena implements SupportoAssociazioneRelativoA { //Rappr. attributi private final String id; private final String descrizione; //Rappr. associazione "relativo_a" private Set insieme_link; //Costruttore protected Scena(String i, String d) { id = i; descrizione = d; insieme_link = new InsiemeArrayOmogeneo(TipoLinkRelativoA.class); //Accesso agli attributi public String getid() { return id; public String getdescrizione() { return descrizione; //Accesso alla associazione "relativo_a" public boolean verificamoltminrelativoa() { return insieme_link.size() > 0; public Iterator getlinkrelativoa() { 9

if (verificamoltminrelativoa() == false) throw new RuntimeException( "Scena: partecipazione obbligatoria in relativo_a violata"); return insieme_link.iterator(); public void inseriscilinkrelativoa(associazionerelativoa a) { if (a!= null && a.getlink().getscena() == this) insieme_link.add(a.getlink()); else throw new RuntimeException("Inserimento impossibile!"); public void eliminalinkrelativoa(associazionerelativoa a) { if (a.getlink()!= null) insieme_link.remove(a.getlink()); else throw new RuntimeException("Eliminazione impossibile!"); //Overriding delle funzione speciali (cioe solo tostring) public String tostring() { return "Scena " + id + ", " + descrizione; // File Setup.java import java.util.*; La classe Java Setup public class Setup implements SupportoAssociazioneRelativoA { //Rappr. attributi private final String id; private final String parametri_ripresa; //Rappr. associazione "relativo_a" private TipoLinkRelativoA relativo_a; //Rappr. associazione "di" private Set insieme_ciak; //Costruttore public Setup(String i, String pr) { id = i; parametri_ripresa = pr; insieme_ciak = new InsiemeArrayOmogeneo(Ciak.class); //Accesso agli attributi public String getid() { return id; public String getparametriripresa() { return parametri_ripresa; //Accesso alla associazione "relativo_a" public boolean verificamoltminrelativoa() { return parametri_ripresa!= null; 10

public TipoLinkRelativoA getlinkrelativoa() { if ( verificamoltminrelativoa() == false) throw new RuntimeException( "Setup: partecipazione obbligatoria in relativo_a violata"); return relativo_a; public void inseriscilinkrelativoa(associazionerelativoa a) { if (a!= null && a.getlink().getsetup() == this && relativo_a == null) relativo_a = a.getlink(); else throw new RuntimeException("Inserimento impossibile!"); public void eliminalinkrelativoa(associazionerelativoa a) { if (a!= null && relativo_a.equals(a.getlink())) relativo_a = null; else throw new RuntimeException("Eliminazione impossibile!"); //Accesso alla associazione "di" public boolean verificamoltminciak() { return insieme_ciak.size() > 0; public Iterator getciak() { if (verificamoltminciak() == false) throw new RuntimeException( "Scena: partecipazione obbligatoria in relativo_a violata"); return insieme_ciak.iterator(); public void inserisciciak(ciak c) { if (c!= null) insieme_ciak.add(c); public void eliminaciak(ciak c) { if (c!= null) insieme_ciak.remove(c); //Overriding delle funzione speciali (cioe solo tostring) public String tostring() { return "Setup " + id + ", " + parametri_ripresa;

La classe Java Ciak // File Ciak.java public class Ciak { //Rappr. attributi private final int num; private final double metripellicola; private final String bobina; //Costruttore public Ciak(int n, double m, String b) { num = n; metripellicola = m; bobina = b; //Accesso agli attributi public double getnum() { return num; public double getmetripellicola() { return metripellicola; public String getidbobina() { return bobina; 11 La classe Java ScenaInInterno // File ScenaInInterno.java public class ScenaInInterno extends Scena { private final String idteatroposa; public ScenaInInterno(String i, String d, String t) { super(i,d); idteatroposa = t; public String getidteatroposa() { return idteatroposa; 12

// File ScenaInEsterno.java La classe Java ScenaInEsterno public class ScenaInEsterno extends Scena { private final boolean notturno; private Location loc; public ScenaInEsterno(String i, String d, boolean b) { super(i,d); notturno = b; public boolean getestnotturno() { return notturno; public boolean verificamoltminlocation() { return loc!= null; public Location getlocation() { if (verificamoltminlocation() == false) throw new RuntimeException( "ScenaInEsterno: partecipazione obbligatoria in situata violata"); return loc; public void setlocation(location l) { loc = l; 13 La classe Java Location // File Location.java public class Location { //Rappr. attributi private final String nome; private final String luogo; private final String descrizione; //Costruttore public Location(String n, String l, String d) { nome = n; luogo = l; descrizione = d; //Accesso agli attributi public String getnome() { return nome; public String getluogo() { return luogo; public String getdescrizione() { return descrizione; 14

Realizzazione in Java dello use case // File VerificheScene.java import java.util.*; public class VerificheScene { public static double metripellicola(scena s) { double ris = 0; Iterator it = s.getlinkrelativoa(); while(it.hasnext()) { TipoLinkRelativoA t = (TipoLinkRelativoA)it.next(); Iterator it2 = t.getsetup().getciak(); while(it2.hasnext()) { Ciak c = (Ciak)it2.next(); ris = ris + c.getmetripellicola(); return ris; /* public static String dovesigira(scena s) { if (ScenaInInterno.class.isInstance(s)) return ((ScenaInInterno)s).getIdTeatroPosa(); else return ((ScenaInEsterno)s).getLocation().getLuogo(); */ public static String dovesigira(scena s) { if (s instanceof ScenaInInterno) 15 return ((ScenaInInterno)s).getIdTeatroPosa(); else return ((ScenaInEsterno)s).getLocation().getLuogo();

InsiemeArray //Realizzazione dell interfaccia Set con un array invece che con una lista import java.util.*; import java.lang.reflect.array; public class InsiemeArray implements Set, Cloneable { // campi dati protected Object[] array; protected static final int diminit = 10; //dim. iniz. array protected int cardinalita; // costruttori public InsiemeArray() { array = new Object[dimInit]; cardinalita = 0; // funzioni proprie della classe // (realizzazione delle funzioni di Set) // basic operations public int size() { return cardinalita; public boolean isempty() { 16 return cardinalita == 0; public boolean contains(object e) { return appartiene(e); public boolean add(object e) { if (appartiene(e)) return false; else { if (cardinalita == array.length) {// raddoppia array Object[] aux = new Object[array.length*2]; for(int i = 0; i < array.length; i++) aux[i] = array[i]; array = aux; array[cardinalita] = e; cardinalita++; return true; public boolean remove(object e) { if (!appartiene(e)) return false; else { int k = 0; // trova l elemento while (!array[k].equals(e)) k++; for(int i = k; i < cardinalita-1; i++) // sposta di una poss array[i] = array[i+1]; // verso il basso gli // elementi dell array

cardinalita--; // rimpicciolisci l array se e il caso if (cardinalita > diminit && cardinalita < array.length/3) { Object[] aux = new Object[array.length/2]; for(int i = 0; i < cardinalita; i++) aux[i]=array[i]; array = aux; return true; public Iterator iterator() { return new IteratorInsiemeArray(this); // bulk operations public boolean containsall(collection c) { Iterator it = c.iterator(); while (it.hasnext()) { Object e = it.next(); if (!contains(e)) return false; return true; public boolean addall(collection c){ throw new UnsupportedOperationException("addlAll() non e supportata"); public boolean removeall(collection c) { throw new UnsupportedOperationException("removeAll() non e supportata"); public boolean retainall(collection c) { throw new UnsupportedOperationException("retainAll() non e supportata"); public void clear() { throw new UnsupportedOperationException("clear() non e supportata"); // array operations public Object[] toarray() { Object[] a = new Object[size()]; int i = 0; Iterator it = iterator(); while (it.hasnext()) { a[i] = it.next(); i++; return a; public Object[] toarray(object[] a) { if (a.length < size()) { //prendi il tipo degli elementi di a Class elemclass = a.getclass().getcomponenttype(); //costruisci un array il cui tipo degli elementi e quello in a a = (Object[])Array.newInstance(elemClass,size()); //riempi l array con gli elementi della collezione int i = 0;

Iterator it = iterator(); while (it.hasnext()) { a[i] = it.next(); i++; for (; i < a.length; i++) a[i] = null; return a; // funzioni speciali ereditate da Object public boolean equals(object o) { if (o!= null && getclass().equals(o.getclass())) { InsiemeArray ins = (InsiemeArray)o; if (cardinalita!= ins.cardinalita) return false; // ins non ha la cardinalita giusta else { // verifica che gli elementi nella lista siano gli stessi for(int i = 0; i < ins.cardinalita; i++) if (!appartiene(ins.array[i])) return false; return true; return false; public Object clone() { try { InsiemeArray ins = (InsiemeArray) super.clone(); ins.array = new Object[array.length]; for(int i = 0; i < cardinalita; i++) ins.array[i]=array[i]; return ins; catch(clonenotsupportedexception e) { throw new InternalError(e.toString()); public String tostring() { String s = "{ "; for(int i = 0; i < cardinalita; i++) s = s + array[i] + " "; s = s + ""; return s; // funzioni ausiliarie protected boolean appartiene(object e) { for(int i = 0; i < cardinalita; i++) if (array[i].equals(e)) return true; return false;

import java.util.*; IteratorInsiemeArray class IteratorInsiemeArray implements Iterator { // nota non e pubblica, cioe ne impediamo l uso diretto da parte // dei clienti (che quindi possono usare solo l interfaccia Iterator) private InsiemeArray insiemearray; private int indice; public IteratorInsiemeArray(InsiemeArray ia) { insiemearray = ia; indice = 0; // Realizzazione funzioni di Itarator public boolean hasnext() { return indice < insiemearray.cardinalita; public Object next() { Object e = insiemearray.array[indice]; indice++; return e; public void remove() { throw new UnsupportedOperationException("remove() non e supportata"); 17