Sei sulla pagina 1di 28

Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a.

2008/2009
1
Corso di Programmazione ad Oggetti
Introduzione alla programmazione ad oggetti
a.a. 2008/2009
Claudio De Stefano
Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009
2
La programmazione modulare
Un programma pu essere visto come un insieme di moduli che interagiscono tra
di loro. Tutte le funzioni di un modulo sono scritte nello stesso file.
Ogni modulo fatto di due parti, la specifica e l'implementazione. Questi due
aspetti sono separati mettendoli in due file diversi: la specifica si trova nel suo file
.h mentre l'implementazione nel file .cpp.
interfaccia
(Visibile dall'esterno)
corpo
(Nascosto all'esterno e
protetto)
MODULO
Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009
3
La programmazione modulare
I moduli non fanno parte del linguaggio, ma rappresentano una tecnica di
organizzazione del codice molto seguita dai programmatori.
La programmazione modulare offre enormi vantaggi nell'implementazione di
programmi: in particolare, al crescere della complessit dei programmi da
sviluppare, consente rendere pi semplici ed efficaci le operazioni di modifica e di
testing del codice prodotto.
Tra i principali vantaggi:
Suddivisione del lavoro tra diversi programmatori;
Semplificazione del riuso del software
Semplificazione della manutenzione;
Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009
4
La programmazione ad oggetti
La programmazione ad oggetti rappresenta un ulteriore sviluppo rispetto alla
programmazione modulare.
La programmazione orientata agli oggetti ( Object Oriented Programming, OOP)
un paradigma di programmazione, in cui un programma viene visto come un
insieme di oggetti che interagiscono tra di loro.
Nei linguaggi OOP esiste un nuovo tipo di dato, la classe. Questo tipo di dato
serve appunto a modellare un insieme di oggetti dello stesso tipo.
In generale, un oggetto caratterizzato da un insieme di attributi e da un insieme
di funzionalit
Un paradigma di programmazione caratterizzato dall'insieme di concetti e
astrazioni che utilizza per rappresentare un programma e i passi che
compongono un calcolo.
Esempi di paradigmi sono: imperativo, funzionale, object oriented, logico:
Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009
5
Un esempio di oggetto
Un automobile pu essere caratterizzata in questo modo:
attributi funzionalit
potenza frena
marce accellera
peso cambio marcia
cilindrata caqmbia direzione
possibile interagire con l'automobile, per determinarne il suo comportamento
attraverso il suo interfaccia che permette di effettuarele operazioni consentite:
Pedale del freno
Pedale dellacceleratore
Leva del cambio
volante
Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009
6
Un ulteriore esempio: un videogioco
Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009
7
Classi e oggetti: un esempio
Orco
Orco
Cavaliere
Cavaliere
Classi
Istanze (Oggetti)
Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009
8
La programmazione orientata agli oggetti
La programmazione orientata agli oggetti si basa su alcuni concetti fondamentali:
Classe
Incapsulamento
Oggetto
Ereditariet
Polimorfismo
Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009
9
Linguaggi ad oggetti
E possibile adottare tecniche di programmazione basate sugli oggetti anche in
linguaggi tradizionali (ad es., in C o Pascal) adoperando opportune discipline di
programmazione, aderendo cio ad un insieme di regole.
Queste regole non fanno per parte del linguaggio e il loro uso non pu essere
forzato n verificato dal compilatore.
Un linguaggio di programmazione ad oggetti offre costrutti espliciti per la
definizione di entit (oggetti) che incapsulano una struttura dati e le operazioni
possibili su di essa.
Alcuni linguaggi, in particolare il C++, consentono di definire tipi astratti, e quindi
istanze (cio, variabili) di un dato tipo astratto. In tal caso il linguaggio basato sugli
oggetti presenta costrutti per la definizione di classi e di oggetti.
Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009
10
Classi e oggetti
Nei linguaggi a oggetti, il costrutto class consente di definire nuovi tipi di dato e le
relative operazioni.
Le operazioni possono essere definite sotto forma di operatori o di funzioni (dette
metodi o funzioni membro), i nuovi tipi di dato possono essere gestiti quasi allo
stesso modo dei tipi predefiniti del linguaggio:
si possono creare istanze, e
si possono eseguire operazioni su di esse
Un oggetto una variabile che appartiene ad un particolare tipo di dato definito
dall'utente per mezzo del costrutto class.
Nel gergo dei linguaggi OO una variabile definita di un certo tipo (classe)
rappresenta un'istanza della classe.
Lo stato di un oggetto, invece, rappresentato dai valori correnti delle variabili
che costituiscono la struttura dati utilizzata per implementare il tipo di dato
rappresntato definito dalla classe.
Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009
11
Caratteristiche di una classe
La classe un modulo software con le seguenti caratteristiche:
E dotata di uninterfaccia (specifica) e di un corpo (implementazione);
La struttura dati concreta di un oggetto della classe, e gli algoritmi che ne
realizzano le operazioni, sono tenuti nascosti allinterno del modulo che
implementa la classe;
Lo stato di un oggetto evolve unicamente in relazione alle operazioni ad esso
applicate;
Le operazioni sono utilizzabili con modalit che prescindono completamente
dagli aspetti implementativi; in tal modo possibile modificare gli algoritmi
utilizzati senza modificare linterfaccia
Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009
12
Il linguaggio C++
C++ un linguaggio di programmazione general-purpose che supporta:
la programmazione procedurale ( un C migliore);
la programmazione orientata agli oggetti;
la programmazione generica.
C++ quindi un linguaggio ibrido, nel senso che supporta pi paradigmi di
programmazione
Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009
13
L'incapsulamento
L'incapsulamento (in inglese: information hiding) la suddivisione di un oggetto in
due parti:
Interfaccia:
costituito dall'insieme di metodi (detti anche messagi) che possono
essere invocati dall'utente per accedere alle funzionalit dell'oggetto;
Implementazione
Contiene l'implementazione delle funzionalit dell'oggetto e delle strutture
dati necessarie
nascosta allutente
L'incapsulamento realizzato per mezzo delle istruzioni:
Private: le funzioni e le variabili definite private NON sono accessibili
all'esterno della classe.
Public: le funzioni e le variabili definite publiche sono accessibili all'esterno
della classe.
Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009
14
Le classi in C++
Il linguaggio C++ supporta esplicitamente la dichiarazione e la definizione di tipi
astratti da parte dell'utente mediante il costrutto class; le istanze di una classe
vengono dette oggetti.
In una dichiarazione class occorre specificare sia la struttura dati che le
operazioni consentite su di essa. Una classe possiede, in generale, una sezione
pubblica ed una privata.
La sezione pubblica contiene tipicamente le operazioni (dette anche metodi)
consentite ad un utilizzatore della classe. Esse sono tutte e sole le operazioni che
un utente pu eseguire, in maniera esplicita od implicita, sugli oggetti.
La sezione privata comprende le strutture dati e le operazioni che si vogliono
rendere inaccessibili dall'esterno.
Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009
15
Le classi in C++: un esempio
class Cont at or e {
public:
void I ncr ement a( ) ; / / oper azi one i ncr ement o
void Decr ement a( ) ; / / oper azi one decr ement o
unsigned int gi ve_val ue( ) ; / / r est i t ui sce i l val or e
/ / cor r ent e
private:
unsigned int val ue; / / val or e cor r ent e
const unsigned int max; / / val or e massi mo
};
Inter
faccia
Implem
entazione
Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009
16
Produzione e uso di una classe
Il meccanismo delle classi orientato specificamente alla riusabilit del software.
Occorre dunque fare riferimento ad una situazione di produzione del software
nella quale operano:
Il produttore della classe, il quale mette a punto:
la specifica, in un file di intestazione (header file);
limplementazione della classe (in un file separato)
Lutente della classe, il quale ha a disposizione la specifica della classe, crea
oggetti e li utilizza nel proprio modulo.
Si parla anche di modello client- server: la classe un server che mette a
disposizione un certo numero di servizi ai clients (utenti).
client SERVER
classe utente
Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009
17
Produzione e uso di una classe
/ / Modul o ut i l i zzat or e
del modul o
/ / Cont at or e
#i ncl ude Cont at or e. h
unsigned int i ;
Cont at or e cont 1, cont 2;
.
.
.
cont 1. i ncr ement a( ) ;
cont 2. decr ement a( ) ;
i = cont 1. get _val ue( ) ;
/ / I nt er f acci a del
/ / modul o Cont at or e
class Cont at or e {
.
.
.
};
Utente.cpp
Contatore.h
/ / I mpl ement azi one del
modul o Cont at or e
#i ncl ude Cont at or e. h
Cont at or e: : i ncr ement a( )
{
.
.
}
Cont at or e: : decr ement a( )
{
.
.
}
Contatore.cpp
Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009
18
Ereditariet e polimorfismo
Lereditariet consente di definire nuove classi per specializzazione o estensione
di classi preesistenti, in modo incrementale
Il polimorfismo consente di invocare operazioni su un oggetto, pur non essendo
nota a tempo di compilazione la classe cui fa riferimento loggetto stesso
Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009
19
Ereditariet
Il meccanismo dell'ereditariet di fondamentale importanza nella
programmazione ad oggetti, in quanto induce una strutturazione gerarchica nel
sistema software da costruire.
Lereditariet consente infatti di realizzare relazioni tra classi di tipo
generalizzazione-specializzazione, in cui una classe, detta base, realizza un
comportamento generale comune ad un insieme di entit, mentre le classi
derivate (sottoclassi) realizzano comportamenti specializzati rispetto a quelli della
classe base
Esempio
Tipo o classe base: Animale
Tipi derivati (sottoclassi): Cane, Gatto, Cavallo,
In una gerarchia gen-spec, le classi derivate sono specializzazioni (cio casi
particolari) della classe base
Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009
20
Ereditariet
Generalizzazione: dal particolare al generale
Specializzazione o particolarizzazione: dal particolare al generale
Generalizzazione
Specializzazione
Nel paradigma a oggetti, col meccanismo dellereditariet ci si concentra sulla creazione
di tassonomie del sistema in esame
Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009
21
Ereditariet: un esempio
Oggetto
Veicolo
Veicolo Senza
Motore
Veicolo
A Motore
Motocicletta Automobile
Taxi
Aereo
Per descrivere un sistema sono possibili tassonomie diverse, a seconda degli obiettivi
Automobile Automobile
Benzina Berlina
Diesel Station Wagon
Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009
22
Ereditariet: vantaggi
Esiste per anche un altro motivo, di ordine pratico, per cui conviene usare
l'ereditariet, oltre quello di descrivere un sistema secondo un modello gerarchico;
questo secondo motivo legato esclusivamente al concetto di riuso del software.
In alcuni casi si ha a disposizione una classe che non corrisponde esattamente
alle proprie esigenze. Anzich scartare del tutto il codice esistente e riscriverlo, si
pu seguire con l'ereditariet un approccio diverso, costruendo una nuova classe
che eredita il comportamento di quella esistente, salvo che per i cambiamenti che
si ritiene necessario apportare
Tali cambiamenti possono riguardare sia l'aggiunta di nuove funzionalit che la
modifica di quelle esistenti
Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009
23
Ereditariet
In definitiva, lereditariet offre il vantaggio di ridurre i tempi di sviluppo, in quanto
minimizza la quantit di codice da scrivere quando occorre:
definire un nuovo tipo che un sottotipo di un tipo gi disponibile, oppure
adattare una classe esistente alle proprie esigenze
Non necessario conoscere in dettaglio il funzionamento del codice da
riutilizzare, ma sufficiente modificare (mediante aggiunta o specializzazione) la
parte di interesse
Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009
24
Polimorfismo
Per polimorfismo si intende la propriet di una entit di assumere forme diverse
nel tempo.
Una entit polimorfa se pu fare riferimento, nel tempo, a classi diverse.
Siano ad esempio a, b due oggetti appartenenti rispettivamente alle classi A, B,
che prevedono entrambe una operazione m, con diverse implementazioni. Si
consideri l'assegnazione:
a := b
L'esecuzione della operazione m sull'oggetto a dopo l'assegnazione, per la quale
spesso adoperata la sintassi:
a.m()
produce l'esecuzione della implementazione di m specificata per la classe B.
Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009
25
Polimorfismo: un esempio
Si consideri una gerarchia di classi di figure geometriche:
Sia ad es. A un vettore di N oggetti della classe Figura, composto di oggetti delle
sottoclassi Triangolo, Rettangolo, Quadrato:
Figura A[N]
(ad es.: A[0] un quadrato, A[1] un triangolo, A[2] un rettangolo, etc.)
Triangolo
+disegna()
Rettangolo
+disegna()
Quadrato
+disegna()
Figura
+disegna()
Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009
26
Polimorfismo: un esempio
Si consideri una funzione Disegna_Figure(), che contiene il seguente ciclo:
f or i = 1 t o N do
A[ i ] . di segna( )
L'esecuzione del ciclo richiede che sia possibile determinare dinamicamente (cio
a tempo d'esecuzione) l'implementazione della operazione disegna() da eseguire,
in funzione del tipo corrente dell'oggetto A[i].
Listruzione A[i].disegna() non ha bisogno di essere modificato in conseguenza
dell'aggiunta di una nuova sottoclasse di Figura (ad es.: Cerchio), anche se tale
sottoclasse non era stata neppure prevista all'atto della stesura della funzione
Disegna_Figure(). (Si confronti con il caso dell'uso di una istruzione case nella
programmazione tradizionale).
Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009
27
Polimorfismo: estensibilit e binding dinamico
Il polimorfismo supporta dunque la propriet di estensibilit di un sistema, nel
senso che minimizza la quantit di codice che occorre modificare quando si
estende il sistema, cio si introducono nuove classi e nuove funzionalit.
Un meccanismo con cui viene realizzato il polimorfismo quello del binding
dinamico.
Il binding dinamico (o late binding) consiste nel determinare a tempo
d'esecuzione, anzich a tempo di compilazione, il corpo del metodo da invocare
su un dato oggetto.
Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009
28
Vantaggi della programmazione OO
Rispetto alla programmazione tradizionale, la programmazione orientata agli
oggetti (OOP) offre vantaggi in termini di:
modularit: le classi sono i moduli del sistema software;
coesione dei moduli: una classe un componente software ben coeso in
quanto rappresentazione di una unica entit;
disaccoppiamento dei moduli: gli oggetti hanno un alto grado di
disaccoppiamento in quanto i metodi operano sulla struttura dati interna ad
un oggetto; il sistema complessivo viene costruito componendo operazioni
sugli oggetti;
information hiding: sia le strutture dati che gli algoritmi possono essere
nascosti alla visibilit dall'esterno di un oggetto;
riuso: l'ereditariet consente di riusare la definizione di una classe nel
definire nuove (sotto)classi; inoltre possibile costruire librerie di classi
raggruppate per tipologia di applicazioni;
estensibilit: il polimorfismo agevola l'aggiunta di nuove funzionalit,
minimizzando le modifiche necessarie al sistema esistente quando si vuole
estenderlo.

Potrebbero piacerti anche