5. Linguaggi di programmazione e introduzione all`OOP

Transcript

5. Linguaggi di programmazione e introduzione all`OOP
Introduzione alla
Programmazione ad
Oggetti (OOP)
Prof. Emanuele Papotto
Introduzione alla Programmazione ad
Oggetti
—  Cosa Faremo:
—  I linguaggi OOP
—  Definizione di : classe, oggetto, attributi,
metodi
—  Cenni di UML
—  Concetti fondamentali della programmazione
a oggetti
1
Dove siamo arrivati…
Linguaggi di
programmazione
Cosa faremo… gli OOP
…ma prima capiamo meglio
cos’è la programmazione
2
La programmazione
—  La Programmazione (in Informatica) è l’attività
svolta per creare un Programma. Un Programma è
costituito, come ogni altro tipo di linguaggio, da un
alfabeto, con cui viene costruito un insieme di
parole chiave (il vocabolario) e da un insieme di
regole sintattiche per l’uso corretto delle parole del
linguaggio
—  I linguaggi di programmazione differiscono
comunque dai linguaggi naturali: sono meno
espressivi ma più precisi
—  Sono semplici e poveri (poche parole chiave, poche
regole), poveri ma
genere).
privi di qualsiasi ambiguità (in
Categorie
—  I linguaggi di programmazione si possono
suddividere fondamentalmente in tre categorie:
—  Linguaggi Macchina
—  Linguaggi Assembler
—  Linguaggi ad alto livello
3
Linguaggio Macchina
—  R i f l e t t e l ’ o rg a n i z z a z i o n e d e l l a
macchina più che la natura del
problema da risolvere
—  le CPU sono progettate in modo da
riconoscere un insieme di istruzioni
codificate come configurazioni di bit.
L’insieme di queste istruzioni è
appunto chiamato linguaggio
macchina
Linguaggi Assembler
—  Versione simbolica del linguaggio macchina in cui i
nomi delle operazioni e degli operandi sono indicati
con codici simbolici
—  Esiste (quasi) una “corrispondenza biunivoca” tra
istruzione e numero di operazioni eseguite dal
sistema
—  necessita di un traduttore che lo trasformi in word
di 16, 32 o 64 bit (affinché il calcolatore lo possa
eseguire)
4
Linguaggi ad alto livello
—  Elementi intermedi di una varietà di linguaggi ai cui
estremi si trovano il linguaggio macchina, da un
lato, ed i linguaggi naturali, dall’altro.
—  Più sofisticati ed astratti, slegati dal funzionamento
fisico della macchina
—  Necessitano di un traduttore che lo trasformi in
word di bit (affinché il calcolatore lo possa
eseguire)
Differenze tra i linguaggi
—  Esistono, quindi, diversi livelli di astrazione:
—  Linguaggi macchina e Assembler:implicano la
conoscenza dettagliata delle caratteristiche della
macchina (registri, dimensione dati, set di istruzioni)
—  Semplici algoritmi implicano la specifica di molte
istruzioni
—  Linguaggi di alto livello: Il programmatore può
astrarre dai dettagli legati all’architettura ed
esprimere i propri algoritmi in modo simbolico
—  Sono indipendenti dalla macchina hardware sottostante
5
Il codice
—  Programmare in un determinato linguaggio ad alto
livello significa produrre un file di puro testo che
prende il nome di codice sorgente (o
semplicemente sorgente)
—  La traduzione in linguaggio macchina di un codice
sorgente prende il nome di codice eseguibile (o
semplicemente eseguibile)
6
Traduzione
—  Affinché un programma scritto in un qualsiasi
linguaggio di programmazione sia comprensibile
(e quindi eseguibile) da parte di un calcolatore,
occorre tradurlo dal linguaggio originario al
linguaggio della macchina
—  Il traduttore converte il testo di un programma
scritto in un par ticolare linguaggio di
programmazione (sorgente) nella corrispondente
sorgente rappresentazione in linguaggio macchina
(programma eseguibile)
—  Generalmente ogni singola istruzione di un
linguaggio di alto livello corrisponde a molte
istruzioni in linguaggio macchina.
Tipi di traduttore
—  Compilatore
È un programma che traduce un
codice scritto in un linguaggio
denominato sorgente (ingl.,
source language) in uno
denominato obiettivo o oggetto
(ingl., target language),
elaborabile dall'entità
destinataria. Generalmente
l'entità è la CPU e il linguaggio
in output è di livello inferiore al
primo, di basso livello come il
linguaggio macchina o di livello
intermedio come il linguaggio
assembly o il bytecode.
7
Tipi di traduttore
—  Interprete
È un programma che legge ed esegue
di volta in volta ciascuna istruzione di
programma, scritto in un codice
sorgente. Il programma stabilisce
quale procedura eseguire per ogni
istruzione e come eseguirla, riga per
riga, anziché tradurre l'intero codice
sorgente una volta per tutte come
avviene nella classica compilazione.
Nell'interpretazione, un'istruzione già
tradotta ed eseguita, se deve essere
ripetuta in seguito, andrà tradotta
nuovamente in linguaggio macchina.
Questo compor ta, rispetto alla
compilazione, una scarsa
ottimizzazione del codice tradotto, un
maggiore tempo di esecuzione, ma allo
stesso tempo una minore occupazione
di memoria principale perché non
avviene la memorizzazione della
traduzione delle istruzioni.
Compilatore vs Interprete
—  Compilatore
—  Esecuzione efficiente
—  Codice eseguibile non portabile
—  Ogni modifica del programma richiede una nuova
compilazione
—  Interprete
—  Esecuzione meno efficiente
—  Programma portabile
—  Esecuzione immediata ad ogni modifica
8
Approcci ibridi
—  Esistono invece numerosi approcci ibridi fra linguaggi
completamente interpretati e completamente
compilati.
—  Alcune versioni di Lisp consentono entrambi gli
approcci, e consentono addirittura l'esecuzione di
programmi parzialmente interpretati e parzialmente
compilati, cosicché, per esempio, un nuovo
sottoprogramma possa essere provato in forma
interpretata e, una volta terminato il debugging, essere
compilato per migliorarne le prestazioni.
—  Molti interpreti non eseguono direttamente il codice
sorgente, ma lo convertono preventivamente in una
forma interna più compatta, per esempio in un albero
sintattico astratto
Approcci ibridi
—  Diverso è l'approccio di Emacs Lisp e Java, in cui
viene impiegato un compilatore che trasforma il
codice sorgente in un formato intermedio detto
(per entrambi i linguaggi!) bytecode, abbastanza
vicino al linguaggio macchina (e quindi con un
costo di interpretazione moderato), ma eseguito da
un interprete e non direttamente dal processore (e
quindi portabile).
9
Approcci ibridi
—  Una tecnica che ha destato notevole interesse negli
ultimi anni (ed è applicata dalla maggior parte
delle attuali implementazioni di Java e dai linguaggi
della famiglia DOTNET (.NET) di Microsoft) prende
il nome di compilazione "just in time" o JIT.
—  Questa tecnica può essere considerata come una
ottimizzazione dell'interpretazione, in cui
l'interprete compila durante l'esecuzione i
frammenti di codice che vengono eseguiti con
maggiore frequenza, per ridurre il costo delle loro
successive esecuzioni.
Paradigmi di programmazione
—  Un paradigma di programmazione è un modello
concettuale che fornisce la “struttura” di un
programma.
—  I principali paradigmi di programmazione sono:
— 
— 
— 
— 
Programmazione
Programmazione
Programmazione
Programmazione
Procedurale (o Imperativa)
Funzionale
Logica
Object-Oriented
10
Paradigmi di programmazione
—  Procedurale (o Imperativa): un programma viene inteso
come un insieme di istruzioni (dette anche direttive o
comandi), ciascuna delle quali può essere pensata come
un "ordine" che viene impartito alla macchina virtuale
del linguaggio di programmazione utilizzato.
—  Modula-2, Pascal, Cobol, Ada, Basic, C, Fortran, Algol
—  Programmazione Funzionale: il flusso di esecuzione del
programma assume la forma di una serie di valutazioni
di funzioni matematiche
—  Lisp, Scheme, ML
Paradigmi di programmazione
—  Programmazione Logica: adotta la logica del primo
ordine sia per rappresentare sia per elaborare
l'informazione. Un programma è un insieme di fatti e
regole e la sua esecuzione equivale alla realizzazione di
una dimostrazione
—  Prolog
—  Programmazione Object-Oriented: permette di definire
oggetti software in grado di interagire gli uni con gli altri
attraverso lo scambio di messaggi. Un programma è un
insieme di oggetti (astrazioni della realtà) dotati di proprietà
(dati) e metodi (procedure) che comunicano tramite scambio
di messaggi
—  Simula67, Smalltalk, Java, C++
11
Evoluzione dei linguaggi di
programmazione
Evoluzione dei linguaggi di
programmazione
12
Evoluzione dei linguaggi di
programmazione
Che cosa è l’OOP ?
—  Nasce intorno agli anni ’70 a livello teorico la
metodologia della programmazione orientata agli
oggetti detta OOP (Object-Oriented Programming)
—  Si tratta di una metodologia di programmazione che si
contrappone alla classica tecnica “procedurale”
strutturata
—  Nella metodologia OO (Object-Oriented) il problema
viene pensato in termini di sistema ovvero un insieme
di componenti che interagiscono tra loro per
svolgere un’ attività
—  Un programma è un insieme di classi e oggetti (astrazioni della
realtà) dotati di proprietà (dati) e metodi (procedure) che
comunicano tramite scambio di messaggi.
13
Esempio di Sistema
Lettore Mp3
• Attività: ascoltare musica
• Componenti: Cuffie, Software,
Batteria, Memoria
Schema Sistemico
Sistema iPod
File audio
formato.mp3
File audio
elaborato
Progr. Procedurale Vs Progr. Oggetti
Programmazione
procedurale
Problema Complesso
Scomposizione in procedure
Programmazione
ad oggetti
Sistema complesso
Scomposizione in oggetti
•  Molta attenzione:
•  funzioni che il programma
deve possedere
•  Poca attenzione:
•  analisi del sistema
•  Molta attenzione:
•  dati (oggetti)
•  analisi del sistema
•  individuare entità del sistema
•  interazioni tra entità
14
Elementi della OOP: Classe
—  Una classe è un’astrazione che rappresenta le
proprietà comuni (struttura e comportamento) ad
un insieme di oggetti concreti (istanze).
—  Una classe è un “modello” per un insieme di oggetti
analoghi, caratterizzati da:
—  proprietà (attributi) a cui è associato un tipo che
rappresenta l’insieme dei possibili valori che oggetti
appartenenti alla classe possono avere per la proprietà
(bool, integer, real, string, etc.)
—  funzioni o metodi che possono essere eseguite sugli
oggetti appartenenti alla classe
Elementi della OOP: Oggetto
—  Un’istanza di una classe è un oggetto che è
un’entità concreta che esiste nel tempo (viene
costruita e poi distrutta) e nello spazio (occupa
memoria).
—  Un oggetto è un’entità astratta composta da:
—  proprietà (attributi) che caratterizzano l’oggetto e ne
definiscono lo stato
—  Funzioni (metodi) che possono essere eseguite
sull’oggetto e che possono modificare lo stato dell’oggetto
15
Elementi della OOP: Oggetto
—  Tutti gli oggetti di uno stesso tipo formano una
classe di oggetti
OGGETTO = “ISTANZA” DI UNA CLASSE
—  Gli oggetti descritti tramite proprietà e funzioni
sono una astrazione degli oggetti reali dei quali si
considerano solo le caratteristiche necessarie per
l’applicazione da sviluppare
—  Es.: in una applicazione bancaria l’altezza di una
persona non è una informazione rilevante mentre lo
è in una applicazione medica. Viceversa per il
codice fiscale...
Classi e oggetti
Classe
Automobile
Oggetto
Honda Civic
Oggetto
FIAT 500
Oggetto
Nissan Micra
16
Attributi e metodi
—  Ogni oggetto contiene al suo interno:
—  attributi: informazioni che servono per
descrivere l’oggetto e che corrispondono
alle caratteristiche, alle proprietà fisiche
dell’oggetto stesso
—  metodi: operazioni che un oggetto è in grado
di compiere e che corrispondono ai
comportamenti dell’oggetto stesso in una
determinata circostanza
Oggetto
=
Attributi
+
Metodi
Esempio di Classe e Oggetto
Classe: Automobile
ATTRIBUTI:
Velocità
Colore
Num.porte
Liv. Carburante
Posizione marcia
…
METODI:
Avviati
Accelera
Fermati
Gira (sx – dx)
Cambia marcia
…
Oggetto: FIAT 500
ATTRIBUTI:
Velocità: 110 Km
Colore : Giallo
Num.porte: Tre
…
…
METODI:
Avviati
Accelera
Fermati
…
Ereditati
dalla classe
17
Principi fondamentali dell’ OOP - 1
—  Ereditarietà
—  Posso creare una nuova classe come estensione di una già
esistente e può essere singola o multipla.
—  La classe che è stata derivata prende il nome di sottoclasse, la
classe generatrice di una sottoclasse si chiama sopraclasse.
—  La gerarchia delle classi si descrive con il grafo di gerarchia.
—  Gli oggetti possono ereditare da altri oggetti comportamenti e
proprietà aggiungendone dei propri
esempio
Classe
Automobile
Sottoclasse
Auto Benzina
Oggetto
Honda Civic
Sottoclasse
Auto Diesel
Oggetto
FIAT 500
Sottoclasse
Auto GPL
Oggetto
Nissan Micra
Principi fondamentali dell’ OOP - 2
—  Incapsulamento
—  Una classe mostra una serie di funzionalità, ma mai come
le implementa
—  L’incapsulamento (o information hiding) è il principio
secondo cui la struttura e il funzionamento interno di un
oggetto sono “nascosti” all’esterno.
—  Es: Per guidare un’automobile non è necessario sapere come
funziona un motore a scoppio per usarla, basta conoscere il
modo di “invocarne le funzionalità.
esempio
18
Principi fondamentali dell’ OOP - 3
—  Polimorfismo
—  Due classi possono implementare una stessa funzione in
modo differente, ma questa potrà essere richiamata alla
stessa maniera da altre classi
—  Invocando lo stesso metodo su classi derivate da una
stessa superclasse, ognuna risponde col proprio metodo;
i clienti di tali metodi non hanno bisogno di modificarsi
rispetto ad altre classi derivate
—  E’ il concetto più potente della OOP!
esempio
Principi fondamentali dell’ OOP - 4
—  Persistenza
—  La persistenza nella OOP è la proprietà di un oggetto
di sopravvivere al processo che l'ha creato
—  La persistenza si realizza registrando l’oggetto nella
memoria di massa, salvando l’elendo degli attributi con
il loro valore sul disco
—  Conseguente possibilità di creazione di DataBase
orientati agli oggetti OODB (Object-Oriented
Database)
19
Le classi
—  Una classe è una descrizione di un insieme di
oggetti che condividono gli stessi attributi,
operazioni, relazioni e semantica.
—  Graficamente è rappresentata per mezzo di un
rettangolo suddiviso in tre sezioni: nome, attributi,
operazioni.
Nome Classe
attributo 1
attributo 2
…
metodo 1
metodo 2
…
Le classi: visibilità
—  Tipologie di visibilità:
—  Pubblica (+): l’attributo/metodo è
accessibile da qualsiasi altro oggetto
chepossiede un riferimento all’oggetto che
lo contiene;
—  P r iv a t a ( - ) : l ’ a t t r i b u t o / m e t o d o è
accessibile solo all’interno della rispettiva
classe;
—  Protetta (#): l’attributo/metodo è
accessibile da tutte le classi che
“ereditano” da quella che lo contiene.
20
Le classi: visibilità
Interazione tra gli oggetti
—  Un OOP è caratterizzato dalla presenza di tanti
oggetti che comunicano ed interagiscono tra loro con
un meccanismo chiamato scambio di messaggi
—  Un messaggio è costituito da:
—  Un destinatario: cioè l’oggetto verso il quale il messaggio è
indirizzato
—  Un selettore: identifica il metodo che si vuole attivare,
presente nell’oggetto destinatario
—  Un elenco di argomenti: insieme dei parametri che vengono
passati all’oggetto quando si richiede l’attivazione di un
metodo
21
Es. di Interazione tra gli oggetti
Oggetto: Pilota
ATTRIBUTI:
Età: …
Nazionalità: …
Tipo Patente:…
…
…
Il pilota accelera a 110 Km
Oggetto: Auto FIAT 500
Messaggio
Auto FIAT 500.Accelera (110)
ATTRIBUTI:
Velocità= 110 Km
Colore = Giallo
Num.porte= Tre
…
…
METODI:
Avviati ( )
Accelera( )
Fermati ( )
…
Cenni
UML (Unified Modeling Language)
—  E’ nato tra il ‘94 e il ’95 quando gli studiosi Booch,
Rumbaugh e Jacobson si sono associati per definire
una metodologia standard internazionale, un linguaggio
di modellazione chiamato UML (Unified Modeling
Language), che è divenuto lo standard per modellare
software object-oriented.
—  Permette di esprimere ed analizzare il modello del
sistema che si vuole realizzare
22
UML prevede 7 tipi di diagrammi:
1.  Use case diagram: elenca i casi d’uso del sistema e le
loro relazioni.
2.  Class diagram: descrive la struttura dati degli oggetti
del sistema e le loro relazioni. È il diagramma più
importante, da cui si può generare il codice
3.  Sequence diagram: mostra le interazioni tra gli
oggetti durante scenari di funzionamento del sistema,
privilegiando la sequenzialità temporale
UML prevede 7 tipi di diagrammi:
4.  Collaboration diagram: mostra le interazioni tra gli
oggetti durante scenari di funzionamento del
sistema, privilegiando la struttura del sistema stesso
5.  State e activity diagram: descrivono gli stati di un
oggetto e le sequenze eventi-azioni-transizioni di una
funzione
6.  Component diagram: descrive l’architettura fisica del
sistema
7.  Deployment diagram: descrive la struttura del
sistema hardware e l’allocazione dei vari moduli
software
23
UML il Sequence diagram
—  Il Sequence diagram descrive il comportamento dinamico
tra gli attori ed il sistema e tra gli oggetti del sistema
—  Con questo diagramma evidenziamo la sequenza temporale
delle azioni
Es.: Cosa fare prima di programmare?
UML: Sequence Diagram
Programmatore
OOP
Una Classe
Un Attributo
Un metodo
Un oggetto
Linguaggi di
programmazione
PROGETTARE
DEFINIRE ATTRIBUTI
DEFINIRE METODI
DEFINIRE OGGETTI
PROGRAMMARE IN UN LINGUAGGIO CHE SUPPORTA OOP
24
Linguaggi di programmazione
orientati ad oggetti
—  Linguaggi puri (ogni cosa è un oggetto)
—  Smalltalk: sviluppato al centro di ricerche Xerox di Palo alto
in California durante gli anni '70, usa un’ ereditarietà singola.
—  Eiffel: sviluppato da Bertrand Meyer in Francia nel 1985,
supporta l’ereditarietà multipla
—  Linguaggi ibridi (esistono tipi di dati che non sono
oggetti)
—  C++: sviluppato da Bjarne Stroustrup ai AT&T Bell
Laboratories New York nel 1979 come un miglioramento del
linguaggio C
—  Java: ideato da James Gosling e altri ingegneri della Sun
MicroSystem in California, rilasciato il 23 maggio 1995
—  Delphi: ideato dalla Borland nel 1995
25