1
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
2
Dove siamo arrivati… Linguaggi di
programmazione
Cosa faremo… gli OOP
…ma prima capiamo meglio cos’è la programmazione
3
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 privi di qualsiasi ambiguità (in genere).
Categorie � I linguaggi di programmazione si possono
suddividere fondamentalmente in tre categorie:
� Linguaggi Macchina
� Linguaggi Assembler
� Linguaggi ad alto livello
4
Linguaggio Macchina � Ri f le t te l ’organizzaz ione de l la
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 l inguaggio 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)
5
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
6
Il codice � Programmare in un determinato linguaggio ad alto
livello significa produrre un file di puro testo che p rende i l nome d i cod ice sorgen te ( o semplicemente sorgente)
� La traduzione in linguaggio macchina di un codice sorgente prende il nome di codice eseguibile (o semplicemente eseguibile)
7
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 scr i t to in un par t i co la re l i nguagg io d i 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., sou rce l angua ge ) i n uno denominato obiettivo o oggetto ( i n g l . , t a rge t l a n g u a ge ) , e l a b o r a b i l e d a l l ' e n t i t à 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.
8
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, r ispetto al la c o m p i l a z i o n e , u n a s c a r s a 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
9
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).
10
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 Procedurale (o Imperativa) � Programmazione Funzionale � Programmazione Logica
� Programmazione Object-Oriented
11
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++
13
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.
14
Esempio di Sistema Lettore Mp3
• Attività: ascoltare musica
• Componenti: Cuffie, Software,
Batteria, Memoria
Sistema iPod
File audio formato.mp3
File audio elaborato
Schema Sistemico
Progr. Procedurale Vs Progr. Oggetti
Problema Complesso
Scomposizione in procedure
Programmazione procedurale
• Molta attenzione: • funzioni che il programma deve possedere
• Poca attenzione: • analisi del sistema
Sistema complesso
Scomposizione in oggetti
Programmazione ad oggetti
• Molta attenzione: • dati (oggetti) • analisi del sistema • individuare entità del sistema • interazioni tra entità
15
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
16
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 FIAT 500
Oggetto Honda Civic
Oggetto Nissan Micra
17
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
18
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 Diesel
Sottoclasse Auto Benzina
Sottoclasse Auto GPL
Oggetto FIAT 500
Oggetto Honda Civic
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
19
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)
20
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;
� Privata ( - ) : l ’a t t r ibuto/metodo è accessibile solo all’interno della rispettiva classe;
� Protetta (#): l’attributo/metodo è accessibile da tutte le classi che “ereditano” da quella che lo contiene.
21
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
22
Es. di Interazione tra gli oggetti
Oggetto: Pilota
ATTRIBUTI: Età: … Nazionalità: … Tipo Patente:… … …
Oggetto: Auto FIAT 500
ATTRIBUTI: Velocità= 110 Km Colore = Giallo Num.porte= Tre … …
METODI: Avviati ( ) Accelera( ) Fermati ( ) …
Messaggio
Auto FIAT 500.Accelera (110)
Il pilota accelera a 110 Km
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
23
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
24
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?
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
PROGETTARE
UML: Sequence Diagram
25
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