Tutorial UML: La programmazione Model-Driven

by Marco (Ender) Frisan


I Class Diagrams: prima parte



Introduzione


Molti di voi certamente sapranno cos'è un diagramma di flusso. Per essere brevi potremmo dire che si tratta di un modo molto comodo di rappresentare una procedura visivamente.


Rettangoli, cerchi e rombi, rappresentano dei blocchi logici, nei quali il programma esegue determinate operazioni o scelte, e delle frecce connettono questi blocchi rappresentando tutti i percorsi logici che il programma procedurale è in grado di eseguire fino al suo completamento.

I diagrammi di flusso si sono affermati in particolar modo perché aiutano a comprendere istruzioni condizionali (if()) o loop (for(), while(), do... while() e switch()), che possono diventare particolarmente complesse, e a risolvere problemi di particolare complessità logica.


Fintanto che si rimane nell'ambito della programmazione procedurale, i diagrammi di flusso potrebbero bastare, ma con l'avvento della programmazione ad oggetti ed in particolare Java si rendeva necessario trovare un altro modo di rappresentare il programma.


A risolvere questo problema ha provveduto OMG (Object Management Group, http://www.omg.org/) un consorzio che ha definito le specifiche di un nuovo linguaggio sviluppato allo scopo di poter rappresentare un'applicazione (e non necessariamente un software) come un modello, indipendentemente dai dettagli della sua implementazione. Questo linguaggio si chiama UML (Unified Modeling Language, http://www.uml.org/) ed è solo una parte di una specifica molto più grande che si chiama MDA (Model Driven Architecture, http://www.omg.org/mda/).


In questo tutorial noi analizzeremo soltanto i Class Diagrams, che rappresentano le relazioni fra le Classi di un'applicazione. Ben inteso è importantissimo distinguere fra Classi e Istanze (o Oggetti). I Class Diagram rappresentano principalmente le Classi e danno soltanto un'idea delle relazioni fra istanze di una Classe, poi capiremo perché.


Dato che Objective-C (ma anche Java, Python e PHP) è un linguaggio orientato agli oggetti i Class Diagram diventano uno strumento estremamente utile ad analizzare e progettare un'applicazione efficiente e facilmente scalabile.



Gli strumenti per modellare in UML


Per modellare in UML potremmo anche usare carta e matita. E non c'è nulla di sbagliato nel farlo. Anzi incoraggio quelli che preferiscono usare questo strumento.


Per mantenere chiarezza in questo tutorial ho deciso comunque di utilizzare un'applicazione: ArgoUML (http://argouml.tigris.org/). ArgoUML è un'applicazione Open Source che permette di modellare la gran parte dei diagrammi definiti nella specifica UML. ArgoUML è anche la base su cui si fonda un programma commerciale che ne estende le funzionalità, Poseidon for UML (http://www.gentleware.com/uml-software-community-edition.html) del quale esiste anche una Community Edition, gratuita ma con alcune limitazioni. Sempre nel campo commerciale, esiste anche MyEclipse (http://www.myeclipseide.com/) un plugin che porta le funzionalità di ArgoUML dentro a Eclipse.

A parte questi prodotti, su internet si trovano tantissimi programmi che implementano funzionalità simili a ArgoUML. Ma fra quelli Open Source, fin ora, ArgoUML è il migliore che ho trovato.


Nel caso vogliate usare ArgoUML il mio consiglio è di avviarlo dal Terminale. Dentro la cartella di ArgoUML c'è uno script per il Terminale, argouml.sh, che io ho modificato in questo modo.


#!/bin/sh


## resolve links - $0 may be a link to ArgoUML's home

PRG=$0

progname=`basename $0`


while [ -h "$PRG" ] ; do

  ls=`ls -ld "$PRG"`

  link=`expr "$ls" : '.*-> \(.*\)$'`

  if expr "$link" : '.*/.*' > /dev/null; then

      PRG="$link"

  else

      PRG="`dirname $PRG`/$link"

  fi

done


java -Xms256m -Xmx384m -jar `dirname $PRG`/argouml.jar "$@"


In pratica ho esteso la RAM minima e massima, perché ArgoUML soffre di problemi di gestione della memoria che causano mostruosi rallentamenti dopo qualche oretta che ci si lavora e il rischio di non riuscire più a salvare le modifiche apportate ad un documento.


Aumentando la RAM messa a disposizione il problema si risolve.



Concetti base


Aprite quindi ArgoUML (oppure impugnate la vostra matita ;-) ) e cominciamo a vedere assieme come è costituito un diagramma UML.


0001.png


Quando apriamo ArgoUML, l'applicazione apre un'unica finestra contenente 4 pannelli, un modello già pronto e 2 diagrammi vuoti: Diagramma di Classe 1 e Diagramma dei Casi d'Uso 1. Il primo è il diagramma che ci interessa e dovrebbe essere già attivo.

Sopra al pannello con la griglia una Tool Bar ci mette a disposizione tutti i tipi di elementi che possiamo aggiungere nel diagramma. Esplorateli un po'. Passando sopra col puntatore del mouse dovrebbero apparire i Tool Tips. Le icone di alcuni strumenti sono affiancati da una freccetta nera rivolta verso il basso, se la clickate appariranno di sotto tipi dello stesso strumento.


Descriviamo subito i primi quattro strumenti. Il primo, il classico puntatore, è la selezione; il secondo è una sorta di rastrello, sul cui scopo, per ora, sorvoliamo; il terzo serve a creare un pacchetto (un pacchetto Java oppure un namespace C++ o Objective-C) e, infine, il quarto, il primo che useremo, serve a creare una classe.



La prima classe


Per creare la prima classe clickiamo quindi sull'iconcina della classe e poi nel mezzo della pagina del diagramma. Otteremo quanto segue.


0002.png


Dopo aver creato la prima classe il puntatore ritornerà automaticamente allo strumento selezione e ci sarà una classe vuota e senza nome, selezionata nel mezzo della pagina.

Nel pannello in basso a destra, compariranno informazioni contestuali alla classe selezionata, nella pagina Proprietà.


0003.png


Nello campo di testo Nome possiamo dare un nome alla classe. Io ho scelto un nome banale, scegliete quel che preferite.



Le associazioni


Di seguito al strumento per creare una classe, potete vedere una serie di linee che possono terminare con delle frecce o rombi. Queste linee servono a rappresentare quelle che in UML vengono chiamate Associazioni. Ci sono diversi tipi di associazione in UML: l'associazione semplice, l'aggregazione, la composizione e la generalizzazione.

Le associazioni di fatto connettono due classi fra di loro e rappresentano una relazione di qualche tipo fra esse.


Il tipo di associazione più classico è la Generalizzazione, che rappresenta l'ereditarietà. Si disegna con la freccia che parte dalla classe figlia e va verso quella parente.


Iniziamo, quindi, creando una nuova classe. Questa volta, per darle un nome, facciamo doppio click nel primo riquadro della classe.


0004.png


Comparirà un campo di testo nel quale possiamo inserire il nome direttamente all'interno del diagramma.


0005.png


Ora è possibile collegare le due classi tramite un'associazione di tipo Generalizzazione. Selezionate MiaClasse, e attendete qualche istante col puntatore sopra di essa.


0006.png


Come vedete sono comparse delle zone sensibili attorno al modello, per creare la generalizzazione dovremo trascinare la freccia gialla, comparsa in alto al centro di MiaClasse, fino a MioParente. Così:


0007.png 0008.png


Il risultato sarà questo.


0009.png


Questo è il modo di rappresentare una classe che estende un'altra classe. Ma la cosa più interessante è che ArgoUML è in grado di rappresentare questa informazione sotto forma di codice.


Selezionate MiaClasse e clickate la pagina Sorgente dentro al pannello in basso a destra. Come potete vedere il codice sorgente è già pronto. Basta scegliere il linguaggio che preferite nel menù a tendina.


0010.png


E ottenere quindi il codice in linguaggio Java, ad esempio.


0011.png


Purtroppo il supporto per Objective-C ancora non c'è, ma nessuno vieta di creare un plugin per ArgoUML che supporti Objective-C oppure di implementare una sorta di plugin per Xcode che implementi le funzionalità di ArgoUML.

Inoltre lo scambio fra applicazioni è facilitato dal formato adottato da UML, che è un'estensione di XML chiamata XMI (XML Model Interchange, http://www.omg.org/technology/documents/modeling_spec_catalog.htm#XMI).

In teoria è possibile esportare il diagramma come XMI e quindi convertirlo in codice tramite applicazioni esterne. Eclipse implementa simili funzionalità. Così come molti altri IDE.



Conclusioni


Nella seconda parte di questo tutorial approfondiremo l'uso delle altre associazioni. Nel frattempo salvate il vostro modello in formato UML. UML è un formato simile a XMI, ma oltre alle informazioni del diagramma, contiene anche informazioni sull'aspetto grafico e la posizione degli elementi nel diagramma; informazioni che XMI non conserva. Il formato *.zargo, invece, non è affidabile e spesso ArgoUML lo corrompe.


0012.png