Sei sulla pagina 1di 28

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

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.

MODULO
interfaccia
(Visibile dall'esterno)
corpo
(Nascosto all'esterno e
protetto)

Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009

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

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

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

Un ulteriore esempio: un videogioco

Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009

Classi e oggetti: un esempio


Classi
Istanze (Oggetti)

Orco

Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009

Cavaliere

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

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

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

10

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

11

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

12

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

13

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

14

Le classi in C++: un esempio

Inter
faccia

class Contatore {
public:
void Incrementa();
// operazione incremento
void Decrementa();
// operazione decremento
unsigned int give_value(); // restituisce il valore
// corrente
private:
unsigned int value;
// valore corrente
const unsigned int max; // valore massimo

Implem
entazione

};

Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009

15

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).
utente

classe

client

SERVER

Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009

16

Produzione e uso di una classe

Utente.cpp

// Modulo utilizzatore
del modulo
// Contatore
#include Contatore.h
unsigned int i;
Contatore cont1, cont2;
.
.
.
cont1.incrementa();
cont2.decrementa();
i = cont1.get_value();

Contatore.h

Contatore.cpp

// Interfaccia del
// modulo Contatore

// Implementazione del
modulo Contatore

class Contatore {
.
.
.
};

#include Contatore.h
Contatore::incrementa()
{
.
.
}
Contatore::decrementa()
{
.
.
}

Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009

17

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

18

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

19

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

20

Ereditariet: un esempio
Oggetto

Veicolo

Veicolo Senza
Motore

Veicolo
A Motore

Motocicletta

Automobile

Aereo

Taxi

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

21

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

22

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

23

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

24

Polimorfismo: un esempio

Si consideri una gerarchia di classi di figure geometriche:


Figura
+disegna()

Triangolo

Rettangolo

Quadrato

+disegna()

+disegna()

+disegna()

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.)

Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009

25

Polimorfismo: un esempio

Si consideri una funzione Disegna_Figure(), che contiene il seguente ciclo:


for i = 1 to N do
A[i].disegna()

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

26

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

27

Vantaggi della programmazione OO

Rispetto alla programmazione tradizionale, la programmazione orientata agli


oggetti (OOP) offre vantaggi in termini di:
9 modularit: le classi sono i moduli del sistema software;
9 coesione dei moduli: una classe un componente software ben coeso in
quanto rappresentazione di una unica entit;
9 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;
9 information hiding: sia le strutture dati che gli algoritmi possono essere
nascosti alla visibilit dall'esterno di un oggetto;
9 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;
9 estensibilit: il polimorfismo agevola l'aggiunta di nuove funzionalit,
minimizzando le modifiche necessarie al sistema esistente quando si vuole
estenderlo.

Claudio De Stefano - Corso di Programmazione ad Oggetti - a.a. 2008/2009

28

Potrebbero piacerti anche