Programmazione a Oggetti Modulo B UML Dott. Alessandro Roncato 11/10/2011 Le associazioni tra classi Prendono spunto dalle relazioni tra oggetti del mondo reale (per esempio Prodotto appartiene a un Lotto), ma nella modellazione a oggetti denotano principalmente il fatto che dall'oggetto Prodotto è possibile “conoscere” l'oggetto Lotto al quale appartiene. 2 UML Uml è un linguaggio visuale semiformale Permette di “abbozzare” delle soluzioni per vedere cosa manca Useremo per fare una “bozza” del progetto Diagramma delle classi visualizza le classi, le estensioni e le associazioni Vista statica del progetto 3 Diagramma UML classi (parziale) * 1 Prodotto Lotto Associazioni Scontrino 4 Diagramma UML classi (parziale) Prodotto Is-a Elettrodomestico Estensione ... Alimentare 5 Che campi nelle classi? I campi (o variabili d'istanza) delle classi devono permettere di rappresentare l'oggetto stesso Esempio: per rappresentare un Prodotto, ci dovrebbe essere il nome del prodotto, il codice, il prezzo etc. Java Bean, i campi sono privati, quindi sono un dettaglio implementativo, si stabiliscono quali sono le proprietà delle classi 6 Che metodi nelle classi I metodi devono permettere di usare in maniera semplice l'oggetto stesso; Ogni metodo (che non sia get e set) dovrebbe avere il nome di un verbo ed eventualmente un complemento: Esempio: stampa, calcolaTotale Il verbo è imperativo o passivo (l'oggetto esegue il comando o subisce l'azione) 7 Esempio • In linguaggio naturale nell'applicazione il Negoziante emette uno Scontrino relativo a una Spesa/Carrello di un Cliente. • In Java la classe Carrello ha un metodo emettiScontrino (con eventualmente parametro di tipo Cliente). 8 Che metodi nelle classi Generalmente non è bene che un metodo abbia il nome composto da due verbi: es. CalcolaEStampa Significa che probabilmente fa 2 cose distinte, meglio invece avere 2 metodi distinti: il metodo Calcola e il metodo Stampa (Vedremo casi in cui ha senso avere 2 verbi) 9 Che metodi nelle classi Semplici da usare: Nome individua chiaramente la funzione Pochi parametri: quelli indispensabili per dare senso al metodo Altri parametri possono essere “impostati” grazie lo stato dell'oggetto: Invece che avere o.stampa(testo, position, font, size, color, shadow, threeDim, rotate) Meglio un metodo o.stampa(testo, position) e gli altri parametri impostabili con altri metodi tipo o.setFont(font) da invocare prima di o.stampa 10 Che metodi nelle classi Avere pochi metodi pubblici aumenta l'indipendenza Ma quali sono i metodi che sono necessari e pubblici? Diagrammi di sequenza permettono di “trovare” i metodi necessari 11 Diagrammi di sequenza Scopo dei diagrammi di sequenza è illustrare come oggetti diversi collaborano per risolvere un certo problema. In pratica, illustrano la sequenza di invocazioni dei diversi metodi nei diversi oggetti per un certa interazione dell'utente 12 Esempio Diagramma di sequenza che descrive come gli oggetti collaborano quando il bibliotecario concede un libro in prestito Lo scopo è “ipotizzare” come potrebbe avvenire la collaborazione I diagrammi vengono usati come strumento veloce per schematizzare il “funzionamento” 13 Diagramma di sequenza Carrello Prodotto Cliente *totale+=p.getPrezzo() sconto=c.getSconto() new Scontrino(prodotti,cliente,totale) Scontrino *venduto() aggiungiPunti(totale) 14 Aggiornamento Diagramma classi Prodotto 1 * Lotto getPrezzo() venduto(Utente) Carrello Scontrino Cliente getSconto 15 Diagramma di sequenza Carrello Prodotto Cliente *totale+=p.getPrezzo() sconto=c.getSconto() new Scontrino(prodotti,cliente,totale) Scontrino *venduto() aggiungiPunti(scontrino) 16 Diagramma di sequenza Carrello new Scontrino(prodotti,cliente,carrello) Prodotto Cliente Scontrino *totale+=p.getPrezzo() sconto=c.getSconto() *venduto() aggiungiPunti(scontrino) 17 Aggiornamento Diagramma classi Prodotto 1 * Lotto getPrezzo() venduto(Utente) \ Carrello Scontrino Cliente getSconto() 18 setTotale??? Serve il metodo setTotale nella classe Scontrino? Nell'approccio a oggetti è preferibile che la classe Scontrino che calcola da sola il totale dello scontrino sia l'unica che possa impostare il relativo totale nello scontrino stesso (ad esempio se il carrello potesse impostare tale totale dovrebbe anche accedere al Cliente per calcolare lo sconto etc.) Mentre getTotale non crea problemi di questo tipo 19 setTotale??? Inoltre i metodi pubblici devono agire sull'oggetto lasciando in uno stato consistente l'oggetto stesso. Cosa significherebbe uno scontrino con dei prodotti e un totale che non ha niente a che vedere con i prodotti stessi? 20 Diagramma casi d'uso Servono per capire quali sono le interazioni dell'utente con l'applicazione Nel nostro caso possiamo avere due ruoli per gli utenti ovvero: Responsabile e Cassiere Un caso d'uso rappresenta una singola interazione 21 Elenco Casi d'uso 22 Diagramma casi d'uso Attori (ruoli) sono soggetti esterni all'applicazione che stiamo descriveno (generalmente persone ma potrebbero essere sistemi/applicazioni esterne) Casi d'uso: rappresentano una azione atomica gestita dall'applicazione. I casi d'uso non corrispondono alle funzionalità: 1 funzionalità-> più casi d'uso 23 Come procedere Abbozzare il diagramma delle classi Elencare tutti casi d'uso Abbozzare i diagrammi di sequenza per ogni casi d'uso Aggiornare e completare il diagramma delle classi: Elencare i metodi Eventualmente aggiungere le classi mancanti 24 Come procedere 2 Lasciare da parte i problemi di interazione con la grafica o il parser. I diagrammi faranno quindi riferimento al “Modello” del Negozio Utilizzare Carta e matita per disegnare i diagrammi (NON usare applicazioni) 25 Prossimamente Come collegare l'interazione con l'utente nel nostro modello Come gestire i diversi comportamenti dei Prodotti (Polimorfismo) Come creare gli oggetti Come gestire oggetti singoli 26 Varie Per lo sviluppo del progetto è possibile usare qualsiasi IDE; In laboratorio sono disponibili solo Netbeans, Eclipse e Jedit. Nota che Netbeans, Eclipse e Jedit sono disponibili su tutte le piattaforme (Win, Mac, e Linux) Per evitare problemi di compatibilità gli esempi di codice saranno indipendenti dalle piattaforme 27 Varie Gli studenti che hanno già superato MP che debbono fare l’integrazione per PO devono implementare lo stesso progetto degli altri Gli studenti che debbono sostenere MP e che hanno 1 credito già riconosciuto e quindi devono integrare solamente 2 crediti dovranno progettare l'intera applicazione tramite diagrammi UML e l'implementarne la metà delle classi. 28 Varie Gli studenti che debbono sostenere MP e che hanno 2 crediti già riconosciuti e quindi devono integrare solamente 1 credito dovranno progettare l'intera applicazione tramite diagrammi UML In tutti e tre i casi (credito 0 integrazione 3, credito 1 integrazione 2, credito 2 integrazione 1) orale obbligatorio 29