UML (Unified Modelling Language) è uno strumento estremamente potente e facile da usare che nelle mani di un progettista capace è in grado di rappresentare qualsiasi sistema.
Possiamo rappresentare in UML il funzionamento di un computer, di un impianto di riscaldamento, di un sistema informativo o di un robot.
L'importanza di UML risiede nel fatto che fornisce delle regole generali per la rappresentazione dei sistemi, regole che definiscono una linea guida in grado di rendere comprensibilissimo un progetto.
UML non si limita solo a quanto sopra scritto. Infatti partire direttamente con l'implementazione di un sistema senza averne fatto prima un'analisi porta molto spesso a punti morti che rendono difficile proseguire. Lo studio tramite UML mette in risalto tutte le problematiche legate al progetto e dunque consentono di approfondire le soluzioni a questi problemi. UML si basa su tre elementi fondamentali:
1)
Viste: che sono interpretabili come diversi modi di vedere un sistema
2)
Diagrammi: che sono la maniera con cui graficamente si rappresentano gli aspetti del progetto
3)
Componenti: che costituiscono i diagrammi
Infatti UML permette una rappresentazione grafica del progetto rendendolo estremamente conprensibile.
Prima di cominciare a parlare in maniera piu' approfondita di UML è indispensabile spiegare cosa è un
Oggetto.
Prendiamo un libro fra le mani ed osserviamolo. Un libro possiede ad esempio una copertina che ha un certo colore, un certo numero di pagine, un formato, un peso. Tutti questi elementi sono delle CARATTERISTICHE del nostro libro, che possiamo considerare un oggetto. Quini un oggetto possiede delle caratteristiche che prendono il generico nome di
ATTRIBUTI. Alcuni attributi puo' essere solo letti, altri consentono la modifica. Ad esempio se pensiamo ad un ascensore fermo ad un certo piano, il numero del piano puo' essere considerato un attributo che però puo' essere modificato. Invece il numero di pagine di un libro è un attributo che puo' essere solo letto. Non possiamo modificare il numero di pagine (a meno di strapparle
).
Adesso lasciamo cadere il nostro libro. Possiamo notare come un'azione esterna come quella delle nostre mani possa influenzare un oggetto. Tale azione esterna si chiama
EVENTO.
Posiamo il nostro libro ed osserviamo il lettore di CD del nostro PC. Il lettore puo' svolgere alcune azioni come leggere un cd, scriverci (se è un masterizzatore), espellerlo ecc... Tutte queste azioni si chiamano
METODI e sono operazioni che il nostro oggetto puo' svolgere.
Concentriamoci di nuovo sugli ATTRIBUTI. Alcuni attributi sono numerici, altri sono caratteri, altri ancora parole. Come fare ad identificarli? Per far questo si ricorre al concetto di TIPO che identifica la natura di un certo oggetto. Abbiamo i seguenti TIPI (standard):
INTEGER: un numero intero
FLOAT: un numero decimale (non ci soffermiamo per ora sui vari tipi di decimali, ci basta per adesso FLOAT)
CHAR: un carattere
STRING: una sequenza di caratteri
BOOLEAN: un valore che puo' essere o vero o falso
Ad esempio, il numero di pagine di un libro è un INTEGER, il peso di una mela misurato in Kg è un FLOAT, il nostro nome è uno STRING, la prima lettera dell'alfabeto è un CHAR. Ed i BOOLEAN? Supponiamo di chiederci se pesiamo piu' di 60 Kg o meno, la risposta è SI o NO, cioè VERO o FALSO. Ecco che la risposta a quella domanda è un BOOLEAN.
Allora possiamo provare a definire un attributo usando i tipi. Esempi sono:
PagineLibro:Integer
PesoMela:Float
Nome:String
ecc...
Passiamo ai metodi. Un metodo è quasi inutile se non possiamo specificare dei parametri su cui il metodo agisce. Ad esempio supponiamo che un metodo faccia la somma di due numeri. Per far ciò serve dar al metodo i due numeri. Possiamo specificare il metodo in questo modo:
SOMMA(numero1,numero2)
Però facendo cosi' non abbiamo specificato cosa sono numero1 e numero2. Inoltre il nostro metodo deve ritornarci la somma dei due numeri altrimenti non potremo mai conoscere il risultato di quella somma. Per far ciò useremo la:
SOMMA(numero1:Integer , numero2:Integer):Integer
In pratica abbiamo scritto che SOMMA accetta due interi in ingresso e ritorna un intero in uscita. Tralasciando ora le istruzioni necessarie a svolgere il compito, supponiamo di voler utilizzare il metodo. Per esempio sommiamo 4 e 5:
SOMMA(4,5)
SOMMA ritornerà come valore 9. Però serve che questo valore venga messo dentro qualche cosa che funga da contenitore per non perdere l'informazione. Chiamiamo Temp questo contenitore che deve essere un intero. Ad esempio:
Temp:Integer
Temp=SOMMA(4,5)
bene adesso Temp dovrebbe contenere il valore ritornato da SOMMA. Immaginiamo di disporre di un altro metodo che stampa su schermo il valore di una certa variabile (il 'contenitore' che abbiamo usato prima, ovvero Temp) definito come:
STAMPA(NumeroDaStampare:Integer)
Si noti che STAMPA non ci ritorna nulla ma esegue un'operazione proiettando il risultato su schermo. Non tutti i metodi infatti ritornano un risultato.
Proviamo ad usarlo:
Temp:Integer
Temp=SOMMA(4,5)
STAMPA(Temp)
Il risultato sarà 9 e verrà stampato su schermo.
Quanto abbiamo scritto fino ad ora è una specie di pseudocodice (ovvero non è un linguaggio di programmazione ben definito, ma creato ad Hoc da noi) che però rispecchia molto delle regole usate da UML.
Facciamo un passo in avanti. Prendiamo tutti i libri che abbiamo nella libreria ed osserviamoli. Possiamo notare come la struttura dei libri sia a comune, tutti hanno delle pagine, tutti hanno una copertina, tutti hanno stessi metodi ed eventi, ciò che cambia sono gli attributi. Allora un Libro appartiene ad un insieme che è quello dei Libri. Tale insieme si chiama CLASSE. Quindi la classe mette insieme un insieme di oggetti simili che si differenziano solo per gli attributi. Ad esempio tutte le persone appartengono alla classe PERSONA ma ciascuna ha caratteristiche proprie, sebbene tutte abbiano stessa capacità di azione (metodi).
Prima di concludere questo primo post proviamo a creare una classe usando sempre una sintassi di comodo:
CLASSE orologio
ATTRIBUTI
ore:Integer
minuti:Integer
secondi:Integer
METODI
settaOra(nuovaora:integer)
settaMinuti(nuoviminuti:integer)
settaSecondi(nuovisecondi:integer)
stampaOrario()
La nostra classe di esempio possiede come attributi ora-minuti-secondi che rappresenta l'orario. Inoltre dispone di alcuni metodi che servono a modificare gli attributi e di un metodo (stampaOrario() ) che non necessita di parametri di input o di output e manda allo schermo direttamente l'orario. Questo è un esempio molto semplificato di come costruire una classe, ma rende bene, spero, l'idea di cosa ci appresteremo a fare piu' avanti.
Un saluto...