5 programmazione oggetti -...

25
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

Transcript of 5 programmazione oggetti -...

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++

12

Evoluzione dei linguaggi di programmazione

Evoluzione dei linguaggi di programmazione

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