Progettazione e Programmazione Orientata agli Oggettimarco/MAIN/didattica/OLD/se/slides/oop.pdf ·...

47
Progettazione e Programmazione Slide 1 Orientata agli Oggetti In Collaborazione con Paola Turci (Università di Parma)

Transcript of Progettazione e Programmazione Orientata agli Oggettimarco/MAIN/didattica/OLD/se/slides/oop.pdf ·...

Progettazione e Programmazione

Orientata agli Oggetti

Slide 1

Orientata agli Oggetti

In Collaborazione con Paola Turci (Università di Parma)

Paradigmi di Programmazione

� Un linguaggio supporta uno stile di programmazione se possiede funzioni che ne rendono conveniente (semplice, sicuro, efficiente) l’uso:

• librerie standard

Slide 2

• librerie standard• ambienti di programmazione• controlli in compilazione e/o in esecuzione

Programmazione Procedurale

� Definire le procedure

I linguaggi supportano questo paradigma se

Slide 3

I linguaggi supportano questo paradigma se forniscono la possibilità di:

• passare argomenti • restituire valori

Programmazione Modulare

� Definire i moduli

Realizzazione Organizzazionedelle procedure dei dati

Slide 4

delle procedure dei dati

• Modulo: insieme di procedure poste in relazione ai dati che utilizzano (pila, lista, ...)

• Risulta sufficiente lo stile di programmazione procedurale se non esiste la necessità di definire un insieme di procedure con dati associati

Tipo di Dato Astratto

� Definire tipi di dato e insieme completo di operazioni

• I tipi di dato astratto (o tipi definiti dall’utente) presentano caratteristiche simili ai tipi di dato predefiniti dal linguaggio• visibilità, controlli in fase di compilazione, ecc.

• Se non esiste la necessità di più istanze di un tipo di dato

Slide 5

• Se non esiste la necessità di più istanze di un tipo di dato astratto, risulta sufficiente lo stile di programmazione con “dati nascosti” (programmazione modulare)

• Il tipo di dato astratto è, in generale, poco flessibile; non è possibile adattarlo ad un nuovo utilizzo, se non modificandone la definizione.

Paradigma di Programmazione ad Oggetti

� Occorre uno strumento che consenta di operare una distinzione tra le proprietà di tipi di dati più generali e le proprietà specifiche di singoli sottotipi • Nota: se non vi è alcuna similitudine tra i tipi del problema è sufficiente

l’astrazione di dato.

Slide 6

Programmazione Orientata agli Oggetti

� Analisi del problema in termini di concetti (oggetti) che lo costituiscono (modello concettuale del problema)

Paradigma di Programmazione ad Oggetti

� Intende promuovere nei programmi caratteristiche ritenute fondamentali:• Modularità • Information hiding (incapsulamento)• Riusabilità• Progettazione incrementale• Rapida prototipizzazione

Slide 7

• Rapida prototipizzazione

� I linguaggi di programmazione orientati agli oggetti sono accomunati da tre fattori:

Incapsulamento - Estendibilità - Polimorfismo

• Incapsulamento, consente di nascondere i dati ed esporre solo (alcuni) metodi

• Estendibilità, introduce il concetto di classificazione degli oggetti.• Polimorfismo, è caratterizzato dalla frase “un’interfaccia più metodi”.

Gli Oggetti

� Un oggetto è un’area di memoria inizializzata� Un oggetto è un’aggregazione software di attributi

(stato) e relativi metodi/servizi (comportamento)� Un oggetto è un’astrazione che descrive oggetti

Slide 8

� Un oggetto è un’astrazione che descrive oggetti reali del problema e concetti astratti che fanno parte della sua soluzione

Metodi (pubblici)

Attributi + Metodi(dettagli implementativi privati)

Concetto di Classe

� “Entitá”/tipo che definisce le proprietà (attributi, metodi) che accomunano una famiglia di oggetti:• Uno stesso insieme di operazioni

Slide 9

• Una stessa struttura esterna • Uno stesso comportamento

� Consente la creazione di istanze (oggetti)

� Riunisce proprietà dei tipi di dato e dei moduli

Classi e Istanze (Oggetti)

� Un oggetto è un’istanza di una classe (che è il suo tipo ed il modulo che ne regola l’accesso). • Istanziare un oggetto di una determinata classe significa:

• Dichiarare una variabile di quel tipo• Allocare dinamicamente spazio per un oggetto di quel tipo

Slide 10

• Allocare dinamicamente spazio per un oggetto di quel tipo

• Oggetti della stessa classe hanno operazioni uguali (metodi), ma specifici valori per gli attributi (dati diversi).

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

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

Chiamata a Metodo

res = obj.meth(par)

Meccanismo fondamentale di computazione della OOP

Slide 11

res = obj.meth(par)

Programma = Rete di Oggetti

� Tutto è un oggetto• Ogni componente concettuale del problema viene rappresentata da un

oggetto.

• Un programma è costituito da un insieme di oggetti che si scambiano messaggi (ordini e richieste).

Slide 12

• Ogni oggetto è fatto di altri oggetti (o di tipi base).

� I programmi saranno costituiti da una rete di oggetticonnessi da relazioni client-server.

� La rete che rappresenta l’architettura del programma avrà spesso una struttura gerarchica.

Classi

� Una classe Point, espressa nella notazione standard UML (Unified Modeling Language).

Point- double x- double y- numOfPoints

Slide 13

Language).• Dati privati.

• Funzioni pubbliche.

• Membri di istanza.

• Membri di classe.

- numOfPoints

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

Oggetti

� Un oggetto in notazione UML.• Un oggetto è un’istanza

di una classe (che è il suo tipo ed il modulo che

aPoint:Point

Slide 14

suo tipo ed il modulo che ne regola l’accesso).

• Un oggetto ha struttura ed operazioni della sua classe, ma specifici valori per gli attributi.

x:double = 1.3y:double = -5.8

Ereditarietà

� L’ereditarietà è un meccanismo base della OOP, ma ha più aspetti diversi.

� La prima distinzione da fare è tra ereditarietà di interfaccia ed ereditarietà di

Slide 15

interfaccia ed ereditarietà di implementazione .

Subtyping

� Se le classi sono tipi, l’ereditarietà è una relazione tra tipi, che chiamiamo subtyping.

� Se il tipo C è un sotto-tipo del tipo B, cosa significa C is-a B ?

Slide 16

significa C is-a B ?• Tutto quello che posso fare ad un B lo posso fare

anche ad un C .

⇒ Principio di Sostituibilità di Liskov.

Inheritance

� L’ereditarietà è una relazione tra moduli, che chiamiamo inheritance.

� L’inheritance garantisce l’Open/Closed Principle.• Un sotto-modulo avrà accesso privilegiato al modulo

Slide 17

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

Sintassi per l’ereditarietà in Java

Shape

Estensione singola

public abstract class Shape {

// …

}

class Square extends Shape {

// …

Slide 18

Shape

Circle Triangle Square

// …

}

Sintassi per l’ereditarietà in Java

public interface Shape {

// …

}

class Square implements Shape {

// …

}«interface»

Shape

Implementazione singola

Slide 19

}Shape

Circle Triangle Square

Sintassi per l’ereditarietà in Java

public abstract class Shape {

// ...

}

public interface Persistent {

// ...

Derivazione multipla

Shape«interface»

Persistent

Slide 20

// ...

}

class Square extends Shape

implements Persistent {

// ...

}

Circle Triangle Square

Persistent

Gerarchie di ereditarietà

Object

Component

Button Check box C hoice List Scrol lbar

… …

Gen

erico

Slide 21

Canvas Container Label TextC om ponent

TextArea TextField Panel

Applet

ScrollPane Window

Dialog Frame

FileDialog

S

pecializzato

Polimorfismo

� Il polimorfismo è una caratteristica essenziale dei linguaggi orientati agli oggetti.

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

Slide 22

ma rispettandone le differenze.� Spesso il polimorfismo si usa per garantire il

Single Choice Principle.

Polimorfismo

� Si individuano delle operazioni comuni per interfaccia, ma diverse per comportamento.

� Una classe dichiara la funzione e delle sottoclassi ne forniscono diverse implementazioni.

Slide 23

Shape

Circle Triangle Square

+ void draw(GC& aCtx)

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

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 :

Slide 24

Esiste un tipo statico ed un tipo dinamico :

Tipo statico Tipo statico tipo del riferimento,

dichiarato a compile time

Tipo dinamico Tipo dinamico tipo dell’oggetto

puntato a run time

Relazioni part–of

� Tra gli oggetti spesso sussiste una relazione part–of(detta anche di composizione ).

Slide 25

Delega

� Attraverso la relazione part–of è possibile realizzare un importante comportamento: la delega (delegation). • Una classe demanda ad un’altra classe alcune parti del

servizio che la prima deve rendere disponibile.

Modularità nel codice: ogni classe si occupa di

Slide 26

� Modularità nel codice: ogni classe si occupa di realizzare una specifica funzionalità, senza mescolare aspetti concettualmente diversi tra loro

� Nel disegnare l’architettura di un programma dobbiamo decidere quale tipo di relazione utilizzare per connettere le nostre classi:

is–a (ereditarietà) o part–of (delega)

OOP

� Le tecnologie OO permeano tutto il ciclo di sviluppo del software• OOA - (Object Oriented Analysis)

• OOD - (Object Oriented Design)

• OOP - (Object Oriented Programming)

Slide 27

• OOP - (Object Oriented Programming)

� Le soluzioni proposte dalla OOP nascono da considerazioni generali di Ingegneria del Software.• Le tecnologie orientate agli oggetti cercano di favorire la

progettazione di software di qualità .

La Qualità del Software

� Un sistema software può essere valutato in base a molte qualità, che si possono dividere in due grandi categorie:• Qualità Esterne (viste dal cliente/utente; funzionalità

Slide 28

• Qualità Esterne (viste dal cliente/utente; funzionalità fornite dal sistema)• Usabilità, Correttezza, Efficienza,...

• Qualità Interne (viste dallo sviluppatore; legate allo sviluppo del software, non sono visibili all’utente)• Mantenibilità, Estendibilità, ...

• Esiste ovviamente un collegamento/relazione tra le due categorie • Non è possibile rilasciare all’utente un software di qualità se

il sistema non si basa su buone qualità interne

Evoluzione Del Software

� Il costo del software è principalmente dovuto al mantenimento/evoluzione

Slide 29

Breakdown ofmaintenancecosts. Source:[Lientz 1980]

Dati validi ancora oggi

Modularità

� La modularità viene spesso considerata una qualità interna, ma in realtà non è chiaramente definita.

� Si potrebbe definire informalmente così:

Slide 30

� Si potrebbe definire informalmente così:

Un sistema è modulare se i suoi moduli sono “ben strutturati” e “ben collegati insieme”.

⇒ Cerchiamo delle proprietà più precise.

Modularità

� Per descrivere la modularità e mostrare come essa supporti le qualità interne del software, vedremo:• Cinque Criteri (per valutarla)

Slide 31

• Cinque Criteri (per valutarla)• Cinque Regole (per garantirla)• Cinque Principi (per praticarla)

Cinque Criteri (1)

� Decomponibilità• Un sistema modulare può essere decomposto in parti più piccole,

connesse da una struttura semplice, abbastanza indipendenti da lavorarci separatamente.

Slide 32

Cinque Criteri (2)

� Componibilità• Un sistema modulare favorisce la produzione di elementi che

possono essere combinati insieme in un ambiente diverso da quello in cui sono stati creati.

Slide 33

Cinque Criteri (3)

� Comprensibilità• In un sistema modulare ogni parte può essere compresa

isolatamente da un osservatore umano, senza che questo debba conoscere le altre parti.

Slide 34

Cinque Criteri (4)

� Continuità• Un sistema modulare è tale che ad un cambiamento “piccolo” nelle

specifiche del sistema corrisponda un cambiamento “piccolo” nell’implementazione.

Slide 35

Cinque Criteri (5)

� Protezione• Un sistema modulare confina gli effetti di condizioni anormali

all’interno del modulo in cui avvengono, o al più in un numero ristretto di moduli.

Slide 36

Cinque Regole(1)

� Corrispondenza Diretta• La struttura modulare del sistema software dovrebbe

rimanere compatibile con quella del problema che il sistema tenta di risolvere.

Slide 37

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

Cinque Regole(2)

� Poche Interfacce• Ogni modulo dovrebbe comunicare con il minor

numero possibile di altri moduli.

� Questa regola serve a supportare la continuità e

Slide 38

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

cambiamenti si rifletteranno su pochi altri.

Cinque Regole(3)

� Interfacce Piccole• Quando due moduli comunicano, dovrebbero

scambiarsi meno informazioni possibile.

� Anche questa regola supporta la continuità e la

Slide 39

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.

Cinque Regole(4)

� Interfacce Esplicite• Il fatto che due moduli comunicano dovrebbe essere

ovvio leggendo il loro codice.

� Questa regola supporta comprensibilità,

Slide 40

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

prevedere gli effetti dei cambiamenti, ed a comporlo/scomporlo.

Cinque Regole(5)

� Information Hiding• un modulo deve dichiarare un sottoinsieme pubblico

delle sue informazioni.

� Questa regola è il cardine fondamentale per

Slide 41

Questa regola è il cardine fondamentale per ottenere la continuità.• Ogni decisione di progetto o implementazione che

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

Cinque Principi

� I criteri e le regole visti prima esprimono (apparentemente) concetti legati più al progetto del sistema che al linguaggio di programmazione.

Slide 42

� I cinque principi seguenti, invece, si riflettono sui costrutti linguistici e sono il riflesso pratico delle regole viste prima.

Cinque Principi (1)

� Unità Linguistiche Modulari• Il linguaggio di programmazione deve supportare i

moduli come unità sintattiche.

� I criteri di modularità devono arrivare fino

Slide 43

I criteri di modularità devono arrivare fino all’implementazione: se il linguaggio non sa esprimere in forma compilabile i moduli individuati nelle fasi precedenti, non si può costruire un sistema modulare.

Cinque Principi (2)

� Documentazione Incorporata• La documentazione interna di un modulo deve

essere contenuta nel modulo stesso.

� Una buona documentazione incrementa la

Slide 44

Una buona documentazione incrementa la comprensibilità, ma deve essere aggiornata o diventa addirittura fuorviante e dannosa.• Mantenere la documentazione vicino al codice.

Cinque Principi (3)

� Accesso Uniforme• I servizi esposti da un modulo non devono rivelare

se sono implementati con calcoli o con dati.

� Questo principio serve a rispettare l’information

Slide 45

Questo principio serve a rispettare l’information hiding ed aiuta a garantire la continuità; consente al modulo di cambiare i trade-off spazio-tempo senza problemi.

Cinque Principi (4)

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

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

Slide 46

� Chi usa un modulo vuole saperne il meno possibile (black box).

� Per essere esteso, un modulo deve rivelare qualcosa in più (white box).

Cinque Principi (5)

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

alternative, al più un modulo deve conoscerne l’elenco.

Slide 47

� Quando “i casi sono due” nella versione 1.0, si può star sicuri che “i casi sono quindici” nella versione 2.0.• Per salvaguardare continuità ed estendibilità.