progettazione e programmazione orientata agli oggetti · • la programmazione ad oggetti (oop) è...

64
UNIVERSITÀ DEGLI STUDI DI PARMA Dipartimento di Ingegneria dell’Informazione ENGINEERING G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti COMPUTER Progettazione e Programmazione Orientata agli Oggetti Giovanni Rimassa DII - Università di Parma

Upload: hoangmien

Post on 15-Feb-2019

224 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Progettazione e ProgrammazioneOrientata agli Oggetti

Giovanni RimassaDII - Università di Parma

Page 2: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Programmazione ad Oggetti

• La programmazione ad oggetti (OOP) è unaparte importante delle moderne tecniche disviluppo del software.

• Le tecnologie OO permeano tutto il ciclo disviluppo del software– OOA - (Object Oriented Analysis)– OOD - (Object Oriented Design)– OOP - (Object Oriented Programming)

Page 3: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Programmazione ad Oggetti

• Negli ultimi 15 anni, le tecnologie OOhanno preso sempre più piede.

• Oggi gli oggetti sono talmente mainstreamche nessuno li contesta più apertamente.

• Tuttavia, la comprensione dei principilinguistici e di progetto alla base della OOPnon è così diffusa come sembra.

Page 4: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Programmazione ad Oggetti

• Le soluzioni proposte dalla OOP nasconoda considerazioni generali di Ingegneria delSoftware.

• Le tecnologie orientate agli oggetti cercanodi favorire la progettazione di software diqualità.

Page 5: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

La Qualità del Software

• Un sistema software può essere valutato inbase a molte qualità, che si possonodividere in due grandi categorie:

• Qualità Esterne (viste dal cliente/utente)– Correttezza, Efficienza, Usabilità, ...

• Qualità Interne (viste dallo sviluppatore)– Mantenibilità, Estendibilità, ...

Page 6: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Modularità

• La modularità viene spesso considerata unaqualità interna, ma in realtà non èchiaramente definita.

• Si potrebbe definire informalmente così:– Un sistema è modulare se i suoi moduli sono

“ben strutturati” e “ben collegati insieme”.

⇒ Cerchiamo delle proprietà più precise.

Page 7: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Modularità

• Per descrivere la modularità e mostrarecome essa supporti le qualità interne delsoftware, vedremo:– Cinque Criteri (per valutarla)– Cinque Regole (per garantirla)– Cinque Principi (per praticarla)

Page 8: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Cinque Criteri (1)• Decomponibilità

– Un sistema modulare può essere decomposto in partipiù piccole, connesse da una struttura semplice,abbastanza indipendenti da lavorarci separatamente.

Page 9: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Cinque Criteri (2)• Componibilità

– Un sistema modulare favorisce la produzione dielementi che possono essere combinati insieme in unambiente diverso da quello in cui sono stati creati.

Page 10: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Cinque Criteri (3)• Comprensibilità

– In un sistema modulare ogni parte può essere compresaisolatamente da un osservatore umano, senza chequesto debba conoscere le altre parti.

Page 11: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Cinque Criteri (4)• Continuità

– Un sistema modulare è tale che ad un cambiamento“piccolo” nelle specifiche del sistema corrisponda uncambiamento “piccolo” nell’implementazione.

Page 12: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Cinque Criteri (5)• Protezione

– Un sistema modulare confina gli effetti di condizionianormali all’interno del modulo in cui avvengono, o alpiù in un numero ristretto di moduli.

Page 13: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Cinque Regole(1)

• Corrispondenza Diretta– La struttura modulare del sistema software

dovrebbe rimanere compatibile con quella delproblema che il sistema tenta di risolvere.

• Una qualità molto citata dell’approccio OOè che si riesce a modellare il software sullabase del “mondo reale”– Ma “compatibile” non vuol dire “speculare”

Page 14: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Cinque Regole(2)

• Poche Interfacce– Ogni modulo dovrebbe comunicare con il

minor numero possibile di altri moduli.

• Questa regola serve a supportare lacontinuità e la protezione.– Se un modulo ha poche interfacce, i suoi

cambiamenti si rifletteranno su pochi altri.

Page 15: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Cinque Regole(3)

• Interfacce Piccole– Quando due moduli comunicano, dovrebbero

scambiarsi meno informazioni possibile.

• Anche questa regola supporta la continuitàe la protezione.– Se un modulo ha interfacce piccole, i suoi

cambiamenti si rifletteranno poco sui suoi(pochi) vicini.

Page 16: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Cinque Regole(4)

• Interfacce Esplicite– Il fatto che due moduli comunicano dovrebbe

essere ovvio leggendo il loro codice.

• Questa regola supporta comprensibilità,componibilità, decomponibilità e continuità.– Le interfacce esplicite aiutano a capire il

modulo ed a prevedere gli effetti deicambiamenti, ad anche a comporlo/scomporlo.

Page 17: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Cinque Regole(5)

• Information Hiding– un modulo deve dichiarare un sottoinsieme

pubblico delle sue informazioni.

• Questa regola è il cardine fondamentale perottenere la continuità.– Ogni decisione di progetto o implementazione

che non viene rivelata agli altri moduli puòessere rivista senza influenzarli.

Page 18: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Cinque Principi

• I criteri e le regole visti prima esprimono(apparentemente) concetti legati più alprogetto del sistema che al linguaggio diprogrammazione.

• I cinque principi seguenti, invece, siriflettono sui costrutti linguistici e sono ilriflesso pratico delle regole viste prima.

Page 19: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Cinque Principi (1)

• Unità Linguistiche Modulari– Il linguaggio di programmazione deve

supportare i moduli come unità sintattiche.

• I criteri di modularità devono arrivare finoall’implementazione: se il linguaggio non saesprimere in forma compilabile i moduliindividuati nelle fasi precedenti, non si puòcostruire un sistema modulare.

Page 20: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Cinque Principi (2)

• Documentazione Incorporata– La documentazione interna di un modulo deve

essere contenuta nel modulo stesso.

• Una buona documentazione incrementa lacomprensibilità, ma deve essere aggiornatao diventa addirittura fuorviante e dannosa.– Mantenere la documentazione vicino al codice.

Page 21: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Cinque Principi (3)

• Accesso Uniforme– I servizi esposti da un modulo non devono

rivelare se sono implementati con calcoli o condati.

• Questo principio serve a rispettarel’information hiding ed aiuta a garantire lacontinuità; consente al modulo di cambiarei trade-off spazio-tempo senza problemi.

Page 22: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Cinque Principi (4)

• Aperto/Chiuso (Open/Closed Principle)– Il linguaggio di programmazione deve

permettere di creare moduli aperti perl’estensione, ma chiusi per l’utilizzo.

• Chi usa un modulo vuole saperne il menopossibile (black box).

• Per essere esteso, un modulo deve rivelarequalcosa in più (white box).

Page 23: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Cinque Principi (5)

• Scelta Singola (Single Choice Principle)– Ogni volta che ci sono un certo numero di

alternative, al più un modulo deve conoscernel’elenco.

• Quando “i casi sono due” nella versione1.0, si può star sicuri che “i casi sonoquindici” nella versione 2.0.– Per salvaguardare continuità ed estendibilità.

Page 24: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Tipi di Dato

• Al livello più basso, programmi e dati nonsono altro che sequenze di byte.– Un virus infetta tutti i programmi nello stesso

modo.– Le tecniche di protezione e cracking sono

indipendenti dal tipo di programma.– MAME o VMWare fanno girare applicazioni

sconosciute ai progettisti dell’emulatore.

Page 25: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Tipi di Dato

• Curiosamente, anche alcuni linguaggi dilivello molto alto rappresentano dati eprogrammi in modo omogeneo.– In LISP si esprime tutto come cella o lista.– Molti linguaggi di scripting hanno un solo tipo

di dato.– Una Macchina di Turing ne può simulare

un’altra.

Page 26: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Tipi di Dato

• “Si è tanto ciechi nell’oscurità totalequanto nella luce totale”.

• Modelli troppo omogenei riducono lacomprensibilità e la decomponibilità.– Linguaggi strettamente tipati.– Typing statico e typing dinamico.– Tipi come categorie per la modellazione.

Page 27: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Tipi di Dato

• Insegnando un linguaggio, si devonointrodurre i tipi di dato supportati.

• A livello elementare, si introducono i tipiattraverso una loro rappresentazione.– Gli array bidimensionali in C sono memorizzati

per righe.– Una struct in C è fatta dalla sequenza dei suoi

campi.

Page 28: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Tipi di Dato

• Per ottenere alcune qualità interne qualidecomponibilità e protezione, non ci si devebasare sulla rappresentazione di un tipo, ma:– Sulle operazioni ad esso applicabili.– Sulle proprietà garantite per ogni istanza del

tipo.– Sulle precondizioni di ogni operazione.

⇒ Si parla di Abstract Data Type.

Page 29: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

ADT: Un Esempio• Type: STACK<REAL>• Functions

– push: (STACK<REAL>, REAL)→ STACK<REAL>– … (pop, top, remove)

• Axioms– top(push(s, x)) = x– …

• Preconditions– pop require not empty– …

Page 30: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Moduli e Tipi

• Moduli e tipi sembrano molto diversi.– I moduli strutturano l’implementazione.– I tipi specificano come usare ogni parte.

• Ma in comune c’è il concetto di interfaccia.– Nei moduli determina la parte pubblica.– Nei tipi descrive le operazioni ammissibili e le

loro proprietà.

Page 31: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

OOP

Il concetto fondamentale dellaIl concetto fondamentale dellaprogrammazione ad oggetti è:programmazione ad oggetti è:

L’OggettoLa Classe

Page 32: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

OOP

• Def: Classe– “Un tipo di dato astratto corredato da un

modulo che ne è un’implementazione.”

Tipo + Modulo = Classe

Page 33: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Classi• Una classe Point,

espressa nellanotazione standardUML (UnifiedModeling Language).– Dati privati.– Funzioni pubbliche.– Membri di istanza.– Membri di classe.

Point- double x- double y- numOfPoints

+ Point(double x, double y)+ void move(double dx, double dy)+ int howMany()

Page 34: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Classi in C++ ed in Java// File Point.Hclass Point { // C++

public: Point(double x, double y); void move(double dx, double dy); static int howMany();

private: double m_x; double m_y; static int numOfPoints;};// Implementazione in Point.cc

// File Point.javaclass Point { // Java

public Point(double x,double y) {…} public void move(double dx, double dy) {…} public static int howMany() {…}

private double myX; private double myY; private static int numOfPoints;}// Implementazione in linea

Page 35: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Oggetti• Un oggetto in notazione

UML.– Un oggetto è un’istanza

di una classe (che è il suotipo ed il modulo che neregola l’accesso).

– Un oggetto ha strutturaed operazioni della suaclasse, ma specificivalori per gli attributi.

aPoint:Point

x:double = 1.3y:double = -5.8

Page 36: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Oggetti

• Oggetti della stessa classe hanno operazioniuguali (metodi), ma dati diversi.

• Un metodo può accedere ai dati dell’oggetto(parte privata del modulo).

• Come si indica al metodo su quale oggettoagire ?– Istanza corrente di un oggetto (this o self).

Page 37: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Chiamata a Metodo

res = obj.meth(par)

Lista di parametri

Meccanismo fondamentale di computazione della OOP

Nome del metodo

Oggetto Target

Risultato

Operatore di accesso

Page 38: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Oggetti in C++ e Java// File main.cc - C++#include “Point.H”

void main(int argc, char *argv[]) { Point p(1,2); // Oggetto locale Point* pptr; // Puntatore

pptr = new Point(0,0); // Alloca p.move(-4,7); // Method call pptr->move(3,-6); // Method call

delete pptr; pptr = 0;} // p distrutto automaticamente

// File Main.java - Javaimport Point;

class Main { public static void main(String[] args) {

Point p; // Riferimento nullo p = new Point(0,0); // Alloca p.move(-5,-9); // Method call

p = null; // Garbage collection

}}

Page 39: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Oggetti in C++ e Java// File point.cc - C++#include “Point.H”

// Implementazione separatavoid Point::move(double dx, double dy) {

// this - all’interno di un // metodo e` il puntatore // all’istanza corrente this->m_x = this->m_x + dx;

// ‘this’ si puo` omettere m_y = m_y + dy;

}

// File Point.javaclass Point { // Java

// Implementazione in linea public void move(double dx, double dy) {

// this - all’interno di un // metodo e` il riferimento // all’istanza corrente this.myX = this.myX + dx;

// ‘this’ si puo` omettere myY = myY + dy}

Page 40: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Ciclo di Vita degli Oggetti

• Ogni classe impone dei vincoli su tutti i suoioggetti.– Precondizioni all’ingresso dei metodi.– Postcondizioni all’uscita dei metodi.– Invarianti che devono sempre valere.

• Gli oggetti devono gestire risorse durante laloro esistenza (memoria, file, entità del S.O.).

Page 41: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Ciclo di Vita degli Oggetti

• Momenti critici della vita di un oggetto:– Creazione.– Copia.– Distruzione.

• La creazione è ben più dell’allocazione.• La copia incide sulle chiamate a metodo.• La distruzione deve rimettere tutto a posto.

Page 42: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Ciclo di Vita in C++

• In C++ esistono alcuni metodi particolari:– I costruttori, che creano e copiano gli oggetti.– L’operatore di assegnazione, che sostituisce

un oggetto con un altro.– Il distruttore, che distrugge gli oggetti.

• La gestione della memoria è manuale.– Protocollo Prologo/Epilogo.– Allocazione sullo stack, sullo heap o statica.

Page 43: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Ciclo di Vita in Java

• In Java, esistono alcuni metodi particolari:– I costruttori, che creano gli oggetti.– Il metodo clone(), che copia gli oggetti.

• La gestione della memoria è automatica.– Nella JVM c’è un garbage collector.– Il momento della distruzione non è noto.– Allocazione sullo heap (tutti puntatori).

Page 44: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Ereditarietà

• Esprime una relazione is-a fra due classi.– Relazione gerarchica ed aciclica.

• Può essere singola o multipla.

Shape

Circle Triangle Square

Shape

Circle Triangle Square

Persistent

Page 45: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Ereditarietà

• L’ereditarietà è un meccanismo base dellaOOP, ma ha più aspetti diversi.

• La prima distinzione da fare è traereditarietà di interfaccia ed ereditarietà diimplementazione.– Tipo + Modulo = Classe.– Subtyping + Inheritance = Subclassing.

Page 46: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Subtyping

• Se le classi sono tipi, l’ereditarietà è unarelazione tra tipi, che chiamiamo subtyping.

• Se il tipo D è un sotto-tipo del tipo B, cosasignifica D is-a B ?– Tutto quello che posso fare ad un B lo posso

fare anche ad un D.

⇒ Principio di Sostituibilità di Liskov.

Page 47: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Inheritance

• L’ereditarietà è una relazione tra moduli,che chiamiamo (solo qui) inheritance.

• L’inheritance garantisce l’Open/ClosedPrinciple.– Un sotto-modulo avrà accesso privilegiato al

modulo base (accesso protected in C++ e Java).– Un sotto-modulo potrà cambiare o estendere

l’implementazione del modulo base.

Page 48: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Ereditarietà in C++

• Il C++ supporta completamente l’ereditarietà.– Ereditarietà singola e multipla.– Ereditarietà multipla ripetuta e condivisa.– Ereditarietà pubblica, protetta e privata.

• In C++ si può avere:– Subtyping puro (classi puramente astratte).– Inheritance pura (ereditarietà privata).

Page 49: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Ereditarietà in Java

• Java supporta quasi completamentel’ereditarietà.– Inheritance singola.– Subtyping multiplo.– Invocazione dei metodi ereditati tramite il

riferimento super.

• In Java si può avere:– Subtyping puro (interfacce).

Page 50: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Polimorfismo

• Il polimorfismo è una caratteristicaessenziale dei linguaggi orientati aglioggetti.

• Permette di trattare in modo uniforme tipi“simili”, ma rispettandone le differenze.

• Spesso il polimorfismo si usa per garantireil Single Choice Principle.

Page 51: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Polimorfismo• Si individuano delle operazioni comuni per

interfaccia, ma diverse per comportamento.• Una classe dichiara la funzione e delle sottoclassi

ne forniscono diverse implementazioni.

Shape

Circle Triangle Square

+ void draw(GC& aCtx)

+ void draw(GC& aCtx) + void draw(GC& aCtx) + void draw(GC& aCtx)

Page 52: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Polimorfismo

• Per il Principio di Sostituibilità:– Un riferimento di tipo Shape può puntare a

oggetti di tipo Shape o di una sottoclasse.

• Esiste un tipo statico ed un tipo dinamico:– Tipo statico ⇒ tipo del riferimento, dichiarato a

compile time.– Tipo dinamico ⇒ tipo dell’oggetto puntato a

run time.

Page 53: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Polimorfismo

• Quando tipo statico ≠ tipo dinamico, se ledue classi hanno versioni diverse di unastessa funzione membro, sorge un problemadi binding.– Static binding (o early binding) ⇒ tipo statico.– Dynamic binding (o late binding) ⇒ tipo

dinamico.

• Il late binding è possibile solo con ptr/ref.

Page 54: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Polimorfismo

• Nell’esempio delle figure geometriche:– La funzione draw(ctx) viene chiamata su un

ref di tipo Shape:s.draw(ctx);

– Circle::draw(), se s punta ad un Circle.– Square::draw(), se s punta ad uno Square.

⇒ L’oggetto sa il suo vero tipo e la funzionefa la cosa giusta!

Page 55: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Polimorfismo

• Nel caso delle figure geometriche:– Shape::draw(), non è definita (non si sa

disegnare una “figura generica”).– Shape ha un’implementazione incompleta.– Shape è una classe astratta.

• Alcune funzioni non si devono cambiare.– Se una funzione non è ridefinibile, il late

binding non serve.

Page 56: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Polimorfismo e Class Design

• Il progettista della classe base deve deciderequali funzioni membro devono esserepolimorfe, quali astratte e quali ordinarie.

• La decisione va presa attentamente,ponendosi due domande sulla funzione:– “Si potrà ridefinire nelle classi derivate?”– “Si può fornire un’implementazione generica

nella classe base?”

Page 57: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Polimorfismo in C++ e JavaCome dichiarareuna funzione f() inJava e C++, aseconda di come (ese) si può ridefinirenelle sottoclassi

Non Ridefinibile Implementazionedi Default Astratta

Java final void f() void f() abstract void f()

C++ void f() virtual void f() virtual void f() = 0

Page 58: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Gestione delle Eccezioni

• Le condizioni di errore sono al centro di undilemma:– Nella maggior parte dei casi non si presentano.– Quando si presentano, possono avere risultati

catastrofici.

• Serve una soluzione che consenta di trattaregli errori, senza inquinare il codice eseguitonei casi normali.

Page 59: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Gestione delle Eccezioni

• Errori e valori di ritorno:– Quando un metodo fallisce, non ha senso

chiedergli un valore di ritorno.– L’uso di valori out of band richiede di ridurre il

codominio in modo arbitrario.– Il chiamante deve farcire il codice di test

condizionali.– Il chiamante può ignorare l’errore.

Page 60: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Gestione delle Eccezioni

• Sia C++ che Java forniscono unmeccanismo flessibile per gestire lecondizioni di errore:

La Gestione delleEccezioni

Page 61: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Sintassi per le Eccezioni

• C++ e Java hanno sintassi molto simile.• Si racchiude il codice da proteggere in un

blocco try.• Un’eccezione si lancia con la parola chiavethrow.

• I gestori delle eccezioni sono introdottidalla parola chiave catch.

Page 62: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Eccezioni in C++#include “library.h”

void main() { try { f(); // Può tirare un’ecc. } catch(Exception& e) { // Gestisce l’eccezione }}

void f() { X localX; g();}

void g() { Y localY; h();}

void h() { if(something_wrong()) throw Exception(“Argh”);}

Program.cc Library.cc

Page 63: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Eccezioni in Javaimport Library;

public class Program { // ...

public static void main() { try { f(); // Può tirare un’ecc. } catch(Exception e) { // Gestisce l’eccezione } }}

class Library { void f() throws Exception { X localX = new X(); g(); }

void g() throws Exception { Y localY = new Y(); h(); }

void h() throws Exception { if(something_wrong()) throw new Exception(“Argh”); }}

Program.java Library.java

Page 64: Progettazione e Programmazione Orientata agli Oggetti · • La programmazione ad oggetti (OOP) è una parte importante delle moderne tecniche di sviluppo del software. • Le tecnologie

UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING

G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti

COMPUTER

Eccezioni in C++ e Java

• Java obbliga ogni metodo a dichiarare leeccezioni tirate (opzionale in C++).

• In C++ gli oggetti locali vengono distruttimentre l’eccezione si propaga.

• Java ha la parola chiave finally pereseguire codice comune ai casi normali edeccezionali (il C++ sfrutta i distruttori).