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

Ingegneria del Software - Appunti del 7.4.09

Torna alla pagina di Ingegneria del Software

:: Ingegneria del Software - Appunti del 7.4.09 ::

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

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.

Bouml

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ì.

Casi d'uso

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).

Esercizio

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

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.

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

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

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.

Diagramma delle classi

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.

Esercizio

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

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

  • 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).

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.

Bouml

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.

Bouml

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

A quanto pare non è possibile creare swimlanes con Bouml.

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, posso salvare quell'immagine nel formato che vogliamo, oppure salvarla negli appunti, e riutilizzarla quindi per comporre la relazione.


Torna alla pagina di Ingegneria del Software