cerca
Ingegneria del Software - Appunti del 7.4.09
modifica cronologia stampa login logout

Wiki

UniCrema


Materie per semestre

Materie per anno

Materie per laurea


Help

Uni.IDS-7Aprile History

Hide minor edits - Show changes to markup

Deleted lines 3-4:

Appunti in presa diretta: pagina da sistemare:)

Changed line 143 from:

Per presentare il progetto di IDS, occorre usare un tool come appunto Bouml, e presentare tutti i diagrammi. Se in Bouml clicco col destro sul foglio di lavoro di un qualsiasi diagramma, mi permette di salvare l'immagine nel formato che vogliamo, così che possiamo prendere l'immagine e metterla in un file etc.

to:

Per presentare il progetto di IDS, occorre usare un tool come appunto Bouml, e presentare tutti i diagrammi. Se in Bouml clicco col destro sul foglio di lavoro di un qualsiasi diagramma, posso salvare quell'immagine nel formato che vogliamo, oppure salvarla negli appunti, e riutilizzarla quindi per comporre la relazione.

Changed lines 79-99 from:

Sequence diagram

Evidenziano la sequenza temporale delle azioni, ma non le relazioni tra oggetti.

Oggetti = box i n alto, con un nome sottolineato e una linea verticale detta linea di vita, che rappresenta il tempo durante il quale l'oggetto rimane in esecuzione. Può anche contenere il nome della classe di cui è istanza.

Il messaggio è una cfreccia con un'etichetta che esce da un oggetto, e può anche tornare su se stesso.
Messaggio sincrono = freccia continua, con su scritta l'operazione che viene richiamata, e il chiamate rimane in attesa della risposta.
Messaggio asincrono = freccia tratteggiata. Il chiamante continua nella sua esecuzione anche se il chiamato non ha risposto. Quando risponde, c'è la freccia di Ritorno.

Ritorno = un valore restituito al chiamante e non un oggetto chiamante.

Intervallo di tempo = box rettangolare che indica la vita.

X = quando il nostro oggetto viene cancellato dalla memoria

Condizione = definita tra parentesi []: asociata ad un messaggio, che viene generato solo se quelle condizioni sono soddisfatte.

Iterazioni = inoltrare un messaggio più volte

I diagrammi di sequenza ci permettono di vedere la sequenzialità dei messaggi, e quando gli oggetti vengono distrutti.

to:

Sequence diagram

I sequence diagram evidenziano la sequenza temporale delle azioni, ma non le relazioni tra oggetti.

Gli oggetti si rappresentano con dei box, disegnati in alto, con il nome sottolineato e opzionalmente anche il nome della classe di cui è istanza. Sotto di essi parte una linea di vita, che rappresenta il tempo che scorre, nel quale l'oggetto prenderà vita e morirà.

Lungo la linea di vita si mettono dei box rettangolari che rappresentano l'intervallo di tempo in cui l'oggetto sarà esistente. In questo modo è possibile vedere subito a che punto della storia un oggetto prende vita, e quando se ne va.

X = quando il nostro oggetto viene cancellato dalla memoria (???)

Il messaggio è una freccia etichettata che esce dal box vitale di un oggetto, e si può dirigere verso un altro box verticale, oppure tornare su se stesso. Ci sono due tipi di messaggi:

  • messaggio sincrono: rappresentato da una freccia continua etichettata con il nome dell'operazione che viene chiamata, indica che il chiamante rimane in attesa della risposta da parte del chiamato
  • messaggio asincrono: indicato con una freccia tratteggiata, significa che il chiamante continua nella sua esecuzione anche se il chiamato non ha risposto.

Nel caso dei messaggi asincroni l'eventuale messaggio di risposta viene esplicitamente segnato con una freccia che va dall'oggetto chiamato all'oggetto chiamante. I messaggi sincroni invece non obbligano a tracciare anche la relativa risposta, perché la si assume come scontata (teniamo conto che al 99% rappresentano chiamate di funzioni, e quindi ritornano sicuramente).

L'etichetta posta sopra queste frecce contiene il nome dell'operazione che il chiamante vuole far fare al chiamato. Come dicevamo sopra in merito al diagramma delle classi, l'operazione fa parte dell'interfaccia pubblica di un oggetto. Dal momento che questo diagramma e quelli che seguono vengono generati a partire dalla stessa vista, la Class View che abbiamo visto sopra, Bouml terrà in memoria la descrizione di ogni oggetto, e ci fornirà degli hint ogni qualvolta faremo appello a operazioni o attributi o classi o oggetti già disegnati in qualche altro diagramma della stessa vista.

Un messaggio può anche avere una condizione, che viene scritta tra parentesi quadre. Significa che il messaggio sottostante viene generato solo se quella condizione è soddisfatte.

Changed lines 98-140 from:

Vogliamo specificare un servizio in cui un ut ente manda un ordine verso un sistema di vendita online. L'Ordine è composto da varie linee di prodotti, e ogni linea controlla il suo articolo Se è disponibile in magazzino, bene, se no male.

Per creare una diagramma di sequenza, si clicca sul destro sul Class Diagram creato prima, e si sceglie Sequence Diagram

Il terzo pulsante è "Add Instance" e ci permette di aggiungere un'istanza di qualcosa. Creerà automaticamente il quadrato e le linee verticali.

Le frecce di messaggi sono le freccie piene: partono da una linea del tempo ed arrivano ad un'altra. Bouml crea automaticamente anche i box di vita. Doppio clic sulla linea e ci permette di specificarne le proprietà. Dato che le linee rappresentano operazioni chiamate, occorre cliccare, nel menu contestuale appena apparso, su "Message" e scegliere "Create operation and choose it".

Le condizioni, nella versione provata in classe, non sono esprimibili direttamente: suppliamo a questa carenza utilizzando il pulsante "ABC" e creando una label con opportune parentesi quadre, e si mettono poi queste etichette sopra i messaggi.

Collaboration Diagram

E' un altro modo di specificare il Sequence Diagram, in cui gli oggetti non sono più in linee verticali, ma collegati da frecce. Si modella solo la sequenza di messaggi, e non più lo scorrere del tempo. I messaggi sono numerati proprio per la sequenza temporale. Sono un po' meno espliciti dei diagrammi di sequenza, ed in effetti se faccio un diagramma di sequenza quello di collaborazione non è necessario.

In Bouml, per creare un nuovo C.D. si crea un "New Communication Diagram" (ocio: non collaboration) cliccando col destro sulla mia class view.

Anche qui si creano gli oggetti premendo il pulsante con due linee in mezzo, che crea istanze di oggetti. Per ricreare la situazione dell'esercizio precedente, creiamo un ClientWeb, un Ordine, una LineaOrdine e un Articolo.

I link si creano con le linee continue. Doppiocliccando su una linea posso aggiungere messaggi, indicando anche la loro direzione. Con l'archetto si introducono auto-messaggi. Nel nostro caso si usa questo sistema per modellare il fatto che, se manca un articolo, questo va comprato dal fornitore.

Bouml mette automaticamente i numeri man mano che creiamo operazioni. Siccome abbiamo già creato il Class Diagram, avremo già gli hint per i nomi delle Istance e per i nomi delle operazioni. In effetti sono cose collegate.

Activity Diagram

Modellano il workflow dei processi in caso di computazione parallela. Sono stati inseriti in UML 2.0, e sono simili agli automi a stati.

Il componente principale è l'ATTIVITA', che modella qualsiasi cosa il nostro sistema faccia. E' il fare qualcosa. Sono rappresentate da ovali.

Le transizioni ci permettono di passare da un'attività ad un'altra. Si attivano quando tutto ciò che l'attività comporta è stato completato. Si dice che le transizioni scattano con il completion event. E' una modellazione concettuale, però dà l'idea di che cosa accade nel nostro processo.

Si può associare un AD ad una singola classe, a una singola operazione di una classe, ad un Use Case. insomma, è molto generico.

Lo stato iniziale è il pallino nero. Lo stato finale è il pallino nero cerchiato da una corona.

Branch = rombo, e ogni ramo uscente è etichettato con una condizione. Il workflow prenderà il ramo a seconda della condizione. non possono valere entrambe le condizioni. Dopo il branch, occorre un merge (un altro rombo) che chiuda il ciclo condizionale.

Il fork permette l'esecuzione parallela: una lina nera spessa con una linea entrante e più linee uscente: vuol dire che si attivano più processi.

Il join invece deve sempre corrispondere ad una fork, e ricongiunge più processi entranti in un'unica freccia uscente.

OCIO: ad ogni fork deve corrispondere un join!

Il problema di sti diagrammi è che dicono COSA succede, ma non CHI lo fa. Si creano allora le swimlanes, che sono linee verticali che assomigliano alle corsie delle piscine. Sono etichettate con il nome di un attore, e servono per specificare la responsabilità delle varie azioni all'interno di un processo. I vari fork etc. porteranno ad una sequenza in un'altra swimlanes, ad esempio.

to:

Vogliamo specificare un servizio in cui un utente manda un Ordine verso un sistema di vendita online. L'Ordine è composto da varie Linee di prodotti, e ogni Linea controlla il proprio Articolo. Se questo è disponibile in magazzino, l'ordine può essere spedito, altrimenti automaticamente il sistema provvede a procurarsene uno dal fornitore.

Per creare una diagramma di sequenza, si clicca sul destro sulla Class View creata prima, e si sceglie New Sequence Diagram.

Nella finestra del diagramma di sequenza, il terzo pulsante della barra degli strumenti è "Add Instance", e ci permette di aggiungere un'istanza di una classe (si diceva prima dello stretto legame tra diagrammi diversi all'interno dello stesso progetto). Bouml creerà automaticamente il quadrato e le linee verticali.

Le frecce di messaggi sono le freccie piene: partono da una linea del tempo ed arrivano ad un'altra. Bouml crea automaticamente anche i box di vita, i quali si possono ridimensionare a dispiacimento. Un doppio clic sulla linea ci permette di specificarne le proprietà. Dato che le linee rappresentano richieste di operazioni chiamate, se queste non sono già state specificate in qualche altro diagramma occorre cliccare, nel menu contestuale appena apparso, sul pulsante Message e scegliere Create operation and choose it. Questa operazione sarà poi visibile anche altrove, in relazione alla stessa classe.

Le condizioni, nella versione di Bouml provata in classe, non sono esprimibili direttamente: suppliamo a questa carenza utilizzando il pulsante ABC e creando una label con opportune parentesi quadre, posizionandola accortamente sopra i messaggi.

Collaboration Diagram

È un altro modo di specificare il Sequence Diagram, in cui però gli oggetti non sono più rappresentati nel tempo ma solo collegati da frecce. Si modella quindi solo la sequenza dei messaggi, e proprio per questo i messaggi sono numerati nell'ordine della loro apparizione temporale. Sono un po' meno espliciti dei diagrammi di sequenza, ed in effetti se faccio un diagramma di sequenza quello di collaborazione spesso non è affatto necessario.

In Bouml, per creare un nuovo Collaboration Diagram si crea un New Communication Diagram (ocio: communication, non collaboration) cliccando col destro sulla mia Class View.

Anche qui si inseriscono nuovi oggetti premendo il pulsante con due linee in mezzo. Per ricreare la situazione dell'esercizio precedente, creiamo un ClientWeb, un Ordine, una LineaOrdine e un Articolo.

I link si rappresentano con le linee continue. Doppiocliccando su una linea posso aggiungere messaggi, indicando anche la loro direzione. Con l'archetto si introducono auto-messaggi. Nell'esempio dell'Ordine si usa un loop per modellare il fatto che, se manca un articolo, questo va comprato automaticamente dal fornitore.

Bouml mette automaticamente i numeri man mano che creiamo operazioni. Siccome abbiamo già creato il Class Diagram, avremo già gli hint per i nomi delle classi e delle operazioni.

Activity Diagram

Modellano il workflow dei processi in caso di computazione parallela. Questi diagrammi sono stati inseriti in UML 2.0, e sono simili agli automi a stati. Una loro descrizione completa è stata affrontata nel corso di Linguaggi di Programmazione per la Sicurezza.

Il componente principale è l'attività, il "fare qualcosa", che modella qualsiasi cosa il nostro sistema faccia. Un'attività è un ovaloide, nel diagramma.

Le transizioni ci permettono di passare da un'attività ad un'altra. Si attivano quando tutto ciò che l'attività comporta è stato completato, e pertanto si dice che le transizioni scattano con il completion event.

L'Activity Diagram è una modellazione concettuale, e per questo motivo può essere usato per modellare un po' tutto: il workflow all'interno di una singola classe, il workflow di un processo, il piano segreto per l'eliminazione della spia russa e così via.

Lo stato iniziale è il pallino nero. Lo stato finale è il pallino nero cerchiato da una corona.

Le branch sono suddivisioni logiche del nostro processo. Si disegnano con dei rombi, e ogni ramo uscente è etichettato con una condizione. Il processo seguirà il ramo la cui condizione è soddisfatta. Non possono pertanto esistere condizioni che siano valide entrambe contemporanemanete, nello stesso rombo. Dopo il branch, occorre un merge (un altro rombo), il quale serve per riunificare il mio processo.

Il fork permette l'esecuzione parallela: una linea nera spessa con una linea entrante e più linee uscenti mi dice che in quel punto il mio processo attiva diverse sottoprocessi paralleli. Il join invece deve sempre corrispondere ad una fork, e indica il ricongiungimento dei sottoprocessi nel flusso principale.
Attenzione: ad ogni fork deve sempre corrispondere un join! Inoltre, il join farà proseguire il processo solo quando tutti i sottoprocessi entranti saranno terminati.

Il problema di questi diagrammi è che dicono COSA succede, ma non CHI lo fa. Si creano allora le swimlanes, che sono linee verticali che assomigliano alle corsie delle piscine. Sono etichettate con il nome di un attore, e servono per specificare la responsabilità delle varie azioni all'interno di un processo. I vari fork etc. porteranno ad una sequenza in un'altra swimlanes. Nelle pagine di LPS sono spesso indicati con linee orizzontali tratteggiate, e sono state fatte osservazione in merito alla possibilità di sincronizzare questi processi paralleli.

Changed line 138 from:

Si crea una "new state machine" dalla mia Class View, e poi ancora tasto destro per creare "New State Diagram".

to:

Si crea una "New state machine" dalla solita Class View, ma poi occorre ancora usare il tasto destro per creare un New State Diagram.

Changed line 16 from:

Casi d'uso

to:

Casi d'uso

Changed line 44 from:

Diagramma delle classi

to:

Diagramma delle classi

Changed lines 65-78 from:

Esami: sostenuti da uno studente.
Corsi: frequentati da uno studente.
Frequenze: associazione tra Esami e Corsi.
In Bouml, tasto destro su progetto e "new class view". Poi ancora tasto destro sulla vista appena creata, e tasto destro su "new class diagram". Doppio clic sul class diagram e vi apre la vista.

Il primo pulsante crea una classe. Premendo col destro su di una classe appare un menu contestuale che ci permette di aggiungere attributi o metodi. Ogni volta che aggiungiamo un attributo o un metodo possiamo scegliere tipo, parametri in ingresso, etc. Attenzione: abbiamo scelto come linguaggio Java, pertanto tutte queste scelte saranno Javose.

Aggiungiamo le classi Docente e Studente. In Studente mettiamo l'attributo Matricola, come int.

L'associazione tra Studente e Persona è la freccia vuota: ereditarietà. In Bouml si chiama "generalization", e va da ereditiera a superclasse.

Creiamo il Corso. La relazione tra docente e corso è generica -> linea nera senza frecce. Poi, doppio clic su questa linea e possiamo specificare il tipo di relazione. Possiamo scegliere il tipo di relazione per ogni capo della freccia: in Docenti, la relazione è "insegna", mentre dal lato del corso la relazione è "tenuto da". Scegliamo anche la molteplicità.

to:
  • Esami: sostenuti da uno studente.
  • Corsi: frequentati da uno studente e tenuti da un professore.
  • Frequenze: associazione tra Esami e Corsi.

Per ottenere un diagramma delle classi in Bouml, si clicca col tasto destro su progetto e si sceglie New class view. Poi, ancora tasto destro sulla vista appena creata, e si seleziona New class diagram. Doppio clic sul class diagram, comparso nella colonna a sinistra, e si aprirà la vista di questo diagramma.

Il primo pulsante della barra strumenti di questa finestra crea una classe. Premendo col destro su di una classe appare un menu contestuale che ci permette di aggiungere attributi o metodi. Ogni volta che aggiungiamo un attributo o un metodo possiamo scegliere tipo, parametri in ingresso, etc. Avendo scelto come linguaggio Java, pertanto tutte queste scelte saranno Javose.

Aggiungiamo le classi Docente e Studente. In Studente mettiamo l'attributo matricola, e assegniamogli un tipo, se vogliamo.

L'associazione tra Studente e Persona è la freccia con triangolo vuoto: c'è ereditarietà. In Bouml si chiama generalization

Creiamo il Corso. La relazione tra docente e corso è generica, e quindi per rappresentarla ci basta la linea nera senza frecce. Facendo doppio clic su questa linea appare un menu contestuale in cui possiamo specificare il tipo di relazione per ogni capo della freccia: in questo caso, avremo due parti nel menu contestuale: una sezione in Docente, e una sezione in Corso. Dal lato del Docente, la relazione è insegna, mentre dal lato del corso la relazione è tenutoDa. Scegliamo anche la molteplicità, che che in questo caso è 1 dalla parte del Docente, e 1..* dalla parte del Corso (vuol dire che 1 docente può tenere uno o più corsi).

Changed lines 11-12 from:

Per chiedere informazioni su Bouml, o chiedergli informazioni sul proprio progetto o cose del genere, questa è l'email. Accetta anche appuntamenti per discutere di questi temi.

to:

Per chiedere informazioni su Bouml, o chiedergli informazioni sul progetto che si dovrà portare a complemento dell'esme di IDS, o cose del genere, questa è l'email. Accetta anche appuntamenti per discutere di questi temi.

Added lines 14-15:

Bouml è un software che permette di tracciare tutti i tipi di diagrammi UML. La versione che si trova in \\titano è la 4.3.qualcosa, mentre lo sviluppo è arrivato alla 4.12.1. La motivazione ufficiale è che pare che gli antivirus rilevino del software malevolo all'interno degli zip della distribuzione di Bouml, e quindi per precauzione, anche se probabilmente si tratta di un falso allarme, in laboratorio è presente solo la 4.3. È possibile decomprimere la cartella direttamente sul drive Z: e divertirsi da lì.

Changed lines 17-25 from:

Gli attori sono omini, e si possono definire gerarchie di attori. Il caso d'uso in sé è invece indicato da palle gialle.

Ogni palla rappresenta una specifica funzionalità del caso d'uso, e sono collegate da frecce.

<<include>> = mostra il comportamento comune a uno o più casi d'uso. Eg: identificarsi al bancomat include sia prelevare che saldo. Vuol dire che sia prelevare che saldo avranno comportamenti comuni, ovvero identificarsi al bancomat.
E' un esempio di riutilizzo del software, perché la procedura di autenticazione viene scritta una volta sola ed usata in diversi punti..

<<extend>> = mostra il comportamento opzionale (alternativo o relativo al trattamento di condizioni anomale).

to:

Facciamo un po' di ripasso sui casi d'uso.

Gli attori sono rappresentati da omini, e si possono definire gerarchie di attori. Il caso d'uso in sé è invece indicato da palle gialle. Ogni palla rappresenta una specifica funzionalità del caso d'uso, e le palle sono collegate da frecce.

Le frecce possono avere una semantica differente:

  • <<include>> = mostra il comportamento comune a uno o più casi d'uso. Eg: identificarsi al bancomat include sia prelevare che saldo. Vuol dire che sia prelevare che saldo avranno comportamenti comuni, ovvero identificarsi al bancomat. E' un esempio di riutilizzo del software, perché la procedura di autenticazione viene scritta una volta sola ed usata in diversi punti..
  • <<extend>> = mostra il comportamento opzionale (alternativo o relativo al trattamento di condizioni anomale).
Changed lines 28-32 from:

Bouml: Project | New => si sceglie il file da salvare.
Poi si deve scegliere il Language, cioè il linguaggio di programmazione, nel nostro caso Java.

Per creare il diagramma dei casi d'uso, si clicca col destro sul progetto e si sceglie new use case view. Poi, su questa vista, si clicca ancora col destro e si sceglie new use case.

to:

In Bouml, scegliamo Project | New e diamo il nome del file da salvare. Fatto questo, occorre selezionare dal menu Language il linguaggio di programmazione del progetto, nel nostro caso Java. A seconda del linguaggio scelto alcune opzioni saranno diverse.

Per creare il diagramma dei casi d'uso, si clicca col destro sul progetto e si sceglie New use case view. Poi, su questa vista, si clicca ancora col destro e si sceglie New use case.

In generale, con Bouml occorre prima creare una vista, e poi un diagramma collegato a quella vista.

Changed lines 38-42 from:

Se vogliamo anche modellare una ricevuta, creiamo un altra palla "preleva con ricevuta". Scegliamo la freccia tratteggiata e la facciamo andare da "preleva con ricevuta" a "preleva". Poi, si fa doppioclic sulla freccia tratteggiata, e nel menu contestuale che appare si sceglie, sotto "stereotype", la voce "extend", e automaticamente Bouml mette l'etichetta "extend" sulla freccia.
Ricordiamo che le frecce di estensione vanno dal caso esteso al caso base, mentre le frecce di inclusione vanno dal caso chiamante al caso chiamato.

Per aggiungere etichette arbitrarie, si usa il pulsante "ABC" e si mette il testo che vogliamo. Invece, il pulsante con il rettangolino di carta permette di inserire "note". La differenza è che le etichette vengono visualizzate come semplici scritte, mentre le note sono racchiuse in un quadratino azzurro.

to:

Siccome il nostro Bancomat prevede anche di poter stampare una ricevuta, creiamo un'altra palla chiamata "preleva con ricevuta". Scegliamo la freccia tratteggiata e la facciamo andare da preleva con ricevuta a preleva. Poi, si fa doppioclic sulla freccia tratteggiata, e nel menu contestuale che appare si sceglie, nel campo stereotype, scegliamo extend, e automaticamente Bouml mette l'etichetta extend sulla freccia. Abbiamo scelto extend perché il prelievo con stampa della ricevuta è una specializzazione del prelievo semplice.

Ricordiamo che le frecce di estensione vanno dal caso esteso al caso base, mentre le frecce di inclusione vanno dal caso che include al caso incluso.

Per aggiungere etichette arbitrarie, si usa il pulsante ABC e si mette il testo che vogliamo. Invece, il pulsante con il rettangolino di carta permette di inserire note. La differenza è che le etichette vengono visualizzate come semplici scritte, mentre le note sono racchiuse in un quadratino azzurro.

Changed lines 45-60 from:

Nome = il nome della classe di solito è maiuscolo, ma non è obbligatorio.

Attributi = identificano lo stato del nostro oggetto. Quando avremo più oggetti istanziati, il valore degli attributi ci permetterà di identificare un oggetto da un altro. Per consuetudine, iniziano per minuscola.

Operazioni/Metodi: funzionalità che esprimono il comportamento di un oggetto, ovvero l'interfaccia che esso espone all'esterno

Associazione = correlazione fra classi = linea continua tra due classi. C'è aggregazione e composizione. La molteplicità dice il numero di oggetti che, da una parte o dall'altra, partecipano all'associazione. 1..*,1, n, etc.

Nel quadrato che rappresenta la classe, gli attributi sono sotto il nome della classe, e sotto ci vanno i metodi, separati da una linea.

Aggregazione: esprime il concetto "è parte di", che si ha quando un insieme è relazionato con le sue parti.

Composizione = la parte componente non può esistere senza la sua parte composta, ed il componente non esiste senza la sua parte composta. Eg: i docenti esistono solo se esiste l'università, ma i dipartimenti possono esistere anche senza un università (??).

Ereditarietà: è una freccia con un triangolo. Vuol dire che la classe che eredita ha tutti gli attributi ed i metodi della classe da cui eredita, e in più ne può specificare di nuovi. La classe "madre" si chiama "superclasse".

to:

Le classi hanno le seguenti proprietà:

  • nome: il nome della classe di solito è maiuscolo, ma non è obbligatorio.
  • attributi: identificano lo stato del nostro oggetto. Quando avremo più oggetti istanziati, il valore degli attributi ci permetterà di distinguere un oggetto da un altro. Per consuetudine, iniziano con una lettera minuscola.
  • operazioni/metodi: funzionalità che esprimono il comportamento di un oggetto, ovvero l'interfaccia che esso espone all'esterno.

Nel rettangolo simboleggiante la classe gli attributi occupano la sezione immediatamente sotto il nome, mentre quella ancora più in basso contiene le operazioni.

Un'associazione è una correlazione fra classi. Nel caso generico è rappresentata da una linea continua tracciata tra due classi.La molteplicità dice il numero di oggetti che, da una parte o dall'altra, partecipano all'associazione. Possono essere 1..*,1, n, etc.

Ci sono due diversi tipi di associazione: l'aggregazione e la composizione:

  • aggregazione: esprime il concetto è parte di, che si ha quando un insieme è relazionato con le sue parti.
  • composizione: la classe componente è parte integrante della parte composta, la quale non potrà quindi esistere senza questo componente.

Per fare un esempio della differenza tra aggregazione e composizione, prendiamo un'automobile. Essa è un insieme di parti, e quindi ci aspettiamo che la classe Automobile sia un aggregato di Motore, Sedili, Ruote, Telaio. Tuttavia, una di queste parti è fondamentale, ed è il Telaio, perché senza di esso non ho nemmeno l'automobile. Il Motore ed il resto li posso cambiare, ma il Telaio, con il suo codice seriale unico, distingue univocamente la mia macchina da tutte le altre.

La relazione di ereditarietà è rappresentate da una freccia con un triangolo vuoto. Sta a significare che la classe ereditante ha tutti gli attributi ed i metodi della classe da cui eredita, anche se ovviamente può specificarnee di nuovi. La classe da cui si eredità è chiamata anche superclasse.

Changed line 64 from:

Persone è generico: un individuo. Si specifica in Docenti e Studenti.

to:

Persone è generico: simboleggia un individuo, che può essere Docente o Studente.

Changed line 11 from:

Per chiedere informazioni su Bouml, o chiedergli informazioni sul proprio progetto o cose del genere, . Accetta anche appuntamenti per discutere di questi temi.

to:

Per chiedere informazioni su Bouml, o chiedergli informazioni sul proprio progetto o cose del genere, questa è l'email. Accetta anche appuntamenti per discutere di questi temi.

Added lines 10-11:

Per chiedere informazioni su Bouml, o chiedergli informazioni sul proprio progetto o cose del genere, . Accetta anche appuntamenti per discutere di questi temi.

Added lines 144-146:

Presentare il progetto

Per presentare il progetto di IDS, occorre usare un tool come appunto Bouml, e presentare tutti i diagrammi. Se in Bouml clicco col destro sul foglio di lavoro di un qualsiasi diagramma, mi permette di salvare l'immagine nel formato che vogliamo, così che possiamo prendere l'immagine e metterla in un file etc.

Added lines 142-144:

A quanto pare non è possibile creare swimlanes con Bouml.

Added lines 138-141:

Il problema di sti diagrammi è che dicono COSA succede, ma non CHI lo fa. Si creano allora le swimlanes, che sono linee verticali che assomigliano alle corsie delle piscine. Sono etichettate con il nome di un attore, e servono per specificare la responsabilità delle varie azioni all'interno di un processo. I vari fork etc. porteranno ad una sequenza in un'altra swimlanes, ad esempio.

Bouml

Si crea una "new state machine" dalla mia Class View, e poi ancora tasto destro per creare "New State Diagram".

Changed line 9 from:

Lezione tenuta da Fulvio Frati.

to:

Lezione tenuta da Fulvio Frati. La presentazione (dell'anno scorso) si trova qui.

Changed line 130 from:

Branch = rombo, e ogni ramo uscente è etichettato con una condizione. Il workflow prenderà il ramo a seconda della condizione. non possono valere entrambe le condizioni. Dopo il branch, occorre un merge che chiuda i l ciclo condizionale.

to:

Branch = rombo, e ogni ramo uscente è etichettato con una condizione. Il workflow prenderà il ramo a seconda della condizione. non possono valere entrambe le condizioni. Dopo il branch, occorre un merge (un altro rombo) che chiuda il ciclo condizionale.

Added lines 116-136:

Bouml mette automaticamente i numeri man mano che creiamo operazioni. Siccome abbiamo già creato il Class Diagram, avremo già gli hint per i nomi delle Istance e per i nomi delle operazioni. In effetti sono cose collegate.

Activity Diagram

Modellano il workflow dei processi in caso di computazione parallela. Sono stati inseriti in UML 2.0, e sono simili agli automi a stati.

Il componente principale è l'ATTIVITA', che modella qualsiasi cosa il nostro sistema faccia. E' il fare qualcosa. Sono rappresentate da ovali.

Le transizioni ci permettono di passare da un'attività ad un'altra. Si attivano quando tutto ciò che l'attività comporta è stato completato. Si dice che le transizioni scattano con il completion event. E' una modellazione concettuale, però dà l'idea di che cosa accade nel nostro processo.

Si può associare un AD ad una singola classe, a una singola operazione di una classe, ad un Use Case. insomma, è molto generico.

Lo stato iniziale è il pallino nero. Lo stato finale è il pallino nero cerchiato da una corona.

Branch = rombo, e ogni ramo uscente è etichettato con una condizione. Il workflow prenderà il ramo a seconda della condizione. non possono valere entrambe le condizioni. Dopo il branch, occorre un merge che chiuda i l ciclo condizionale.

Il fork permette l'esecuzione parallela: una lina nera spessa con una linea entrante e più linee uscente: vuol dire che si attivano più processi.

Il join invece deve sempre corrispondere ad una fork, e ricongiunge più processi entranti in un'unica freccia uscente.

OCIO: ad ogni fork deve corrispondere un join!

Added lines 104-116:

Le condizioni, nella versione provata in classe, non sono esprimibili direttamente: suppliamo a questa carenza utilizzando il pulsante "ABC" e creando una label con opportune parentesi quadre, e si mettono poi queste etichette sopra i messaggi.

Collaboration Diagram

E' un altro modo di specificare il Sequence Diagram, in cui gli oggetti non sono più in linee verticali, ma collegati da frecce. Si modella solo la sequenza di messaggi, e non più lo scorrere del tempo. I messaggi sono numerati proprio per la sequenza temporale. Sono un po' meno espliciti dei diagrammi di sequenza, ed in effetti se faccio un diagramma di sequenza quello di collaborazione non è necessario.

In Bouml, per creare un nuovo C.D. si crea un "New Communication Diagram" (ocio: non collaboration) cliccando col destro sulla mia class view.

Anche qui si creano gli oggetti premendo il pulsante con due linee in mezzo, che crea istanze di oggetti. Per ricreare la situazione dell'esercizio precedente, creiamo un ClientWeb, un Ordine, una LineaOrdine e un Articolo.

I link si creano con le linee continue. Doppiocliccando su una linea posso aggiungere messaggi, indicando anche la loro direzione. Con l'archetto si introducono auto-messaggi. Nel nostro caso si usa questo sistema per modellare il fatto che, se manca un articolo, questo va comprato dal fornitore.

Added lines 4-5:

Appunti in presa diretta: pagina da sistemare:)

Added lines 73-101:

Sequence diagram

Evidenziano la sequenza temporale delle azioni, ma non le relazioni tra oggetti.

Oggetti = box i n alto, con un nome sottolineato e una linea verticale detta linea di vita, che rappresenta il tempo durante il quale l'oggetto rimane in esecuzione. Può anche contenere il nome della classe di cui è istanza.

Il messaggio è una cfreccia con un'etichetta che esce da un oggetto, e può anche tornare su se stesso.
Messaggio sincrono = freccia continua, con su scritta l'operazione che viene richiamata, e il chiamate rimane in attesa della risposta.
Messaggio asincrono = freccia tratteggiata. Il chiamante continua nella sua esecuzione anche se il chiamato non ha risposto. Quando risponde, c'è la freccia di Ritorno.

Ritorno = un valore restituito al chiamante e non un oggetto chiamante.

Intervallo di tempo = box rettangolare che indica la vita.

X = quando il nostro oggetto viene cancellato dalla memoria

Condizione = definita tra parentesi []: asociata ad un messaggio, che viene generato solo se quelle condizioni sono soddisfatte.

Iterazioni = inoltrare un messaggio più volte

I diagrammi di sequenza ci permettono di vedere la sequenzialità dei messaggi, e quando gli oggetti vengono distrutti.

Bouml

Vogliamo specificare un servizio in cui un ut ente manda un ordine verso un sistema di vendita online. L'Ordine è composto da varie linee di prodotti, e ogni linea controlla il suo articolo Se è disponibile in magazzino, bene, se no male.

Per creare una diagramma di sequenza, si clicca sul destro sul Class Diagram creato prima, e si sceglie Sequence Diagram

Il terzo pulsante è "Add Instance" e ci permette di aggiungere un'istanza di qualcosa. Creerà automaticamente il quadrato e le linee verticali.

Le frecce di messaggi sono le freccie piene: partono da una linea del tempo ed arrivano ad un'altra. Bouml crea automaticamente anche i box di vita. Doppio clic sulla linea e ci permette di specificarne le proprietà. Dato che le linee rappresentano operazioni chiamate, occorre cliccare, nel menu contestuale appena apparso, su "Message" e scegliere "Create operation and choose it".

Changed lines 63-71 from:

In Bouml, tasto destro su progetto e "new class view". Poi ancora tasto destro sulla vista appena creata, e tasto destro su "new class diagram".

to:

In Bouml, tasto destro su progetto e "new class view". Poi ancora tasto destro sulla vista appena creata, e tasto destro su "new class diagram". Doppio clic sul class diagram e vi apre la vista.

Il primo pulsante crea una classe. Premendo col destro su di una classe appare un menu contestuale che ci permette di aggiungere attributi o metodi. Ogni volta che aggiungiamo un attributo o un metodo possiamo scegliere tipo, parametri in ingresso, etc. Attenzione: abbiamo scelto come linguaggio Java, pertanto tutte queste scelte saranno Javose.

Aggiungiamo le classi Docente e Studente. In Studente mettiamo l'attributo Matricola, come int.

L'associazione tra Studente e Persona è la freccia vuota: ereditarietà. In Bouml si chiama "generalization", e va da ereditiera a superclasse.

Creiamo il Corso. La relazione tra docente e corso è generica -> linea nera senza frecce. Poi, doppio clic su questa linea e possiamo specificare il tipo di relazione. Possiamo scegliere il tipo di relazione per ogni capo della freccia: in Docenti, la relazione è "insegna", mentre dal lato del corso la relazione è "tenuto da". Scegliamo anche la molteplicità.

Added lines 6-8:

Lezione tenuta da Fulvio Frati.

Changed lines 32-34 from:

Se vogliamo anche modellare una ricevuta, creiamo un altra palla "preleva con ricevuta". Scegliamo la freccia tratteggiata e la facciamo andare da "preleva con ricevuta" a "preleva". Poi, si fa doppioclic sulla freccia tratteggiata, e nel menu contestuale che appare si sceglie, sotto "stereotype", la voce "extend", e automaticamente Bouml mette l'etichetta "extend" sulla freccia.

to:

Se vogliamo anche modellare una ricevuta, creiamo un altra palla "preleva con ricevuta". Scegliamo la freccia tratteggiata e la facciamo andare da "preleva con ricevuta" a "preleva". Poi, si fa doppioclic sulla freccia tratteggiata, e nel menu contestuale che appare si sceglie, sotto "stereotype", la voce "extend", e automaticamente Bouml mette l'etichetta "extend" sulla freccia.
Ricordiamo che le frecce di estensione vanno dal caso esteso al caso base, mentre le frecce di inclusione vanno dal caso chiamante al caso chiamato.

Added lines 36-63:

Diagramma delle classi

Nome = il nome della classe di solito è maiuscolo, ma non è obbligatorio.

Attributi = identificano lo stato del nostro oggetto. Quando avremo più oggetti istanziati, il valore degli attributi ci permetterà di identificare un oggetto da un altro. Per consuetudine, iniziano per minuscola.

Operazioni/Metodi: funzionalità che esprimono il comportamento di un oggetto, ovvero l'interfaccia che esso espone all'esterno

Associazione = correlazione fra classi = linea continua tra due classi. C'è aggregazione e composizione. La molteplicità dice il numero di oggetti che, da una parte o dall'altra, partecipano all'associazione. 1..*,1, n, etc.

Nel quadrato che rappresenta la classe, gli attributi sono sotto il nome della classe, e sotto ci vanno i metodi, separati da una linea.

Aggregazione: esprime il concetto "è parte di", che si ha quando un insieme è relazionato con le sue parti.

Composizione = la parte componente non può esistere senza la sua parte composta, ed il componente non esiste senza la sua parte composta. Eg: i docenti esistono solo se esiste l'università, ma i dipartimenti possono esistere anche senza un università (??).

Ereditarietà: è una freccia con un triangolo. Vuol dire che la classe che eredita ha tutti gli attributi ed i metodi della classe da cui eredita, e in più ne può specificare di nuovi. La classe "madre" si chiama "superclasse".

Esercizio

Struttura universitaria: ci sono Persone, Docenti, Studenti, Frequenze, Esami, Corsi.

Persone è generico: un individuo. Si specifica in Docenti e Studenti.

Esami: sostenuti da uno studente.
Corsi: frequentati da uno studente.
Frequenze: associazione tra Esami e Corsi.
In Bouml, tasto destro su progetto e "new class view". Poi ancora tasto destro sulla vista appena creata, e tasto destro su "new class diagram".

Added lines 30-32:

Per aggiungere etichette arbitrarie, si usa il pulsante "ABC" e si mette il testo che vogliamo. Invece, il pulsante con il rettangolino di carta permette di inserire "note". La differenza è che le etichette vengono visualizzate come semplici scritte, mentre le note sono racchiuse in un quadratino azzurro.

Added lines 26-30:

Le relazioni sono frecce. Quella senza nome è la relazione standard. Quindi, disegniamo un attore, una palla chiamata preleva e tiriamo la freccia.

Se vogliamo anche modellare una ricevuta, creiamo un altra palla "preleva con ricevuta". Scegliamo la freccia tratteggiata e la facciamo andare da "preleva con ricevuta" a "preleva". Poi, si fa doppioclic sulla freccia tratteggiata, e nel menu contestuale che appare si sceglie, sotto "stereotype", la voce "extend", e automaticamente Bouml mette l'etichetta "extend" sulla freccia.

Added lines 24-25:

Doppio clic sul caso d'uso, e compare una finestra in cui possiamo spaciugare.

Changed lines 3-4 from:
to:
Changed lines 6-23 from:
to:

Bouml

Casi d'uso

Gli attori sono omini, e si possono definire gerarchie di attori. Il caso d'uso in sé è invece indicato da palle gialle.

Ogni palla rappresenta una specifica funzionalità del caso d'uso, e sono collegate da frecce.

<<include>> = mostra il comportamento comune a uno o più casi d'uso. Eg: identificarsi al bancomat include sia prelevare che saldo. Vuol dire che sia prelevare che saldo avranno comportamenti comuni, ovvero identificarsi al bancomat.
E' un esempio di riutilizzo del software, perché la procedura di autenticazione viene scritta una volta sola ed usata in diversi punti..

<<extend>> = mostra il comportamento opzionale (alternativo o relativo al trattamento di condizioni anomale).

Esercizio

Dobbiamo modellare un Sistema Bancomat. L'utente può prelevare, visualizzare il saldo e depositare (da quando al bancomat si deposita?).

Bouml: Project | New => si sceglie il file da salvare.
Poi si deve scegliere il Language, cioè il linguaggio di programmazione, nel nostro caso Java.

Per creare il diagramma dei casi d'uso, si clicca col destro sul progetto e si sceglie new use case view. Poi, su questa vista, si clicca ancora col destro e si sceglie new use case.

Added lines 1-8:

(:title Ingegneria del Software - Appunti del 7.4.09:)

 Torna alla pagina di Ingegneria del Software

:: Ingegneria del Software - Appunti del 7.4.09 ::


Torna alla pagina di Ingegneria del Software