Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
Il paradigma OO
Il principale difetto della programmazione imperativa è che le variabili globali sono potenzialmente accessibili da ogni parte del programma generando grandi programmi ingestibili. Agli inizi degli anni 70 si sviluppò la tecnica dell'information hiding come rimedio che prevedeva di riunire in un modulo ogni variabile globale assieme ad un gruppo di operazioni autorizzate ad accedervi e a delle altre operazioni che permettono l'accesso indiretto da parte di altri moduli. Tutto questo mediante la definizione di oggetti. Questo era già possibile nella programmazione imperativa ma non era presente un utilizzo forzato e inoltre gli oggetti non sono cittadini di prima classe, cioè non possono essere restituiti come risultato di chiamate di altre funzioni e assegnati come valore a una variabile. Il paradigma OO è una evoluzione in quanto gli oggetti diventano dei cittadini di prima classe e una rivoluzione in quanto gli oggetti hanno un ruolo fondamentale nella programmazione.
La progettazione e la programmazione orientata agli oggetti unisce l'information hiding e l'incapsulamento. I linguaggi di programmazione si classificano in:
- Objected based, cioè che supportano la nozione di oggetto
- Class based, cioè che supportano la nozione di oggetto e classe
- Object oriented, cioè che supportano la nozione di oggetto, classe, ereditarietà, ecc.
Gli oggetti incapsulano uno stato e un comportamento. Lo stato è identificato dal contenuto di una certa area di memoria mentre il comportamento è definito da una collezione di procedure e funzioni, chiamate metodi, che possono operare sulla rappresentazione dell'area di memoria associata all'oggetto.
Ogni oggetto possiede un identificatore univoco che è riconoscibile indipendentemente dal suo stato corrente. L'object identifier o OID sono anche detti riferimenti e sono immutabili, cioè non possono essere modificati da una qualche opzione di programmazione.
Cambiare l'OID di un oggetto equivale alla cancellazione dell'oggetto o alla creazione di un altro oggetto con lo stesso stato. Essi sono assegnati in maniera automatica e corrispondono all'indirizzo dell'area di memoria in cui è conservato. I riferimenti non sono utilizzati esplicitamente ma sono legati a delle variabili. Variabili distinte possono riferirsi allo stesso oggetto (alias) e lo stato di un oggetto può contenere il riferimento ad un altro oggetto. UML (Unified Modeling Language) è un linguaggio visuale per definire, progettare, realizzare e documentare un software mediante un approccio object-oriented. Esso può essere utilizzato per la progettazione di sistemi disparati, da sistemi web a quelli più tradizionali. Nella moderazione OO, le componenti elementari sono l'oggetto e la classe. L'UML non è una metodologia di sviluppo del software, non è un linguaggio di programmazione, non è proprietario e la notazione.Sintassi e semantica sono standard. Esso è stato definito e promosso dalla OMG (Object Management Group) che ne è incaricata anche della sua evoluzione. L'UML ha come obiettivi quelli di:
- Fornire all'utente un linguaggio di specifica espressivo, visuale e di rapido utilizzo.
- Offrire meccanismi di estensibilità e di specializzazione del linguaggio.
- Essere indipendente dal linguaggio di programmazione.
Esso infatti permette di astrarre e semplificare progetti complessi, visualizzare un sistema, specificarne la struttura e il comportamento, definirne le linee guida per la costruzione e documentare le decisioni prese.
Oggetti in UML:
Essi vengono rappresentati all'interno di un rettangolo e all'interno si possono indicare:
- Solo l'identificatore o nome dell'istanza.
- Il nome dell'istanza e della astrazione o classe a cui appartiene.
- Solo il nome della astrazione qualora non si conosca il nome dell'istanza.
- Un'istanza orfana.
Le classi
Una classe è la descrizione di una famiglia di oggetti che condividono la stessa struttura (attributi) e il medesimo comportamento (operazioni). Nella programmazione OO ogni oggetto può essere ottenuto solo se si definisce la sua classe di appartenenza infatti un oggetto è un istanza di una classe.
Detto ciò le istanze esistono in quanto ci sono le loro astrazioni che sono la realizzazione di un dato astratto.
Ogni classe ha una doppia componente:
- Componente Statica cioè campi e attributi dotati di nome che contengono un valore che caratterizzano lo stato degli oggetti durante l'esecuzione del programma. Essi si differenziano in base al loro
ambito di azione; Gli attributi di istanza sono associati ad un istanza e il loro tempo di vita è pari a quello dell'istanza alla quale sono associati e caratterizzano lo stato di ogni singolo oggetto mentre gli attributi di classe sono quelli associati alle classi e hanno tempo di vita della classe, sono condivisi tra tutte le istanze della classe e definiscono la parte di stato comune tra tutti gli oggetti di una classe.
Componente dinamica cioè metodi e operazioni che rappresentano il comportamento comune degli oggetti appartenenti alla classe. Essi infatti sono i servizi che si possono richiedere ad un oggetto di una classe manipolando gli attributi. I metodi possono essere classificati in:
- Metodi costruttori che creano o istanziano gli oggetti e li inizializzano.
- Metodi di accesso che restituiscono astrazioni significative dello stato di un oggetto.
- Metodi di trasformazione che modificano lo stato di un oggetto.
- Metodi distruttori che rimuovono gli oggetti dalla
memoria.I metodi di accesso e trasformazione possono essere di istanza cioè che operano su almeno un attributo di istanza e possono essere invocati solo specificando l’istanza, oppure di classe cioè che operano solo su attributi di classe e possono essere invocati specificando la classe anche se non è stato creato alcun oggetto per quella classe e possono essere invocati inoltre su un istanza.
Classi in UML: Essa è rappresentata mediante un rettangolo. Essa deve avere un nome che la contraddistingue dalle altre, esso puo essere semplice o indicare un percorso. Graficamente gli attributi sono indicati sotto il nome della classe e di essi si puo specificare l’insieme dei valori assunti e una eventuale inizializzazione.
Gli attributi statici o di classe è indicato come sottolineato.
Gli attributi derivati, cioè quelli calcolati partendo da altri attributi, sono rappresentati mediante uno slash ( / ). Esso indica un commento sulla parte destra.
cui si scrive come si calcola l'attributo derivato. (Viene collegato con una linea e le scritte all'interno di parentesi graffe all'interno di un rettangolo. I commenti possono essere aggiunti a qualunque elemento della notazione UML. Le operazioni sono rappresentate graficamente in una sezione al di sotto degli attributi e di una operazione si può specificare la segnatura. Una classe può essere rappresentata a diversi livelli di dettaglio: specificando solo il nome, specificando gli attributi e i metodi in base alle scelte di chi progetta e modella. Gli stereotipi sono meccanismi di estensibilità di UML, cioè estendono il vocabolario di UML permettendo di creare nuovi blocchi per la costruzione dei modelli. Essi derivano da blocchi già esistenti rendendoli specifici per il particolare dominio. Si definiscono racchiusi da una coppia << >>. Usati per esempio per differenziare i << costruttori >> dagli operatori di << accesso >>.>>.Visibilità di attributi e metodi
Un elemento, che sia attributo o metodo, ha una visibilità che può essere:
- Pubblica cioè che puo essere visto (utilizzato, invocato) da altre classi.
- Privata cioè che puo essere visto solo dalla classe di appartenenza.
- Protetta cioè che l’elemento è visibile all’interno del package e all’esterno sono dai discendenti della classe di appartenenza. Page 9 of 29
- Package cioè che l’elemento è visibile solo elementi del package che contiene la classe in cui l’elemento è definito.
In UML la notazione usata per la visibilità è la seguente: pubblici: +, privati: -, protected: #, package: ~;
Ad ogni classe è associata un numero di molteplicità che indica il numero di istanze che essa può avere in quanto in alcuni casi è necessario indicare che la classe puo avere una sola istanza per fare una classe singleton oppure un
numero ben definito di istanze. In UML tale valore è indicato in alto a destra nell'icona rappresentante la classe.
Un singleton si può realizzare rendendo privati i costruttori della classe, aggiungendo un attributo statico che è inizializzato all'unico oggetto di quella classe e creando un metodo di classe che restituisce l'unica istanza memorizzata nella classe singoletto. Inoltre nessun altro metodo della classe invocherà il costruttore.
È possibile indicare la molteplicità anche per gli attributi subito dopo il loro nome: nome[2..].
Lo schema generale per la definizione di un attributo è:
[ visibilità ] nome [ molteplicità ] [ : tipo ] [ = valore iniziale ] [ { proprietà } ]
In UML esistono 3 proprietà predefinite applicabili agli attributi:
- Changeable: cioè che non vi sono restrizioni sulla modificabilità dell'attributo
- addOnly: cioè i valori possono essere aggiunti, ma una
volta creati, non possono più essere rimossi o modificati. - frozen cioè il valore dell'attributo non può essere modificato dopo che l'oggetto è stato inizializzato.
Nel caso in cui non viene specificato nessuna proprietà si sottintende che assuma valore changeable.
Schema per la definizione di un operazione:
UML distingue operazioni e metodi. Le prime sono servizi che possono essere richiesti alla classe mentre i metodi sono un'implementazione dei servizi. Infatti possono anche esistere diversi metodi per la stessa operazione.
[ visibilità ] nome [ ( lista dei parametri ) ] [ : valore di ritorno ] [ { proprietà } ]
I parametri invece hanno come schema:
[ direzione ] nome [ : tipo ] [ = valore iniziale ]
La direzione può assumere uno dei seguenti valori:
- IN cioè parametro di input che non può essere modificato
- OUT cioè parametro di output e può essere modificato per comunicare un'informazione al chiamante
- INOUT parametro di input che può essere modificato per comunicare informazioni al chiamante