Object-Oriented Programming (OOP)
Romina Eramo
[email protected]
http://www.di.univaq.it/romina.eramo/tlp
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Roadmap
• Introduzione ai linguaggi di programmazione
• Principi base del paradigma OO
– Astrazione
– Oggetto e Classe
– Incapsulamento e Information Hiding
– Modularità
– Ereditarietà
– Polimorfismo
• Java vs C++
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
I linguaggi di programmazione
• La programmazione può essere definita come la
disciplina che demanda al calcolatore elettronico la
soluzione di un determinato problema
• Un linguaggio di programmazione è un insieme di
parole, codici, e simboli che permettono al
programmatore di dare istruzioni al calcolatore
• Diversi linguaggi di programmazione sono stati
concepiti nel corso degli anni, ognuno con le proprie
regole, o sintassi per scrivere tali istruzioni
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
...verso i linguaggi ad alto livello
• Linguaggio macchina
– linguaggio in cui sono scritti programmi direttamente
eseguibili dal calcolatore
• Linguaggio ad alto livello
– linguaggio indipendente dall'hardware e più "facile"
da utilizzare per il programmatore umano
– richiede una traduzione in linguaggio macchina
• la compilazione: traduzione che avviene una sola volta
• l’interpretazione: traduzione in tempo reale
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
...i livelli di astrazioni
• Tutti i linguaggi di programmazione forniscono astrazioni
– in linguaggio macchina sono definite l'insieme di istruzioni
fondamentali che un processore è in grado di compiere e in cui i codici
di programmi da eseguire devono essere tradotti
– i linguaggi a più alto livello si ottengono come semplice codifica a
partire dal linguaggio macchina in un crescendo di astrazione
• La complessità dei problemi che si è in grado di risolvere è
direttamente correlata al genere e alla qualità
dell’astrazione considerata
– Il linguaggio assembler è una piccola astrazione della macchina
sottostante
– I cosiddetti linguaggi “imperativi” (Fortran, BASIC, C) sono astrazioni
del linguaggio assembler anche se comunque continuano ad imporre di
pensare in termini di struttura del calcolatore invece che della
struttura del problema che si sta risolvendo
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
...i livelli di astrazioni
• Tocca al programmatore stabilire
l’associazione fra il modello della macchina
(nello “spazio delle soluzioni”) e il modello del
problema che viene risolto (nello “spazio dei
problemi”)
• Anziché modellare una macchina per risolvere
il problema si può pensare di modellare il
problema
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Paradigmi di programmazione
Linguaggio
Modello
computazionale
In cosa consiste un programma
Imperativo Cambiamenti di
Esempi
Sequenza di assegnazioni che
stato della memoria producano lo stato finale
della macchina
(soluzione del problema)
Pascal, C
Funzionale
Definizione ed
applicazione di
funzioni
Combinazioni di funzioni valutate
per restituire un certo output
Lisp
Logico
Predicati logici
come specifiche
eseguibili
Sequenza di asserzioni di fatti e
regole eseguite per verificare il
soddisfacimento del goal
Prolog
Ad oggetti
Modello ad oggetti
Progettazione e realizzazione di
codice sotto forma di classi che
interagiscono tra di loro
Java,
C++
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Storia dei linguaggi di programmazione
ForTran
anni ‘50
Cobol
Lisp
Algol
anni ‘60
‘60
BASIC
Pascal
C
Smalltalk
SIMULA 67
anni ‘65
anni ‘70
ModulaModula-2
Ada
C ++
anni ‘80
Java
anni ‘95
• Fortran (Formula translator)
– 1954-1956 da John Backus presso IBM
– espressioni esprimibili per mezzo di notazioni matematiche ordinarie
• i+2*j)
– primo linguaggio ad introdurre le variabili, cicli, procedure, etc.
– nessun supporto per ricorsione e gestione implicita della memoria
• Cobol
– 1959 da Grace Murray Hopper
– applicazioni finanziarie
– sintassi definita in modo da rendere la scrittura di istruzioni simile alla
scrittura di frasi nel linguaggio naturale
• e.g., “add 1 to x giving y” (y = x+1)
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Storia dei linguaggi di programmazione
ForTran
anni ‘50
Cobol
Lisp
Algol
anni ‘60
BASIC
SIMULA 67
anni ‘65
Pascal
C
Smalltalk
anni ‘70
‘70
ModulaModula-2
Ada
C ++
Java
anni ‘80
anni ‘95
• Lisp
–
–
–
–
1965 da John McCarthy
funzioni high-order
garbage collection
Successori del LISP: Miranda, ML, Haskell anche se non particolarmente usati
• Algol
– 1958-1960 da un comitato internazionale di informatici
– un migliore sistema dei tipi
– prime strutture dati
• Entrambi hanno ricorsione, funzioni e procedure
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Storia dei linguaggi di programmazione
ForTran
anni ‘50
Cobol
Lisp
Algol
anni ‘60
BASIC
SIMULA 67
anni ‘65
Pascal
C
Smalltalk
anni ‘70
ModulaModula-2
Ada
C ++
anni ‘80
‘80
Java
anni ‘95
• BASIC 1964 Kemeny e Kurtz
– Il primo linguaggio di programmazione pensato per uso personale
– Semplice da imparare anche se limitato
– Le versioni correnti del linguaggio non sono così “basic” e semplici da
imparare
• SIMULA 67
– Estensione di Algol 60 progettato per la simulazione di processi concorrenti
– Introduce i concetti base dell’object oriented: classe ed incapsulamento
– Predecessore di Smalltalk e C++
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento
Ingegneria
CSI 3125,
History,dipage
10e
Scienze dell’Informazione e Matematiche
Storia dei linguaggi di programmazione
ForTran
anni ‘50
‘50
Cobol
Lisp
Algol
anni ‘60
BASIC
SIMULA 67
anni ‘65
Pascal
C
Smalltalk
anni ‘70
ModulaModula-2
Ada
C ++
anni ‘80
Java
anni ‘95
‘95
• Pascal
– Successore di Algol 60.
– Ottimo linguaggio per introdurre la programmazione strutturata
– Un buon primo linguaggio da imparare
• ModulaModula-2
– Successore di Pascal
– Meccanismi per gestire la concorrenza (più processi in parallelo)
• Ada
– Progettato per supportare in maniera efficace la concorrenza
– Ci sono due standard: Ada 83 (l’originale), and Ada 95
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento
Ingegneria
CSI 3125,
History,dipage
11e
Scienze dell’Informazione e Matematiche
Storia dei linguaggi di programmazione
ForTran
anni ‘50
Cobol
Lisp
Algol
anni ‘60
BASIC
SIMULA 67
anni ‘65
Pascal
C
Smalltalk
anni ‘70
ModulaModula-2
Ada
C ++
anni ‘80
‘80
Java
anni ‘95
• C
– Il linguaggio di implementazione di Unix
– Pericoloso se non usato opportunamente: non raccomandato per
i programmatori inesperti
– Relativamente di basso livello
• Smalltalk
– Linguaggio di programmazione object-oriented più pulito di
Java e molto più pulito di C++
– Viene fornito con un’interfaccia grafica ed un ambiente di
programmazione integrato
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento
Ingegneria
CSI 3125,
History,dipage
12e
Scienze dell’Informazione e Matematiche
Storia dei linguaggi di programmazione
ForTran
anni ‘50
Cobol
Lisp
Algol
anni ‘60
‘60
BASIC
SIMULA 67
anni ‘65
Pascal
C
Smalltalk
anni ‘70
ModulaModula-2
Ada
C ++
Java
anni ‘80
anni ‘95
‘95
• C++
– Estensione object-oriented del linguaggio imperativo C
– Sintassi complicata con difficile semantica
– Molto richiesto
• Java
– Rielaborazione del C++
– Full object orientation (anche se non ai livelli di Smalltalk)
– Progettato per la programmazione Internet programming, anche se generalpurpose
– Solitamente è considerato essere lento
– Forse il prossimo standard de-facto
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento
Ingegneria
CSI 3125,
History,dipage
13e
Scienze dell’Informazione e Matematiche
Storia dei linguaggi di programmazione
ForTran
anni ‘50
Cobol
Lisp
Algol
anni ‘60
‘60
BASIC
SIMULA 67
anni ‘65
Pascal
C
Smalltalk
anni ‘70
ModulaModula-2
Ada
C ++
anni ‘80
Java
anni ‘95
• Linguaggi di Scripting
– Text processing:
• Perl
• Python
– Web programming
• JavaScript
• PHP
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento
Ingegneria
CSI 3125,
History,dipage
14e
Scienze dell’Informazione e Matematiche
Computer Languages History
• Per maggiori dettagli: http://www.levenez.com/lang/
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Jump star to OOP
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Perchè OOP?
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Perchè OOP?
Portare lo sviluppo
software vicino alla
vita reale
Nella vita reale abbiamo a che
fare con oggetti.
Vogliamo trattare con il software
allo stesso modo.
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Perchè OOP?
Separazione di
concetti
Nella
vita
reale
non
ci
preoccupiamo di come un oggetto
è fatto o di cosa contiene. Ci
limitiamo ad usarlo.
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Perchè OOP?
Le componenti sono
replicabili
Nella vita reale le componenti
con funzionalità e specifiche
simili sono replicabili.
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Perchè OOP?
Sviluppo di
componenti in
parti distinte
Nella vita reale gli sviluppatori di una
componente non si preoccupano dell’intero
sistema, o di come le sue componenti saranno
usate nell’intero sistema.
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Perchè OOP?
Fornire la struttura
e realizzare
prototipi
Nella vita reale pensiamo alla struttura
e produciamo modelli software e
sviluppiamo prototipi prima di ottenere
un'istanza effettiva.
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Perchè OOP?
Usa e getta
Nella vita reale usiamo le
componenti e una volta che
abbiamo finito con esse le
scartiamo.
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Perchè OOP?
Riuso di componenti
Nella vita reale la stessa componente
può essere usata (riusata) per una
molteplicità di sistemi.
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Perchè OOP?
Sistema facile da
capire
Nella vita reale possiamo comprendere sistemi
complessi adottando un approccio top-down o
botton-up. Questo ci conduce verso piccoli oggetti.
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Cosa è OOP?
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Cosa è OOP?
L’ OOP (Object-oriented programming) è un
paradigma di programmazione organizzato
attorno ad “oggetti” piuttosto che “azioni”
e “dati” piuttosto che “ logica”
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Cosa è OOP?
• L’OOP prevede di raggruppare in un’unica
entità “classe” sia le strutture dati che le
procedure che operano su di esse, creando un
“oggetto” software dotato di proprietà
(dati
dati)
procedure)
dati e metodi (procedure
procedure che operano sui
dati dell’oggetto stesso
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Principi base del paradigma OO
• Astrazione
• Incapsulamento & Information Hiding
• Modularità
• Gerarchia
• Polimorfismo
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Astrazione
“Qualsiasi modello include gli aspetti più importanti o
essenziali di qualcosa mentre ignora i dettagli meno
importanti, immateriali. Il risultato è di rimuovere le
differenze ed enfatizzare gli aspetti comuni”
[Dizionario di Object Technology – Firesmith, Eykholt 1995]
“Un’astrazione deve denotare le caratteristiche essenziali
di un oggetto contraddistinguendolo da tutti gli altri
oggetti e fornendo, in tal modo, dei confini concettuali ben
precisi relativamente alla prospettiva dell’osservatore”
[Grady Booch]
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Astrazione
• Utilizzata per gestire la complessità di un
programma concentrandosi sulle caratteristiche
essenziali di un’entità che la distingue dalle altre
• Applicata per decomporre sistemi software complessi in
componenti più piccoli e semplici che possono essere
gestiti con maggiore facilità ed efficienza
• E’ dipendente dal dominio e dalla prospettiva, cioè quello
che è importante in un contesto potrebbe non esserlo in
un altro
– per esempio, la macchina per un venditore è diversa da quella di
un progettista
• OO modella il sistema utilizzando l’astrazione (es. classi)
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Astrazione
• L’approccio orientato agli oggetti mette a disposizione
strumenti con i quali il programmatore può
rappresentare elementi nello spazio dei problemi
• La rappresentazione è sufficientemente generalizzata
da non vincolare il programmatore a occuparsi
soltanto di un determinato tipo di problemi
• Gli oggetti sono elementi che si trovano nello spazio
dei problemi e le loro rappresentazioni nello spazio
delle soluzioni
• L’OOP permette quindi di descrivere il problema nei
suoi termini propri, invece che nei termini del
computer sul quale verrà computata la soluzione
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Cos’è una classe
• Una classe rappresenta una particolare categoria di
oggetti e definisce un tipo di dato per un determinato
oggetto ad essa appartenente
• Una classe è caratterizzata da proprietà (attributi),
comportamento (operazioni), relazioni e semantica
comuni agli oggetti che la classe descrive
• Seguendo il principio OO dell’astrazione:
– Enfatizza caratteristiche rilevanti
– Sopprime le altre caratteristiche
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Esempio di classe
• Nome
– Corso
• Proprietà
– Nome, Luogo, Durata, Crediti, Inizio, Fine
• Comportamento
– Aggiunta studente
– Cancellazione studente
– Verifica se è pieno
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
Course
name
location
duration
startDate
endDate
addStudent()
dropStudent()
isFull()
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Caratteristiche di un approccio OO
Alan Kay ha riepilogato 5 caratteristiche essenziali di
Smalltalk (primo linguaggio OOP di successo)
1. Ogni cosa è un oggetto
2. Un programma è un insieme di oggetti che si dicono
l’un l’altro che cosa fare inviandosi messaggi
3. Ogni oggetto ha la sua memoria formata da altri
oggetti
4. Ogni oggetto ha un tipo
5. Tutti gli oggetti di un determinato tipo possono
ricevere gli stessi messaggi
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Cos’è un oggetto
• Informalmente rappresenta
– Entità fisica: trattore
– Entità concettuale: processo chimico
– Oppure entità software: lista, coda...
• Formalmente
– Manifestazione concreta di un’astrazione
– Entità con un confine e un’identità ben definite che incapsula stato e
comportamento
– Istanza di una classe
• Es.: Ferrari di Schumacher, Ferrari di Barrichello, Mio
computer
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Un oggetto possiede...
• Stato
– Possibile condizione nel quale l’oggetto potrebbe esistere e
generalmente cambia nel tempo
– Implementato mediante proprietà (attributi) con valori, e
collegamenti ad altri oggetti
• Comportamento
– Determina come un oggetto agisce e reagisce alle richieste di un altro
oggetto
– Rappresentato dall’insieme di messaggi a cui può rispondere
(operazioni)
• Identità
– Rende possibile la distinzione tra due oggetti anche se hanno lo stesso
stato e lo stesso valore nei suoi attributi
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Relazione tra classe e oggetto
• Classe è una definizione astratta di un
oggetto
• Definisce la struttura e il comportamento di
ogni oggetto nella classe
• Serve come template per creare oggetti
• Oggetti sono raggruppati in classi
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Oggetto e interfaccia
Nome del tipo
Interfaccia
• Le richieste che si possono fare ad un oggetto sono definite
dalla sua interfaccia ed è il tipo a determinare l’interfaccia
• Il codice deputato a soddisfare tali richieste, insieme con i
dati nascosti, costituisce l’implementazione dell’oggetto
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Incapsulamento & Information Hiding
“La localizzazione fisica di caratteristiche (es.
proprietà, comportamento) in una singola
scatola nera che nasconde l’implementazione
(e le relative decisioni di design) dietro una
interfaccia pubblica”
[Dizionario di Object Technology – Firesmith, Eykholt 1995]
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Incapsulamento & Information Hiding
• L'information hiding è il principio teorico su cui si basa la
tecnica dell'incapsulamento
• Information Hiding
– I dettagli implementativi di una classe - o di un costrutto di altro
tipo (oggetto, modulo, ecc) - sono nascosti all'utente
– Le scelte interne di design e gli effetti che eventuali cambiamenti di
tali decisioni comportano sono nascoste ai possibili client
(utilizzatori)
• Incapsulamento
– Un oggetto contiene ("incapsula") al suo interno gli attributi (dati) e i
metodi (procedure) che agiscono su di essi
– L’ incapsulamento è una facility del linguaggio mentre
l’information hiding è un principio di design
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Incapsulamento & Information Hiding
• L'incapsulamento riduce il costo da pagare per
correggere gli errori in fase di sviluppo di un
programma
• Un'errata decisione presa nell'implementazione di un
singolo modulo non deve ripercuotersi sull'intero
progetto, ma deve essere corretta modificando
soltanto quel modulo
• Deve essere modificato solo il modulo errato e non i
moduli clienti, che interagiranno con il modulo
incapsulato soltanto attraverso interfacce
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Incapsulamento & Information Hiding
• In generale i programmatori si distinguono in creatori
di classe e programmatori client
– L’obiettivo del programmatore client è mettere insieme
una serie di classi per sviluppare rapidamente le
applicazioni
– L’obiettivo del creatore di classi è costruire una classe
che mostra al programmatore client soltanto quello che
è necessario, mantenendo nascosto tutto il resto
• Se tutti i membri di una classe fossero disponibili a
tutti, un programmatore client potrebbe fare
qualsiasi cosa con quella classe e non vi sarebbe così
modo di imporre delle regole
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Incapsulamento e Information Hiding
• Esempio
– Sistema che identifica un punto sulla superficie
terrestre e offre funzionalità per determinare la
distanza (distance) e la rotta (heading) tra due
punti
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Esempio: prima soluzione
public class Position {
public double latitude;
public double longitude;
}
public class PositionUtility {
public static double distance( Position pos1, Position pos2 ) {
//Calculate and return the distance between the specified
positions
}
public static double heading( Position pos1, Position pos2 ) {
//Calculate and return the heading from pos1 to pos2.
}
}
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Esempio: prima soluzione
Position myHouse = new Position();
myHouse.latitude = 36.538611;
myHouse.longitude = -121.797500;
Position coffeeShop = new Position();
coffeeShop.latitude = 36.539722;
coffeeShop.longitude = -121.907222;
double distance = PositionUtility.distance( myHouse, coffeeShop );
double heading
= PositionUtility.heading( myHouse, coffeeShop );
System.out.println("From my house at (" + myHouse.latitude + ", " +
myHouse.longitude + ") to the coffee shop at (" +
coffeeShop.latitude + ", " + coffeeShop.longitude + ") is a
distance of " + distance + " at a heading of " + heading +
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Esempio: prima soluzione
• OUTPUT
From my house at (36.538611, -121.7975) to the
coffee shop at (36.539722, -121.907222) is
distance of 6.0873776351893385 at a heading of
270.7547022304523 degrees.
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Considerazioni
• Dati (espressi mediante Position) ed operazioni
(espresse mediante PositionUtility) sono separati!!!
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Esempio: seconda soluzione
public class Position {
public double distance( Position position ) {
//Calculate and return the distance from this object to
specific position.
the
}
public double heading( Position position ) {
//Calculate and return the heading from this object to
specified position.
the
}
public double latitude;
public double longitude;
}
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Esempio: seconda soluzione
Position myHouse = new Position();
myHouse.latitude
= 36.538611;
myHouse.longitude = -121.797500;
Position coffeeShop = new Position();
coffeeShop.latitude
= 36.539722;
coffeeShop.longitude = -121.907222;
double distance = myHouse.distance( coffeeShop );
double heading = myHouse.heading( coffeeShop );
System.out.println("From my house at (" + myHouse.latitude + ", " +
myHouse.longitude + ") to the coffee shop at (" + coffeeShop.latitude +
", " + coffeeShop.longitude + ") is a distance of " + distance + " at a
heading of " + heading + " degrees.");
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Modularità
“La decomposizione fisica e logica di cose (es.
responsabilità e software) in gruppi piccoli e
semplici (es. requisiti e classi rispettivamente)
che incrementa il raggiungimento degli
obiettivi dell’ingegneria del software”
[Dizionario di Object Technology – Firesmith, Eykholt 1995]
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Modularità
• Un modulo può essere definito come un componente di un più
vasto sistema, che opera in quel sistema indipendentemente
dalle operazioni di altri componenti
– per gestire la complessità, si può suddividere qualcosa che è
complesso in pezzi più piccoli e quindi più maneggevoli
• La modularità viene utilizzato su diversi livelli di astrazione
– frazionamento di un programma non solo in funzioni, ma a livello
superiore in oggetti
• Gli oggetti possono essere raggruppati in package,
package
componenti e subsystem
– package, componenti e subsystem possono essere usati come blocchi
per altri sistemi
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Modularità
• O.O. modella la modularità con package , components
e subsystem
• Un package è un namespace che organizza un insieme di
classi ed interfacce corrispondenti
• Concettualmente un package è simile ad una directory
nel file system. Possiamo quindi memorizzare file
HTML in una directory, immagini in un’altra, e script in
un’altra ancora
• Tipicamente, sistemi complessi consistono di migliaia
di classi, ha quindi senso organizzare le classi e le
interfacce in package
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Ereditarietà
“Qualsiasi graduatoria (ranking) o ordine di
astrazione in una struttura ad albero”
[Dizionario di Object Technology – Firesmith, Eykholt 1995]
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Ereditarietà
• OO utilizza classi per raggruppare dati e
funzionalità in concetti e l’ereditarietà per
organizzare tali concetti in base ad un certo
ordine
– esempi: complessità, responsabilità
• L’ereditarietà permette di descrive differenze o
variazioni di un particolare concetto
– la classe originale viene replicata e arricchita con
aggiunte e modifiche
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Ereditarietà
Maggiore Astrazione
Mammifero
Cetaceo
Minore Astrazione
Delfino
Balena
Gatto
Felino
Leopardo
Leone
Fratelli hanno stesso livello di astrazione
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Ereditarietà
Classe base
Classe derivata
• Due tipi possono condividere caratteristiche e comportamenti,
ma un tipo può contenere più caratteristiche di un altro,
gestire più messaggi o trattarli in modo diverso
• L’ereditarietà esprime questa similarità fra tipi utilizzando i
concetti di tipi base e tipi derivati
• Un tipo base contiene tutte le caratteristiche e i
comportamenti che sono condivisi dai tipi che da esso derivano
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Ereditarietà
superclasse
classe genitore
classe superiore
Classe base
Classe derivata
sottoclasse
classe figlia
classe ereditata
• Con l’ereditarietà la classe base viene “clonata” e vengono
poi eseguite aggiunte e modifiche sulla replica
• Se la classe base viene modificata, la classe derivata riflette
tali cambiamenti
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Esempio di ereditarietà
Shape
draw()
erase()
mode()
getColor()
setColor()
Circle
Square
Triangle
• I tipi derivati (Circle
Circle,
Circle Square,
Square Triangle)
Triangle possono avere ulteriori
caratteristiche e comportamenti di quello base (Shape
Shape)
Shape
• Alcuni comportamenti possono essere diversi
– per esempio, se si vuole calcolare l’area di una forma geometrica
• La gerarchia dei tipi incorpora sia le somiglianze che le
differenze fra le forme geometriche
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Ereditarietà
• Quando si eredita da un tipo esistente, il tipo
nuovo duplica l’interfaccia della classe base
– tutti i messaggi inviabili a oggetti della classe base
possono esserlo anche a oggetti della classe derivata
• Poiché il tipo di una classe è identificato dai
messaggi è possibile inviare, la classe derivata è
dello stesso tipo della classe base
– nell’esempio precedente: “un cerchio è una forma
geometrica”
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Ereditarietà
• Ci sono due modi per differenziare la nuova classe
derivata dalla classe base originale
1. Si aggiungono nuovi metodi alla classe derivata
(estensione
estensione della classe)
Shape
draw()
erase()
mode()
getColor()
setColor()
Circle
Square
Triangle
flipVertical()
flipHorizontal()
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Ereditarietà
• Ci sono due modi per differenziare la nuova classe
derivata dalla classe base originale
2. Si cambia il comportamento di un metodo della classe
base mediante la sovrascrittura del metodo
(overridding
overridding)
overridding
Shape
draw()
erase()
mode()
getColor()
setColor()
Circle
draw()
erase()
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
Square
draw()
erase()
Triangle
draw()
erase()
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Polimorfismo
• Linguaggi procedurali (esempio Pascal) basati su
idea che procedure e funzioni, e i loro operandi,
hanno un unico tipo
• Tali linguaggi sono detti monomorphic , cioè ogni
valore e variabile può avere uno ed un solo tipo
• Linguaggi O.O. sono detti polymorphic , cioè i
valori e le variabili possono avere più di un tipo
• Dal greco polymorphos “avere molte forme”
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Polimorfismo
void doStuff(Shape s) {
s.erase();
// ...
s.draw();
}
• Questo metodo parla con qualunque Shape, quindi è
indipendente dal tipo di oggetto che sta disegnando
e cancellando
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Polimorfismo
Circle c = new Circle();
Triangle t = new Triangle();
Line l = new Line();
doStuff(c);
doStuff(t);
doStuff(l);
• La chiamata a doStuff()funziona automaticamente in modo
corretto, indipendentemente dal tipo esatto dell’oggetto
• Questo è reso possibile dal late binding
– quando si invia un messaggio ad un oggetto, il codice che viene
chiamato non è determinato fino al momento dell’esecuzione
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Polimorfismo
…
Shape s = null;
if (x <= 3) {
s = new Circle();
} else {
s = new Triangle();
}
s.draw();
…
•
draw() può essere applicato indifferentemente a un cerchio,
quadrato o triagolo...
•
In fase di compilazione, il compilatore non può sapere quale
parte di codice sarà in esecuzione
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Polimorfismo
…
Shape s = null;
if (x <= 3) {
s = new Circle();
} else {
s = new Triangle();
}
s.draw();
…
Posso invocare il metodo draw()?
Compile time
Quale metodo draw() deve essere invocato?
Run-time
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Punti di forza dell’ OO
• Singolo paradigma
• Facilita il riuso di codice e di architetture
• Modelli riflettono maggiormente la realtà
– Descrizione più accurata dei dati e processi
– Decomposizione basata su partizionamento naturale
– Più facile da comprendere e mantenere
• Stabilità
– Piccolo cambiamento nei requisiti non significa
massicci cambiamenti nel sistema durante lo sviluppo
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Java vs C++
• Sia C++ che Java sono linguaggi ibridi
• Un linguaggio ibrido permette molteplici stili di
programmazione
– per esempio, OO/procedurale
• La ragione per cui C++ è ibrido è quella di garantire la
compatibilità all’indietro con il linguaggio C
– C++ comprende molte delle caratteristiche indesiderabili di C, il
che può rendere alcuni aspetti del C++ eccessivamente complicati
• Java presuppone che si voglia fare solo programmazione
orientata agli oggetti
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Java vs C++
• Java non supporta le strutture (struct
(struct),
struct), le unioni
(union)
(union)
sono rese inutili dalla presenza delle classi
• Java non supporta più i puntatori
sono stati eliminati poiché sono la maggior causa degli
errori in C/C++
• Java non supporta le funzioni
essendo un linguaggio orientato agli oggetti, Java forza i
programmatori a considerare le funzioni come metodi
della classe
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Java vs C++
• Java non supporta il preprocessore, il typedef e i files header
Java fornisce funzionalità simili ma con un maggior controllo
• Java non supporta il coercion automatico
si riferisce alla conversione implicita di tipi di dato che alcune
volte si verifica in C e C++
• Java non permette l’overloading
l’overloading degli operatori
– Per esempio, è possibile definire funzioni che ridefiniscono la somma
(+) e la moltiplicazione (*) fra due oggetti:
operatori in overload : a+b*c
chiamata di funzioni specifiche : somma(a,moltiplica
somma moltiplica(b,c))
moltiplica
• Java non supporta l’ereditarietà multipla
è una caratteristica del C++ che permette di derivare una classe da
più classi base
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche
Java vs C++
• Java ha una classe String come parte del package java.lang
questo differisce dall’array di caratteri terminante con null del C
e C++
• Java gestisce gli argomenti della linea di comando in modo
diverso dal C o C++
– In C++
void main(int argc, char *argv[]){
. . .
}//end main function
– In Java
public static void main(String[] args){
. . .
}//end main method
• Java ha un sistema automatico per allocare e liberare la
memoria (garbage
(garbage collection)
collection)
non è necessario utilizzare funzioni di allocazione e deallocazione
della memoria come in C e C++
Romina Eramo
Tecnologie dei Linguaggi di Programmazione
DISIM - Dipartimento di Ingegneria e
Scienze dell’Informazione e Matematiche