La Programmazione ad
Oggetti
Fabio Scanu a.s. 2012/2013
Paradigmi di programmazione
Programmazione non strutturata
Programmazione procedurale
Programmazione modulare
Programmazione ad oggetti
Programmazione non strutturata
Il programma è costituito da un unico blocco di codice detto "main" dentro
il quale vengono manipolati i dati in maniera totalmente sequenziale
Programmazione procedurale
Il concetto base è quello di raggruppare i pezzi di programma ripetuti in porzioni
di codice utilizzabili e richiamabili ogni volta che se ne presenti l'esigenza;
queste porzioni di codice sono chiamate procedure. Il programma è costituito
da un unico file.
Lezione 1
Programmazione
modulare
Le procedure aventi un dominio comune (ad esempio, procedure che eseguono
operazioni matematiche) vengono raggruppate in moduli separati. Il programma è
costituito da più file.
Lezione 1
Programmazione orientata agli oggetti
(Object Oriented Programming - OOP)
E’ basato sul fatto che esistono una serie di oggetti che interagiscono
vicendevolmente, scambiandosi messaggi ma mantenendo ognuno il proprio stato ed
i propri dati.
Lezione 1
Origini della programmazione ad
oggetti
Anni ’60: Simula 1 e Simula 67
Anni ’70: Smalltalk
Anni ’80: ADA – consacrazione della
programmazione ad oggetti
Tra i più noti linguaggi di programmazione
ad oggetti: Java, C++, Delphi, C#,
Visual Basic.NET
Lezione 1
Motivazioni
Migliorare la qualità del software
I programmi di grandi dimensioni vengono
scomposti in moduli, che chiameremo
oggetti
Ne trae beneficio la fase di manutenzione
Riutilizzo del codice
Oggetti 1
Per capire cos’è un oggetto prendiamo spunto dalla
vita reale: un oggetto è un’automobile, un
computer, una casa, e così via
Un oggetto può essere definito elencando sia le
sue caratteristiche sia i suoi comportamenti, cioè
le funzioni che mette a disposizione
Elencando le caratteristiche e i comportamenti,
diamo una definizione generica
Un oggetto però è un’entità particolare,
con le sue caratteristiche specifiche.
Oggetti 2
Ad un preciso oggetto assegniamo un nome:
chiameremo quindi un oggetto di classe
automobile auto1
Quindi l’oggetto auto1 potrà essere così
descritto:
- Velocità = 80
- Colore = rosso
- Numero di porte = 5
- Marca = bmw
Oggetti 3
Un altro oggetto auto2 potrò avere le seguenti
caratteristiche:
- Velocità = 60
- Colore = nero
- Numero di porte = 4
- Marca = fiat
Quindi gli oggetti sono diversi a seconda del
valore assunto dalle loro caratteristiche,
ma condividono la stessa struttura
Oggetti 4
Nella terminologia OOP le caratteristiche
di un oggetto vengono chiamate
attributi, i comportamenti vengono
chiamati metodi
I metodi sono le operazioni che un
oggetto è in grado di compiere
Un oggetto è quindi formato da
attributi e metodi
Classi 1
Possono esistere più oggetti che hanno gli stessi
attributi, anche con valori diversi, e che dispongono
degli stessi metodi. Si dice che questi oggetti
appartengono alla stessa classe
Una classe specifica gli attributi, senza indicarne il
valore, e i metodi che devono avere gli oggetti che
appartengono alla classe
La classe quindi crea più oggetti tutti con gli stessi
attributi e gli stessi metodi. Gli oggetti creati a partire
da una classe vengono chiamati istanze della classe
Due istanze della stessa classe sono distinguibili solo
per il valore dei loro attributi, mentre il loro
comportamento (metodo) è lo stesso
Diagramma
Classi 2
• La struttura di una classe è la seguente:
<nome classe>
<attributo1>
<attributo2>
…
<metodo1>
<metodo2>
…
delle classi
• Esempio:
Automobile
Velocità
Colore
Numero di porte
Marca
Avviati
Accelera
Fermati
Gira
Cambia marcia
Rifornisciti
Classi 3
Classi 4
Usando questa classe possiamo creare gli oggetti auto1
e auto2, e dopo averli creati possiamo interagire con
essi usando l’invio di messaggi oppure modificando
direttamente gli attributi.
Possiamo impostare alcune caratteristiche dell’oggetto
auto1:
- auto1.colore = blu
- auto1.numero_di _porte = 5
oppure possiamo usare i metodi dell’oggetto auto2
sfruttando i seguenti messaggi:
- auto2.avviati()
- auto2.accelera()
Esempi usando il linguaggio Java 1
Un’applicazione Java è costituita da una o più classi; una classe solamente
contiene il metodo main():
l’esecuzione di un’applicazione java comincia eseguendo questo metodo.
class saluti
{
public static void main (String args[])
{
System.out.println(“hello world”);
}
}
Esempi usando il linguaggio Java 2
public indica che il metodo è pubblico ed è
visibile
static indica che il metodo è associato alla
classe e non può essere richiamato dai
singoli oggetti della classe.
void indica che non ci sono valori di ritorno
Parametri Il metodo main possiede come
parametro un array di stringhe (indicato con
args[]) che corrisponde ai parametri passati
dalla riga di comando quando viene eseguita
l’applicazione
Esempi usando il linguaggio Java 3
Questo semplice esempio dichiara una
classe chiamata saluti, contenente il
metodo main che è formato da un’unica
istruzione, ossia una chiamata del metodo
println().
Usando la terminologia OOP diciamo che
viene inviato all’oggetto System.out il
messaggio println.
L’oggetto System.out indica lo standard
output.
Esempi usando il linguaggio Java 4
Esempio di dichiarazione di una classe:
class <nome della classe>
{
//attributi
//metodi
}
Esempi usando il linguaggio Java 5
Esempio di dichiarazione di attributi:
class automobile
{
private int velocità, numero_porte;
String colore, marca;
}
Esempio di dichiarazione di metodi
void accelera() { …}
public void sposta() { …}
Esempi usando il linguaggio Java 6
Esempio di creazione ed uso di oggetti:
supponiamo che esista la classe Automobile; dichiariamo le
seguenti istanze di classe:
- Automobile auto1 ;
- Automobile auto2;
per creare l’oggetto si usa l’operatore new seguito dal nome della
classe
- auto1 = new Automobile();
- auto2 = new Automobile();
Interazione tra oggetti 1
Un programma ad oggetti è formato da tanti oggetti che
comunicano ed interagiscono tra loro.
L’interazione tra gli oggetti avviene con un meccanismo
chiamato scambio di messaggi
Un oggetto, inviando un messaggio ad un altro oggetto,
può richiedere l’esecuzione di un metodo
Un oggetto può interagire con un altro oggetto per
diversi motivi: per modificarne lo stato, per richiedere
un’informazione o per attivare un comportamento
Interazione tra oggetti 2
Un messaggio è costituito da 3 parti:
– un destinatario, cioè l’oggetto verso il quale il
messaggio è indirizzato;
– il metodo che si vuole attivare, che deve essere
uno dei metodi messi a disposizione
dall’oggetto destinatario;
– l’insieme dei parametri che vengono passati
all’oggetto quando si richiede l’attivazione del
metodo
Interazione tra oggetti 3
Per esempio, se abbiamo una classe
automobile e una classe autista, un
oggetto di classe autista, per esempio
autista1 per inviare all’oggetto auto1 di
classe automobile il messaggio che
richiede di aumentare la velocità può
scrivere:
auto1.accelera()
Caratteristiche della OOP
• Incapsulamento
• Ereditarietà
• Polimorfismo
Incapsulamento
Con il termine incapsulamento si indica la proprietà
degli oggetti di incorporare al loro interno sia gli
attributi che i metodi, cioè le caratteristiche e i
comportamenti dell’oggetto. Tutto ciò che si riferisce
ad un certo oggetto è racchiuso e contenuto
all’interno dell’oggetto stesso
Gli attributi e i metodi sono incapsulati nell’oggetto. In
questo modo tutte le informazioni utili che riguardano
un oggetto sono al suo interno. Questo è uno dei
vantaggi della programmazione ad oggetti
Interfaccia
Un oggetto può essere utilizzato inviando ad esso i
messaggi. L’insieme dei messaggi, che consentono
l’interazione con gli oggetti, rappresenta la sua
interfaccia
L’interfaccia è costituita dall’elenco dei metodi
identificati dal loro nome. Per ogni metodo occorre
indicare anche il numero e il tipo dei parametri e il
valore di ritorno del metodo
Chi utilizza l’oggetto deve conoscere solo la sua
interfaccia.
In questo modo può sapere quali metodi possono
essere invocati, quali sono i parametri da passare e
che cosa ricaverà come valore di ritorno
Accesso agli attributi 1
Anche gli attributi sono nascosti nell’oggetto
Per poter leggere o modificare il valore di un attributo, si
dovrebbe utilizzare un metodo che esegue
l’operazione richiesta
Per esempio, se volessimo conoscere il valore della
velocità dell’oggetto auto1 dovremmo usare il
seguente messaggio: auto1.leggiVelocità()
Questo garantisce l’information hiding, ma comporta
che per ogni attributo dell’oggetto siano definiti il
metodo per leggere e il metodo per modificare
il suo valore
Accesso agli attributi 2
Alcuni linguaggi hanno cercato di superare
questa difficoltà consentendo un modo
diverso per manipolare gli attributi; in questo
caso ci si riferisce direttamente agli attributi:
auto1.velocità
Questa modalità di accesso agli attributi viola la
regola dell’information hiding, perché gli
attributi non restano più nascosti all’interno
dell’oggetto, ma offre la facilitazione di poter
manipolare gli attributi senza usare i
messaggi
Ereditarietà 1
L’ereditarietà è lo strumento che permette
di costruire nuove classi utilizzando
quelle già sviluppate
Quando una classe viene creata
attraverso il meccanismo di ereditarietà
a partire da un’altra classe, essa riceve
in eredità tutti gli attributi e i metodi
della classe generatrice
Ereditarietà 2
La classe che è stata derivata da un’altra
usando l’ereditarietà prende il nome di
sottoclasse. La classe generatrice di una
sottoclasse si chiama sopraclasse
Queste relazioni tra le classi individuano una
gerarchia che nasce da un processo di
specializzazione. Infatti le classi che si
trovano in cima alla gerarchia sono le più
generali e man mano che si scende si
trovano classi più specializzate
Ereditarietà 3
Mezzi di trasporto
Mezzi non a motore
Veicoli a motore
Auto
Moto
Autobus
Bicicletta
Cavallo
Ereditarietà 4
La sottoclasse eredita dalla sopraclasse tutti gli attributi
e tutti i metodi con la possibilità di inserire le
differenze.
La nuova classe si differenzia dalla sopraclasse in due
modi:
- per estensione, quando la sottoclasse aggiunge
nuovi
attributi e metodi che si sommano a quelli ereditati
- per ridefinizione, quando la sottoclasse ridefinisce i
metodi ereditati, viene cioè data
un’implementazione diversa di un metodo
Ereditarietà 5
L’ereditarietà serve a definire nuove classi,
derivate da altre, che ereditano gli attributi
e i metodi, con la possibilità di ridefinirli o
di aggiungerne di nuovi.
Ereditarietà 6
Esistono due tipi di ereditarietà:
• singola
• multipla
Ereditarietà Singola
Si parla di ereditarietà singola quando
una sottoclasse deriva da un’unica
sopraclasse
sopraclasse
sottoclasse
sottoclasse
Ereditarietà Multipla
Si parla di ereditarietà multipla quando
una classe deriva da due o più
sopraclassi
Mezzi di trasporto
Animali
Cavallo
Esempi usando il linguaggio Java
Class veicoli
{
// attributi
// metodi
…
}
class automobile extends veicoli
{
// attributi
// metodi
…
}
Eredita attributi e metodi
della classe veicoli
… e ne può aggiungere di nuovi
Lezione 3
Polimorfismo
Il polimorfismo indica la possibilità per i metodi di assumere forme,
cioè implementazioni, diverse all’interno della gerarchia delle
classi
Tutti i veicoli a motore possiedono il metodo accelera
- Le sottoclassi automobile e moto ereditano il
metodo accelera, ma è probabile che lo
ridefiniscano per adeguarlo alle particolari
esigenze
- Il metodo accelera dell’automobile si manifesterà con la
pressione del pedale, mentre nella moto sarà
implementato con il movimento della manopola
Queste due diverse implementazioni evidenziano l’aspetto
polimorfico del metodo accelera
Lezione 3
Polimorfismo
Durante l’esecuzione del programma, un’istanza
della classe veicoli a motore può rappresentare
sia una automobile che una moto
Non è possibile sapere, prima dell’esecuzione, se
si tratta di una automobile o di una moto
Il collegamento dinamico garantisce che,
richiamando il metodo, tra tutte le
implementazioni venga scelta quella corretta
che corrisponde all’oggetto interessato
Scarica

La Programmazione ad Oggetti