Sei sulla pagina 1di 11

Modellazione della realt Lastrazione

Modellazione di unauto
la modellazione di un oggetto (p.e. unauto) dipende dalle finalit che
si pone la persona che lo sta analizzando:
lettore di Quattroruote
guidatore
manutentore
progettista del motore
progettista/design della carrozzeria

Laboratorio di Informatica
3. Programmazione ad oggetti in C++

Livelli di astrazione differenti in funzione della persona che vuole


utilizzare loggetto :
chi conosce maggiori dettagli sullauto?
chi conosce meno dettagli dellauto?

Corso di Laurea in Ingegneria Elettronica e Telecomunicazioni


A.A. 2014-2015
2 Semestre
Prof. Giovanni Pascoschi

Laboratorio di Informatica A.A. 2014-2015

Progettazione del software Lastrazione

Astrazione sul controllo


consiste nell'astrarre una data
funzionalit dai dettagli implementativi della stessa funzione; gi
supportata dai linguaggi di programmazione come il linguaggio C
tramite il concetto di sottoprogramma (procedura o funzione).

Puo essere importante per noi conoscere solo come interfacciare


questa funzione, ma non come stata realizzata.

Astrazione dei dati


consiste nell'astrarre le entit (oggetti)
costituenti il sistema, descritte in termini di una struttura dati e delle
funzioni possibili tramite essa. Nel linguaggio C il concetto di tipo di
dato quello di insieme dei valori che pu assumere una
informazione (tipicamente una variabile).

Se avessimo tante funzioni gi pronte e da utilizzare, potremmo


integrare il nostro programma applicativo semplicemente conoscendo
come interfacciare queste funzioni

a cura di Pascoschi Giovanni

Progettazione del software Lastrazione

Nella progettazione software si possono adottare diversi livelli di


astrazione
p.e. possiamo prescindere da come realizzata in
dettaglio una funzione scritta da un altro programmatore

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

Progettazione del software ADT

Progettazione del software OOP

Il tipo di dati astratto (ADT) estende la definizione di dato,


includendo anche l'insieme di tutte e sole le operazioni (funzioni)
possibili su dati di quel tipo. La struttura dati incapsulata nelle
operazioni su di essa definite
incapsulamento di classe/oggetto

Anche nel linguaggio C possibile forzare lapplicazione di una


metodologia basata sugli oggetti, adoperando una opportuna
disciplina di programmazione, aderendo cio ad un insieme di regole,
il cui uso per dipende dal programmatore senza nessun controllo da
parte del compilatore
Un linguaggio di programmazione OOP (Object Oriented
Programming) supporta invece direttamente tecniche di sviluppo
software basate sugli oggetti offrendo meccanismi espliciti per la
definizione di entit (oggetti) che incapsulano una struttura dati nelle
operazioni possibili su di essa. Il C++ permette ad esempio di definire
istanze (cio, variabili) di un ADT (dato tipo astratto). In tal caso il
linguaggio basato su OOP presenta istruzioni per la definizione di
classi ed oggetto. Una classe una implementazione di un tipo di dati
astratto. Un oggetto pu essere riguardato come una istanza di una
classe

Un tipo di dato astratto (ADT) un modello matematico consistente


in una collezione di valori insieme ad una collezione di operazioni
definite sul modello. Gli ADT generalizzano i tipi di dato primitivi
(interi, reali, etc.), mentre le procedure generalizzano le operazioni
primitive (+, -, ...).

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

Progettazione del software OOP

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

Analogia progettista della FIAT

La programmazione orientata agli oggetti OOP intimamente


connessa a tecniche di progettazione/sviluppo di tipo bottom-up. La
metodologia bottom-up mira all'individuazione delle entit astratte
(oggetti) facenti parte del sistema, delle loro propriet e delle
interazioni tra di esse
favorito il riuso del software attraverso
l'individuazione di entit corrispondenti a componenti gi esistenti
una nuova applicazione pu essere costruita a partire da componenti
esistenti (mattoni elementari), opportunamente integrati/assemblati

Un progettista FIAT per progettare unauto ha due possibilit:


1.progettare ogni oggetto dellauto
2.utilizzare oggetti gi realizzati da altre aziende integrandoli con
oggetti progettati internamente nella FIAT

Il linguaggio C invece orientato ad una programmazione di tipo


top-down

Di cosa ha bisogno il progettista per montare un tergicristallo


su unauto FIAT?
conoscere le caratteristiche e le
funzionalit del tergicristallo e come interfacciare loggetto
tergicristallo

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

Cosa sceglie di solito? Occorre progettare ex-novo anche il


tergicristallo?

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

Esempio di oggetto fisico

Esempio di oggetto fisico

Caratterizzazione di unauto

Utilizzazione di unauto

Attributi
colore
potenza
marce
peso
cilindrata

Interfacciamento
pedale dellacceleratore
pedale del freno
leva del cambio
volante

Funzionalit
accelera
frena
cambia marcia
cambia direzione
Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

Esempio di oggetto software

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

10

Perch la programmazione OOP?

Programmare per oggetti non velocizza lesecuzione dei programmi...


Programmare per oggetti non ottimizza luso della memoria...

E allora perch programmare per oggetti?


Dato 1
Dato .....
Dato n

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

11

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

12

Implicazione dellincapsulamento
Lincapsulamento
implementazione

determina

una

Vantaggi della programmazione OOP


netta

divisione

fra

interfaccia

e
La programmazione ad oggetti, attraverso lincapsulamento, consente di:
ridurre la dipendenza del codice di alto livello dalla rappresentazione
dei dati
riutilizzare codice di alto livello
sviluppare moduli indipendenti luno dallaltro
avere codice utente che dipende dalle interfacce ma non
dallimplementazione

Da fuori si vede solo linterfaccia che definisce i messaggi accettati


dalloggetto
I dettagli dellimplementazione (dati e codice delle funzioni) sono invisibili
dallesterno (information hiding)
Ogni oggetto ha in se tutto ci che gli serve per rispondere alle chiamate
Il confinamento di informazioni e funzionalit in oggetti permette livelli
maggiori di astrazione e semplifica la gestione di sistemi complessi.
Cos ? / Com fatto?
Cosa pu fare per me?

Data Oriented
Object Oriented

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

13

Vantaggi della programmazione OOP

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

14

Oggetto in C++
Un oggetto in C++ una entit software che incapsula un insieme di
attributi (o dati) e comprende un insieme di operazioni (o metodi o
funzioni) che manipolano i dati.

Protezione delle strutture dati


Incapsulamento information hiding
Maggiore semplicit di progettazione astratta
progettazione top-down e bottom-up, gerarchia di classi
composizione delle classi come mattoni fondamentali

Linsieme dei valori assunti dai suoi attributi costituisce lo stato dell
oggetto.

Migliore riutilizzazione del codice


composizione, aggregazione, derivazione

Linsieme delle sue operazioni definiscono il comportamento


delloggetto.

Migliore manutenzione del codice


le modifiche sono realizzate mediante aggiunta di classi e funzioni
virtuali non necessario riprendere e modificare lintero codice
Migliore documentazione del codice
Strumenti grafici del tipo UML
Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

15

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

16

Classe in C++

Classe in C++

Il concetto di classe fornisce al programmatore uno strumento per


creare nuovi tipi che possono essere usati facilmente come i tipi
predefiniti (int, float, double, etc.)

Ogni oggetto istanza di una determinata classe


Una classe definisce una tipologia di oggetti che possono essere
descritti dallo stesso insieme di attributi e dallo stesso insieme di
metodi

Un tipo la rappresentazione concreta di un concetto. Ad es., il tipo


predefinito double, insieme alle sue operazioni +, -, * e /, fornisce una
rappresentazione del concetto di numero reale

Due istanze della stessa classe condividono le stesse propriet


strutturali (attributi) e le medesime propriet comportamentali
(metodi), ma sono comunque oggetti distinti

Una classe quindi un nuovo tipo definito dal programmatore. Si


progetta un nuovo tipo per fornire la definizione di un concetto che non
definito direttamente tra i tipi predefiniti (in maniera analoga alla
struct)

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

17

Classe in C++ (sintassi)

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

18

Oggetti in C++

una classe il modello-prototipo al quale si conformano gli oggetti che


istanziano la classe

Definita una classe, possono essere generate istanze della classe,


ossia oggetti con la seguente sintassi:

sintassi/struttura di una classe:


class nome_classe {
private:
/* (default) dati e metodi accessibili solo ai metodi della classe. Sono
quindi nascosti allesterno (non accessibili direttamente) */
protected:
prossime lezioni
/* privati allesterno; dati e metodi accessibili solo allinterno della classe
e tramite classi derivate */
public:
/* dati e metodi accessibili pubblicamente a tutte le funzioni dello stesso
scope delloggetto */
};

nome_classe

identificatore;

Per accedere ai singoli membri delloggetto si usa loperatore . in


maniera simile al caso delle strutture.

le componenti funzionali dichiarati in una struttura possono essere definite


all'interno (inline) o all'esterno

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

19

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

20

Esempio1: classe in C++

#include <iostream>
using namespace std;
class Rettangolo {
// attributi
double base, altezza;
// metodi
public:
void Set (double b, double h) {
base = b;
altezza = h;
}

Esempio2: classe in C++


#include <iostream>
using namespace std;
class orologio {
public:
// attributi
int ora;
int minuti;
int secondi;
// metodi
void init(int h, int m, int s) {
ora = h;
minuti = m;
secondi = s;
}
};

int main ( ) {
Rettangolo tovaglia; // istanza oggetto
tovaglia.Set (12.0, 30.0);
cout<<larea e:<< tovaglia.Area( );
return 0;
}

double Area( ) {
return base * altezza;

int main ( ) {
orologio a;
// istanza oggetto a
a.init(12, 30, 20);
orologio b;
// istanza oggetto b
b.init(15, 05, 30);
// 12
cout << a.ora << "\n";
cout << a.minuti << "\n"; // 30
cout << b.ora << "\n";
// 15
b.ora = a.ora + 1;
cout << b.ora << "\n";
// 13
return 0;
}

}
};
Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

21

Classe in C++ : dati membro (attributi)

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

22

Classe in C++ : funzioni membro (metodi)


I metodi sono dichiarati allinterno della classe, ma possono essere definiti sia
allinterno della classe che allesterno

Non possibile inizializzare dati membro di tipo privato


Per ovviare al problema di inizializzare attributi privati si utilizzano i
costruttori

chiamate a funzioni membro tramite loperatore .


p.e. :
r1.funz1( ); //rappresenta linvio di un messaggio alloggetto r1 perch esegua un
determinato compito

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

23

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

24

Esempio classe in C++ (campi pubblici & privati)

Classe in C++ : funzioni membro (metodi)

#include <iostream>
using namespace std;
class orologio {
private:
// attributi
int ora;
int minuti;
int secondi;
public:
// metodi
void init(int h, int m, int s) {
ora = h;
minuti = m;
secondi = s;
}
void stampa( ) {
cout << ora << :" << minuti
<< :" << secondi << endl;
}
};

I tipi di funzione membro (metodi):


Costruttori e distruttori
si invocano automaticamente alla
creazione e alla distruzione di un oggetto
Selettori (get)

restituiscono valori di attributi privati

Modificatori (set)
Operatori
Iteratori

modificano valori di attributi privati

definiscono operatori standard C++


elaborano insiemi di oggetti come gli array

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

25

Esempio classe in C++ (metodi definiti fuori dalla Classe)


#include <iostream>
using namespace std;
class orologio {
private:
// attributi
int ora;
int minuti;
int secondi;
public:
// metodi
void init(int h, int m, int s);
void stampa( );
};
void orologio::init(int h, int m, int s){
ora = h;
minuti = m;
secondi = s;
}
void orologio::stampa( ) {
cout << ora << :" << minuti
<< :" << secondi << endl;
}

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

26

Classi in C++ : costruttori

int main ( ) {
orologio a;
// istanza oggetto a
a.init(12, 30, 20);
orologio b;
// istanza oggetto b
b.init(15, 05, 30);
cout << a.ora << "\n"; // errore
a.minuti = 25; // errore
a.stampa( ); // 12 : 30 : 20
cout << b.ora << "\n"; // errore
b.ora = a.ora + 1; // errore
b.stampa( ); // 15 : 05 : 30
a = b; // loggetto b assegnato ad a
return 0;
}

a cura di Pascoschi Giovanni

Laboratorio di Informatica A.A. 2014-2015

int main ( ) {
orologio a;
// istanza oggetto a
a.init(12, 30, 20);
orologio b;
// istanza oggetto b
b.init(15, 05, 30);
cout << a.ora << "\n";
// errore
a.minuti = 25;
// errore
a.stampa( ); // 12 : 30 : 20
cout << b.ora << "\n";
// errore
b.ora = a.ora + 1;
// errore
b.stampa( ); // 15 : 05 : 30
return 0;
}

Per autoinizializzare gli attributi privati di un oggetto si utilizza il costruttore


Il costruttore il metodo che parte automaticamente alla creazione
delloggetto (anche se non definito esplicitamente dal programmatore, di
default parte sempre allistanza delloggetto) #include <iostream>
using namespace std;
class Rettangolo {
// attributi
double base, altezza;
il costruttore ha lo stesso nome della classe // metodi
il costruttore non ritorna alcun tipo di dato public:
void Set (double b, double h);
double Area( );
// costruttore
Rettangolo ( ) {
base = 0.0;
altezza = 0.0;
};
};
27

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

28

Esempio classe in C++ (costruttori)

Classi in C++ : costruttori

#include <iostream>
using namespace std;
class orologio {
private:
// attributi
int ora;
int minuti;
int secondi;
public:
// metodi
orologio(int h, int m, int s);
void stampa( );
};
orologio::orologio(int h, int m, int s){
ora = h;
minuti = m;
secondi = s;
}
void orologio::stampa( ) {
cout << ora << :" << minuti
<< :" << secondi << endl;
}

Un costruttore con parametri si dice costruttore alternativo


esempio
Rettangolo (10.0, 30.0);
un costruttore, come per qualsiasi funzione (escluso il distruttore) puo
essere sovraccaricata (overload)
viene eseguito un unico costruttore in
funzione del tipo e quantit di parametri utilizzati

Rettangolo r1(20.0, 13.0);

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

29

int main ( ) {
orologio a(12, 30, 20);
a.stampa( );
return 0;
}

Laboratorio di Informatica A.A. 2014-2015

// istanza oggetto a
// 12 : 30 : 20

N.B.: i costruttori hanno lo stesso nome


della classe e non specificano alcun
valore di ritorno

a cura di Pascoschi Giovanni

30

a cura di Pascoschi Giovanni

32

Esempio classe in C++ (distruttori)

Classi in C++ : distruttori

#include <iostream>
using namespace std;
class Rettangolo {
// attributi
double base, altezza;
// metodi
public:
void Set (double b, double h);
double Area( );
// costruttore
Rettangolo ( ) {
base = 0.0;
altezza = 0.0;
};
// distruttore

Un distruttore un metodo speciale (opzionale) che viene chiamato


automaticamente quando si distrugge un oggetto
esempio
~Rettangolo ( );
Il distruttore serve normalmente per liberare la memoria assegnata dal
costruttore
Se non dichiarato dal programmatore il C++ ne crea automaticamente
uno vuoto

Rettangolo ( ) {
cout<<Oggetto eliminato;
};
};
Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

31

Laboratorio di Informatica A.A. 2014-2015

Classi in C++ : classi composte

Classi in C++ : overloading di funzioni membro

Un classe composta quando contiene membri dato che sono a loro


volta delle classi
class orologio {

i metodi come qualsiasi altra funzione possono essere sovraccaricati


(overload)

private:
// attributi
int ora;
int minuti;
int secondi;
public:
// metodi
orologio(int h, int m, int s);
void stampa( );
};
class data {
int giorno;
int mese;
int anno;
orologio time;
// metodi
.
}

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

i costruttori sono i metodi che normalmente sono sovraccaricati

33

Classi in C++ : rappresentazione UML

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

34

Classi in C++ : esempio numeri complessi

Per rappresentare graficamente le classi si usa lo standard UML (Unified


Modelling Language)

complesso

Esempio

Rettangolo

pr : float

base
altezza

pi : float
complesso()
complesso()
cadd()
csub()
cmult()
visualizza()

Assegna()
Area()

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

35

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

36

Esempio numeri complessi (#1)

Esempio numeri complessi (#2)


// definizione metodi della classe
complesso::complesso(float x, float y)
{
pr=x;
pi=y;
}
void complesso::cadd(complesso arg)
{
pr+=arg.pr;
pi+=arg.pi;
}
void complesso::csub(complesso arg)
{
pr-=arg.pr;
pi-=arg.pi;
}
void complesso::cmult(complesso arg){
float temp1, temp2;
temp1=pr*arg.pr - pi*arg.pi;
temp2=pr*arg.pi + pi*arg.pr;
pr=temp1;
pi=temp2;
}

#include <iostream>
#include <conio.h>
using namespace std;
class complesso {
private:
float pr, pi;
public:
complesso( ) {pr=0; pi=0; }
complesso(float x,float y);
void cadd(complesso arg);
void csub(complesso arg);
void cmult(complesso arg);
void visualizza();

//costruttore di default
//altro costruttore
//operazione addizione
//operazione sottrazione
//operazione moltiplicazione

};

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

Laboratorio di Informatica A.A. 2014-2015

37

Esempio numeri complessi (#3)

// allocazione dinamica delloggetto


puntato da c

Laboratorio di Informatica A.A. 2014-2015

a.csub(b);
a.visualizza();
b.visualizza();

// differenza a-b

a.cmult(b);
a.visualizza();
b.visualizza();

// moltiplicazione a*b

getch();
return 0;

a.visualizza();
b.visualizza();
c->visualizza();
a.cadd(b);
b.cadd(b);
a.visualizza();
b.visualizza();

38

Esempio numeri complessi (#4)

void complesso::visualizza(){
if(pi<0.0)
cout << '\n' << "complesso: " << pr << "- j" << abs(pi);
else
cout << '\n' << "complesso: " << pr << "+ j" << pi;
}
int main(){
complesso a(1,3), b(2,2);
complesso *c;
c = new complesso(5.1,2.2);

a cura di Pascoschi Giovanni

// somma a+b
// somma b+b

a cura di Pascoschi Giovanni

39

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

40

Riepilogo della lezione

Fine della lezione

Programmazione ad oggetti in C++


Astrazione
Progettazione del software - OOP
Classi e oggetti in C++
Membri pubblici/privati
Costruttori/distruttori

Laboratorio di Informatica A.A. 2014-2015

Domande?

a cura di Pascoschi Giovanni

41

Laboratorio di Informatica A.A. 2014-2015

a cura di Pascoschi Giovanni

42

Potrebbero piacerti anche