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