Il paradigma a oggetti
La programmazione ad oggetti
Il progetto del software
Obiettivo della progettazione: produrre software con le caratteristiche di qualità che sono state
definite nella fase di analisi e specifica dei requisiti.
Caratteristiche fondamentali per garantire la qualità del software e ridurre i costi e i tempi di
produzione:
Affidabilità

Modificabilità: un programma utile deve poter essere modificato

Comprensibilità: facilità di interpretazione del codice

Riusabilità: poter riutilizzare un’applicazione o una sua parte comporta dei vantaggi
nella riduzione dei tempi e costi di sviluppo e consente di utilizzare una parte di software
già testato

Il paradigma ad oggetti
2
Programmazione orientata agli oggetti
Basata sul concetto di astrazione dei dati.
Si focalizza l’attenzione su categorie concettuali dei dati del dominio applicativo.
Costruire il programma in termini di “entità”, rappresentate da
una struttura dati interna nascosta
operazioni che possono agire sui dati
Vantaggi:
•Agevola la modularità
•Favorisce il controllo sull’integrità dei dati (solo certe funzioni possono agire sui dati)
•Favorisce la creazione di componenti autonomi e testati
Il paradigma ad oggetti
3
Concetti fondamentali
Oggetto:
insieme di dati e di metodi per operare sui dati. I dati vengono detti anche attributi
Classe:
è uno “stampo”, un modello per la creazione di oggetti. A partire da una classe si
possono creare più oggetti. Ogni oggetto è detto istanza della classe.
Messaggio:
consente agli oggetti di comunicare tra loro
Eredità:
fornisce un meccanismo potente per l’organizzazione e la strutturazione del software. La
classe erede incorpora alcuni attributi e alcuni metodi della classe genitore
Il paradigma ad oggetti
4
Cosa sono gli oggetti
Versione informatica degli oggetti "reali“ o “astratti”
Dotati di una loro propria "individualità"
Capaci di interagire per scambio di messaggi
Caratterizzati da proprietà
dati:
funzioni:
ne descrivono lo “stato”
ne descrivono il “comportamento”
Un messaggio modifica lo stato e attiva comportamenti
Un oggetto è una coppia (stato,funzioni)
Il paradigma ad oggetti
5
Oggetto automobile
Funzioni
- Avviati
- Fermati
- Accelera
-…
Il paradigma ad oggetti
Dati:
- Targa
- Colore
- Velocità
- Livello benzina
- ...
6
Il concetto di Classe
Una classe può essere vista come “stampo” per la creazione di oggetti.
Esempio:
classe bicicletta
oggetto la mia bicicletta
I valori di alcuni attributi possono essere comuni a tutti gli oggetti della classe (variabili di
classe)
I valori di altri attributi dipendono invece dalla particolare istanza (variabili di istanza)
Discorso analogo vale per i metodi.
Il paradigma ad oggetti
7
I linguaggi ad oggetti
Forniscono come astrazione base la possibilità di definire classi, di mettere in relazione classi
tramite l’ereditarietà, di istanziare oggetti a partire da una classe.
Linguaggi a Oggetti “puri”: la classe e gli oggetti sono le uniche astrazioni del linguaggio
(Smalltalk, Java)
Linguaggi a Oggetti “non puri”: aggiungono l’astrazione di classe e oggetto ai costrutti
tradizionali della programmazione (C++, Object Pascal, ..)
Il paradigma ad oggetti
8
Classi: esempio
Classe
bicicletta
Attributi di classe
Numero di ruote
Numero di pedali
Attributi di istanza
Colore
Numero di rapporti
Tipo
Velocità corrente
Metodi di istanza (modificano lo
stato della particolare bicicletta)
Cambiare rapporto
Accelerare
Frenare
Il paradigma ad oggetti
9
Messaggi
Definizione:
Mezzo di comunicazione tra oggetti
Quando un oggetto A vuole che un oggetto B esegua uno dei suoi metodi, gli invia un
messaggio
A
messaggio
B
Componenti di un messaggio:
L’oggetto a cui il messaggio è indirizzato
Il nome del metodo da eseguire
Eventuali parametri di cui il metodo necessita per essere eseguito
Il paradigma ad oggetti
10
Messaggi: esempio
Oggetto A: ciclista
Oggetto B: bicicletta
A invia a B il seguente messaggio m:
ciclista
m
bicicletta
m = bicicletta.cambiaRapporto (r )
Il paradigma ad oggetti
11
Java
E’ un linguaggio ad oggetti puro: tranne i tipi di dati primitivi di base (int, float,
double,...), tutto il resto in una applicazione sono oggetti appartenenti a classi.
Un programma è un insieme di classi: non esistono funzioni definite a livello esterno.
Anche il metodo main() è definito dentro una classe.
Viene fornito con una notevole gerarchia di classi standard già pronte
Architettura indipendente dalla piattaforma.
Il paradigma ad oggetti
12
Programmi in Java
Un programma è definito da un insieme di classi e, durante l’esecuzione, dagli oggetti che a
partire da tali classi verranno istanziati.
Le classi sono entità statiche, definite prima della esecuzione. Non esiste nulla che non sia
definito all’interno di qualche classe.
Gli oggetti sono entità dinamiche che assumono esistenza a partire da classe durante
l’esecuzione di un programma.
All’interno di una classe ci può essere solo una funzione pubblica di nome main() con la
seguente interfaccia:
public static
Il paradigma ad oggetti
void main(String args[])
13
Classi
• una classe ha un nome, e contiene due tipi di membri:
campi e metodi
metodo
metodo
campi
metodo
metodo
“Tipo di dati astratti” (ADT)
Il paradigma ad oggetti
14
Oggetti
Un oggetto è una istanza (“esemplare”) di una classe, che viene creato
(“instanziato”) dinamicamente (durante l’esecuzione del programma)
valori
DJ197QA
variabili
a
BQ895SZ
Automobile
DB117ZW
b
c
Due esemplari della stessa classe sono distinguibili soltanto per il loro
stato (il valore dei loro campi), mentre il comportamento è sempre
identico
Il paradigma ad oggetti
15
Una classe java: Automobile
1. class Automobile {
2.
String targa;
3.
int velocità;
4.
Color colore;
5.
...
6.
public void Avviati () {
7.
...
8.
}
9.
public void Fermati () {
10.
}
11. }
Il paradigma ad oggetti
Nome di classe
campi
metodi
16
Oggetti esempio Java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class Automobile {
...
}
...
Automobile a, b, c; // vengono solo definiti tre riferimenti a oggetti
a = new Automobile();
b = new Automobile(); // l’oggetto viene creato e inizializzato
c = new Automobile();
...
a.Avviati(); // viene richiesta una operazione all’oggetto
...
Il paradigma ad oggetti
17
Incapsulamento
Alcuni attributi (dati e metodi) sono pubblici (public) (cioè visibili "all'esterno")
Altri attributi sono privati (private) dell'oggetto, e quindi “nascosti” all’esterno
(“information hiding”)
Il programmatore può modificare le parti private senza effetti per gli utilizzatori dell'oggetto
Propagazione delle modifiche assai contenuta
Il paradigma ad oggetti
18
Esempio: Automobile
Parti "visibili" (interfaccia pubblica): accesso a "ciò che l'auto può fare"
volante, freno (ev. a mano)
blocchetto di accensione, oppure manovella
pedale dell'acceleratore, acceleratore automatico
cambio manuale, oppure cambio automatico
Parti "nascoste" (implementazione): "come l'auto fa ciò che si può fare"
meccanica dello sterzo e dell'alimentazione
elettromeccanica dell'avviamento
sistema di alimentazione e accensione
Il paradigma ad oggetti
19
I’incapsulamento: approcci
Approccio "puro"
lo stato è privato, e lo si può modificare solo attraverso quei metodi che sono
stati dichiarati pubblici .
Esempio: Fermati()
Approccio di Java
anche le componenti dello stato possono essere dichiarate pubbliche e
modificate dall'esterno
Esempio: velocita=0
Si consiglia comunque di implementare
per quanto possibile l’approccio puro
Il paradigma ad oggetti
20
Interazioni tra oggetti
Gli oggetti possono comunicare e interagire mediante scambio di messaggi attraverso le
loro interfacce pubbliche (stato o funzioni)
Per mezzo di un messaggio un oggetto può chiedere un'informazione a un altro oggetto,
causarne un cambiamento di stato, oppure delegargli un'attività
Un messaggio in arrivo viene trattato dal metodo omonimo del ricettore, il quale "si
attiva" per rispondere, per cambiare di stato, oppure per intraprendere un'attività
Il paradigma ad oggetti
21
Esempio: una automobile
Il sistema antiskid durante una frenata invia periodicamente un messaggio alle ruote
per "leggere" la loro velocità di rotazione
Il galleggiante nel serbatoio del carburante invia messaggi all'indicatore di livello sul
cruscotto per "scrivervi" un nuovo stato
Il volante tornando alla posizione di riposo invia un messaggio al comando meccanico
dell'indicatore di direzione per delegargli il compito di interrompere l'eventuale segnale
lampeggiante ("togliere la freccia")
Il paradigma ad oggetti
22
Oggetti composti
Un oggetto può essere costituito da altri oggetti
automobile
ruota
Il paradigma ad oggetti
carrozzeria
motore
23
Ereditarietà
È il meccanismo che consente di derivare una sottoclasse da una classe data
Una sottoclasse si ottiene per aggiunta, per occultamento o per ridefinizione di uno o più
membri rispetto alla classe di partenza (che diventa una superclasse della nuova classe)
Esempio:
StartTassametro
EndTassametro
Licenza
automobile
Il paradigma ad oggetti
taxi
24
Classe Taxi
1. class Taxi extends Automobile { // eredita le proprietà di Automobile
2.
3.
int licenza;
// è un nuovo campo
4.
5.
public void StartTassametro() { // è un nuovo metodo
6.
...
7.
}
8.
9.
public void EndTassametro () {
// è un nuovo metodo
10.
...
11.
}
12.
13. }
Il paradigma ad oggetti
25
Esempi
Implementazione di un'interfaccia grafica
classe "finestra": attributo privato "sfondo" e metodo "cambia-sfondo"
sottoclasse "finestra-nera": attributo privato "sfondo" ridefinito con il valore costante
"nero", metodo "cambia-sfondo" occultato
Libreria di algebra lineare:
classe "matrice": metodo "determinante" generico
sottoclasse "matrice-diagonale": metodo "determinante" che moltiplica tra di loro gli
elementi sulla diagonale
Dichiarazione dei redditi
classe "contribuente": quadri del modello 740 base
classe "autonomi": aggiunta del membro "quadro-E"
Il paradigma ad oggetti
26
La gerarchia delle classi
Specializzazione
Generalizzazione
instanziazione
Il paradigma ad oggetti
27
Esempio
Object
Veicolo
VeicoloSenza
Motore
Veicolo
A Motore
Motocicletta
Automobile
Taxi
Il paradigma ad oggetti
28
Aggiungere sottoclassi
Object
Veicolo
VeicoloSenza
Motore
Veicolo
A Motore
Motocicletta
Automobile
Altro
Taxi
Il paradigma ad oggetti
29
Ridefinizione dei metodi
Veicolo A Motore
Noleggia
Motocicletta
Automobile
ereditano il metodo
Il paradigma ad oggetti
Aereo
Noleggia
utilizza la versione locale
30
Polimorfismo
Una funzione si dice polimorfa se è capace di operare su oggetti di tipo diverso specializzando
il suo comportamento in base al tipo dell’oggetto su cui opera.
Tutto ciò che è definito per una classe, vale anche per le sue sottoclassi.
Se una proprietà viene ridefinita, quando la uso viene selezionata sempre la versione corretta
Esempio:
Quando uso un metodo di un oggetto generico, non so:
a quali livelli è definito
quale tra i metodi omonimi nella gerarchia verrà usato
Il paradigma ad oggetti
31
Polimorfismo
Polimorfismo orizzontale:
Studente s = new Studente(“Rossi”); s.print();
Point p = new Point(3, 5); p.print();
Polimorfismo verticale:
Persona p = new Studente(“Rossi”);
p.print(); // stampa nome e matricola (legame dinamico)
Il paradigma ad oggetti
32
Visibilità dei nomi
nome
gerarchia di classi
Il messaggio inviato all’oggetto
risale nella gerarchia fino
a trovare una definizione
b.nome
oggetto b
Il paradigma ad oggetti
oggetto a
33
Ereditarietà multipla
Meccanismo che consente di derivare sottoclassi da due o più classi
Mezzo
Pubblico
Automobile
Taxi
Il problema degli omonimi
Java non implementa ereditarietà multipla
Il paradigma ad oggetti
34
Riuso del software
Classi specifiche
Classi specializzate
Classi generali
sviluppo interno
dal fornitore di classi
col linguaggio
Linguaggio
Il paradigma ad oggetti
35
La classe Object: metodi
Il paradigma ad oggetti
36
Polimorfismo
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
public class TestToString {
static public void main(String[] args) {
Object o = new Object();
System.out.println(o);
MyObject m = new MyObject();
System.out.println(m);
java.lang.Object@720eeb
MyObject@310d42
MyObjectExt e = new MyObjectExt();
Oggetto MyObjectExt
System.out.println(e);
}
}
class MyObject extends Object { }
class MyObjectExt extends MyObject {
public String toString() {
return "Oggetto MyObjectExt";
}
}
Il paradigma ad oggetti
37
Polimorfismo
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
public class TestToString {
static public void main(String[] args) {
Object o = new Object();
System.out.println(o);
java.lang.Object@720eeb
o = new MyObject();
System.out.println(o);
MyObject@310d42
o = new MyObjectExt();
System.out.println(o);
Oggetto MyObjectExt
}
}
class MyObject extends Object { }
class MyObjectExt extends MyObject {
public String toString() {
return "Oggetto MyObjectExt";
}
}
Il paradigma ad oggetti
38
Scarica

Programmazione ad oggetti