Object-Oriented Programming (OOP) Romina Eramo [email protected] http://www.di.univaq.it/romina.eramo/tlp Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Roadmap • Introduzione ai linguaggi di programmazione • Principi base del paradigma OO – Astrazione – Oggetto e Classe – Incapsulamento e Information Hiding – Modularità – Ereditarietà – Polimorfismo • Java vs C++ Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche I linguaggi di programmazione • La programmazione può essere definita come la disciplina che demanda al calcolatore elettronico la soluzione di un determinato problema • Un linguaggio di programmazione è un insieme di parole, codici, e simboli che permettono al programmatore di dare istruzioni al calcolatore • Diversi linguaggi di programmazione sono stati concepiti nel corso degli anni, ognuno con le proprie regole, o sintassi per scrivere tali istruzioni Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche ...verso i linguaggi ad alto livello • Linguaggio macchina – linguaggio in cui sono scritti programmi direttamente eseguibili dal calcolatore • Linguaggio ad alto livello – linguaggio indipendente dall'hardware e più "facile" da utilizzare per il programmatore umano – richiede una traduzione in linguaggio macchina • la compilazione: traduzione che avviene una sola volta • l’interpretazione: traduzione in tempo reale Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche ...i livelli di astrazioni • Tutti i linguaggi di programmazione forniscono astrazioni – in linguaggio macchina sono definite l'insieme di istruzioni fondamentali che un processore è in grado di compiere e in cui i codici di programmi da eseguire devono essere tradotti – i linguaggi a più alto livello si ottengono come semplice codifica a partire dal linguaggio macchina in un crescendo di astrazione • La complessità dei problemi che si è in grado di risolvere è direttamente correlata al genere e alla qualità dell’astrazione considerata – Il linguaggio assembler è una piccola astrazione della macchina sottostante – I cosiddetti linguaggi “imperativi” (Fortran, BASIC, C) sono astrazioni del linguaggio assembler anche se comunque continuano ad imporre di pensare in termini di struttura del calcolatore invece che della struttura del problema che si sta risolvendo Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche ...i livelli di astrazioni • Tocca al programmatore stabilire l’associazione fra il modello della macchina (nello “spazio delle soluzioni”) e il modello del problema che viene risolto (nello “spazio dei problemi”) • Anziché modellare una macchina per risolvere il problema si può pensare di modellare il problema Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Paradigmi di programmazione Linguaggio Modello computazionale In cosa consiste un programma Imperativo Cambiamenti di Esempi Sequenza di assegnazioni che stato della memoria producano lo stato finale della macchina (soluzione del problema) Pascal, C Funzionale Definizione ed applicazione di funzioni Combinazioni di funzioni valutate per restituire un certo output Lisp Logico Predicati logici come specifiche eseguibili Sequenza di asserzioni di fatti e regole eseguite per verificare il soddisfacimento del goal Prolog Ad oggetti Modello ad oggetti Progettazione e realizzazione di codice sotto forma di classi che interagiscono tra di loro Java, C++ Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Storia dei linguaggi di programmazione ForTran anni ‘50 Cobol Lisp Algol anni ‘60 ‘60 BASIC Pascal C Smalltalk SIMULA 67 anni ‘65 anni ‘70 ModulaModula-2 Ada C ++ anni ‘80 Java anni ‘95 • Fortran (Formula translator) – 1954-1956 da John Backus presso IBM – espressioni esprimibili per mezzo di notazioni matematiche ordinarie • i+2*j) – primo linguaggio ad introdurre le variabili, cicli, procedure, etc. – nessun supporto per ricorsione e gestione implicita della memoria • Cobol – 1959 da Grace Murray Hopper – applicazioni finanziarie – sintassi definita in modo da rendere la scrittura di istruzioni simile alla scrittura di frasi nel linguaggio naturale • e.g., “add 1 to x giving y” (y = x+1) Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Storia dei linguaggi di programmazione ForTran anni ‘50 Cobol Lisp Algol anni ‘60 BASIC SIMULA 67 anni ‘65 Pascal C Smalltalk anni ‘70 ‘70 ModulaModula-2 Ada C ++ Java anni ‘80 anni ‘95 • Lisp – – – – 1965 da John McCarthy funzioni high-order garbage collection Successori del LISP: Miranda, ML, Haskell anche se non particolarmente usati • Algol – 1958-1960 da un comitato internazionale di informatici – un migliore sistema dei tipi – prime strutture dati • Entrambi hanno ricorsione, funzioni e procedure Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Storia dei linguaggi di programmazione ForTran anni ‘50 Cobol Lisp Algol anni ‘60 BASIC SIMULA 67 anni ‘65 Pascal C Smalltalk anni ‘70 ModulaModula-2 Ada C ++ anni ‘80 ‘80 Java anni ‘95 • BASIC 1964 Kemeny e Kurtz – Il primo linguaggio di programmazione pensato per uso personale – Semplice da imparare anche se limitato – Le versioni correnti del linguaggio non sono così “basic” e semplici da imparare • SIMULA 67 – Estensione di Algol 60 progettato per la simulazione di processi concorrenti – Introduce i concetti base dell’object oriented: classe ed incapsulamento – Predecessore di Smalltalk e C++ Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento Ingegneria CSI 3125, History,dipage 10e Scienze dell’Informazione e Matematiche Storia dei linguaggi di programmazione ForTran anni ‘50 ‘50 Cobol Lisp Algol anni ‘60 BASIC SIMULA 67 anni ‘65 Pascal C Smalltalk anni ‘70 ModulaModula-2 Ada C ++ anni ‘80 Java anni ‘95 ‘95 • Pascal – Successore di Algol 60. – Ottimo linguaggio per introdurre la programmazione strutturata – Un buon primo linguaggio da imparare • ModulaModula-2 – Successore di Pascal – Meccanismi per gestire la concorrenza (più processi in parallelo) • Ada – Progettato per supportare in maniera efficace la concorrenza – Ci sono due standard: Ada 83 (l’originale), and Ada 95 Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento Ingegneria CSI 3125, History,dipage 11e Scienze dell’Informazione e Matematiche Storia dei linguaggi di programmazione ForTran anni ‘50 Cobol Lisp Algol anni ‘60 BASIC SIMULA 67 anni ‘65 Pascal C Smalltalk anni ‘70 ModulaModula-2 Ada C ++ anni ‘80 ‘80 Java anni ‘95 • C – Il linguaggio di implementazione di Unix – Pericoloso se non usato opportunamente: non raccomandato per i programmatori inesperti – Relativamente di basso livello • Smalltalk – Linguaggio di programmazione object-oriented più pulito di Java e molto più pulito di C++ – Viene fornito con un’interfaccia grafica ed un ambiente di programmazione integrato Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento Ingegneria CSI 3125, History,dipage 12e Scienze dell’Informazione e Matematiche Storia dei linguaggi di programmazione ForTran anni ‘50 Cobol Lisp Algol anni ‘60 ‘60 BASIC SIMULA 67 anni ‘65 Pascal C Smalltalk anni ‘70 ModulaModula-2 Ada C ++ Java anni ‘80 anni ‘95 ‘95 • C++ – Estensione object-oriented del linguaggio imperativo C – Sintassi complicata con difficile semantica – Molto richiesto • Java – Rielaborazione del C++ – Full object orientation (anche se non ai livelli di Smalltalk) – Progettato per la programmazione Internet programming, anche se generalpurpose – Solitamente è considerato essere lento – Forse il prossimo standard de-facto Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento Ingegneria CSI 3125, History,dipage 13e Scienze dell’Informazione e Matematiche Storia dei linguaggi di programmazione ForTran anni ‘50 Cobol Lisp Algol anni ‘60 ‘60 BASIC SIMULA 67 anni ‘65 Pascal C Smalltalk anni ‘70 ModulaModula-2 Ada C ++ anni ‘80 Java anni ‘95 • Linguaggi di Scripting – Text processing: • Perl • Python – Web programming • JavaScript • PHP Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento Ingegneria CSI 3125, History,dipage 14e Scienze dell’Informazione e Matematiche Computer Languages History • Per maggiori dettagli: http://www.levenez.com/lang/ Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Jump star to OOP Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Perchè OOP? Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Perchè OOP? Portare lo sviluppo software vicino alla vita reale Nella vita reale abbiamo a che fare con oggetti. Vogliamo trattare con il software allo stesso modo. Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Perchè OOP? Separazione di concetti Nella vita reale non ci preoccupiamo di come un oggetto è fatto o di cosa contiene. Ci limitiamo ad usarlo. Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Perchè OOP? Le componenti sono replicabili Nella vita reale le componenti con funzionalità e specifiche simili sono replicabili. Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Perchè OOP? Sviluppo di componenti in parti distinte Nella vita reale gli sviluppatori di una componente non si preoccupano dell’intero sistema, o di come le sue componenti saranno usate nell’intero sistema. Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Perchè OOP? Fornire la struttura e realizzare prototipi Nella vita reale pensiamo alla struttura e produciamo modelli software e sviluppiamo prototipi prima di ottenere un'istanza effettiva. Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Perchè OOP? Usa e getta Nella vita reale usiamo le componenti e una volta che abbiamo finito con esse le scartiamo. Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Perchè OOP? Riuso di componenti Nella vita reale la stessa componente può essere usata (riusata) per una molteplicità di sistemi. Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Perchè OOP? Sistema facile da capire Nella vita reale possiamo comprendere sistemi complessi adottando un approccio top-down o botton-up. Questo ci conduce verso piccoli oggetti. Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Cosa è OOP? Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Cosa è OOP? L’ OOP (Object-oriented programming) è un paradigma di programmazione organizzato attorno ad “oggetti” piuttosto che “azioni” e “dati” piuttosto che “ logica” Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Cosa è OOP? • L’OOP prevede di raggruppare in un’unica entità “classe” sia le strutture dati che le procedure che operano su di esse, creando un “oggetto” software dotato di proprietà (dati dati) procedure) dati e metodi (procedure procedure che operano sui dati dell’oggetto stesso Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Principi base del paradigma OO • Astrazione • Incapsulamento & Information Hiding • Modularità • Gerarchia • Polimorfismo Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Astrazione “Qualsiasi modello include gli aspetti più importanti o essenziali di qualcosa mentre ignora i dettagli meno importanti, immateriali. Il risultato è di rimuovere le differenze ed enfatizzare gli aspetti comuni” [Dizionario di Object Technology – Firesmith, Eykholt 1995] “Un’astrazione deve denotare le caratteristiche essenziali di un oggetto contraddistinguendolo da tutti gli altri oggetti e fornendo, in tal modo, dei confini concettuali ben precisi relativamente alla prospettiva dell’osservatore” [Grady Booch] Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Astrazione • Utilizzata per gestire la complessità di un programma concentrandosi sulle caratteristiche essenziali di un’entità che la distingue dalle altre • Applicata per decomporre sistemi software complessi in componenti più piccoli e semplici che possono essere gestiti con maggiore facilità ed efficienza • E’ dipendente dal dominio e dalla prospettiva, cioè quello che è importante in un contesto potrebbe non esserlo in un altro – per esempio, la macchina per un venditore è diversa da quella di un progettista • OO modella il sistema utilizzando l’astrazione (es. classi) Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Astrazione • L’approccio orientato agli oggetti mette a disposizione strumenti con i quali il programmatore può rappresentare elementi nello spazio dei problemi • La rappresentazione è sufficientemente generalizzata da non vincolare il programmatore a occuparsi soltanto di un determinato tipo di problemi • Gli oggetti sono elementi che si trovano nello spazio dei problemi e le loro rappresentazioni nello spazio delle soluzioni • L’OOP permette quindi di descrivere il problema nei suoi termini propri, invece che nei termini del computer sul quale verrà computata la soluzione Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Cos’è una classe • Una classe rappresenta una particolare categoria di oggetti e definisce un tipo di dato per un determinato oggetto ad essa appartenente • Una classe è caratterizzata da proprietà (attributi), comportamento (operazioni), relazioni e semantica comuni agli oggetti che la classe descrive • Seguendo il principio OO dell’astrazione: – Enfatizza caratteristiche rilevanti – Sopprime le altre caratteristiche Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Esempio di classe • Nome – Corso • Proprietà – Nome, Luogo, Durata, Crediti, Inizio, Fine • Comportamento – Aggiunta studente – Cancellazione studente – Verifica se è pieno Romina Eramo Tecnologie dei Linguaggi di Programmazione Course name location duration startDate endDate addStudent() dropStudent() isFull() DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Caratteristiche di un approccio OO Alan Kay ha riepilogato 5 caratteristiche essenziali di Smalltalk (primo linguaggio OOP di successo) 1. Ogni cosa è un oggetto 2. Un programma è un insieme di oggetti che si dicono l’un l’altro che cosa fare inviandosi messaggi 3. Ogni oggetto ha la sua memoria formata da altri oggetti 4. Ogni oggetto ha un tipo 5. Tutti gli oggetti di un determinato tipo possono ricevere gli stessi messaggi Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Cos’è un oggetto • Informalmente rappresenta – Entità fisica: trattore – Entità concettuale: processo chimico – Oppure entità software: lista, coda... • Formalmente – Manifestazione concreta di un’astrazione – Entità con un confine e un’identità ben definite che incapsula stato e comportamento – Istanza di una classe • Es.: Ferrari di Schumacher, Ferrari di Barrichello, Mio computer Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Un oggetto possiede... • Stato – Possibile condizione nel quale l’oggetto potrebbe esistere e generalmente cambia nel tempo – Implementato mediante proprietà (attributi) con valori, e collegamenti ad altri oggetti • Comportamento – Determina come un oggetto agisce e reagisce alle richieste di un altro oggetto – Rappresentato dall’insieme di messaggi a cui può rispondere (operazioni) • Identità – Rende possibile la distinzione tra due oggetti anche se hanno lo stesso stato e lo stesso valore nei suoi attributi Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Relazione tra classe e oggetto • Classe è una definizione astratta di un oggetto • Definisce la struttura e il comportamento di ogni oggetto nella classe • Serve come template per creare oggetti • Oggetti sono raggruppati in classi Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Oggetto e interfaccia Nome del tipo Interfaccia • Le richieste che si possono fare ad un oggetto sono definite dalla sua interfaccia ed è il tipo a determinare l’interfaccia • Il codice deputato a soddisfare tali richieste, insieme con i dati nascosti, costituisce l’implementazione dell’oggetto Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Incapsulamento & Information Hiding “La localizzazione fisica di caratteristiche (es. proprietà, comportamento) in una singola scatola nera che nasconde l’implementazione (e le relative decisioni di design) dietro una interfaccia pubblica” [Dizionario di Object Technology – Firesmith, Eykholt 1995] Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Incapsulamento & Information Hiding • L'information hiding è il principio teorico su cui si basa la tecnica dell'incapsulamento • Information Hiding – I dettagli implementativi di una classe - o di un costrutto di altro tipo (oggetto, modulo, ecc) - sono nascosti all'utente – Le scelte interne di design e gli effetti che eventuali cambiamenti di tali decisioni comportano sono nascoste ai possibili client (utilizzatori) • Incapsulamento – Un oggetto contiene ("incapsula") al suo interno gli attributi (dati) e i metodi (procedure) che agiscono su di essi – L’ incapsulamento è una facility del linguaggio mentre l’information hiding è un principio di design Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Incapsulamento & Information Hiding • L'incapsulamento riduce il costo da pagare per correggere gli errori in fase di sviluppo di un programma • Un'errata decisione presa nell'implementazione di un singolo modulo non deve ripercuotersi sull'intero progetto, ma deve essere corretta modificando soltanto quel modulo • Deve essere modificato solo il modulo errato e non i moduli clienti, che interagiranno con il modulo incapsulato soltanto attraverso interfacce Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Incapsulamento & Information Hiding • In generale i programmatori si distinguono in creatori di classe e programmatori client – L’obiettivo del programmatore client è mettere insieme una serie di classi per sviluppare rapidamente le applicazioni – L’obiettivo del creatore di classi è costruire una classe che mostra al programmatore client soltanto quello che è necessario, mantenendo nascosto tutto il resto • Se tutti i membri di una classe fossero disponibili a tutti, un programmatore client potrebbe fare qualsiasi cosa con quella classe e non vi sarebbe così modo di imporre delle regole Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Incapsulamento e Information Hiding • Esempio – Sistema che identifica un punto sulla superficie terrestre e offre funzionalità per determinare la distanza (distance) e la rotta (heading) tra due punti Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Esempio: prima soluzione public class Position { public double latitude; public double longitude; } public class PositionUtility { public static double distance( Position pos1, Position pos2 ) { //Calculate and return the distance between the specified positions } public static double heading( Position pos1, Position pos2 ) { //Calculate and return the heading from pos1 to pos2. } } Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Esempio: prima soluzione Position myHouse = new Position(); myHouse.latitude = 36.538611; myHouse.longitude = -121.797500; Position coffeeShop = new Position(); coffeeShop.latitude = 36.539722; coffeeShop.longitude = -121.907222; double distance = PositionUtility.distance( myHouse, coffeeShop ); double heading = PositionUtility.heading( myHouse, coffeeShop ); System.out.println("From my house at (" + myHouse.latitude + ", " + myHouse.longitude + ") to the coffee shop at (" + coffeeShop.latitude + ", " + coffeeShop.longitude + ") is a distance of " + distance + " at a heading of " + heading + Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Esempio: prima soluzione • OUTPUT From my house at (36.538611, -121.7975) to the coffee shop at (36.539722, -121.907222) is distance of 6.0873776351893385 at a heading of 270.7547022304523 degrees. Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Considerazioni • Dati (espressi mediante Position) ed operazioni (espresse mediante PositionUtility) sono separati!!! Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Esempio: seconda soluzione public class Position { public double distance( Position position ) { //Calculate and return the distance from this object to specific position. the } public double heading( Position position ) { //Calculate and return the heading from this object to specified position. the } public double latitude; public double longitude; } Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Esempio: seconda soluzione Position myHouse = new Position(); myHouse.latitude = 36.538611; myHouse.longitude = -121.797500; Position coffeeShop = new Position(); coffeeShop.latitude = 36.539722; coffeeShop.longitude = -121.907222; double distance = myHouse.distance( coffeeShop ); double heading = myHouse.heading( coffeeShop ); System.out.println("From my house at (" + myHouse.latitude + ", " + myHouse.longitude + ") to the coffee shop at (" + coffeeShop.latitude + ", " + coffeeShop.longitude + ") is a distance of " + distance + " at a heading of " + heading + " degrees."); Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Modularità “La decomposizione fisica e logica di cose (es. responsabilità e software) in gruppi piccoli e semplici (es. requisiti e classi rispettivamente) che incrementa il raggiungimento degli obiettivi dell’ingegneria del software” [Dizionario di Object Technology – Firesmith, Eykholt 1995] Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Modularità • Un modulo può essere definito come un componente di un più vasto sistema, che opera in quel sistema indipendentemente dalle operazioni di altri componenti – per gestire la complessità, si può suddividere qualcosa che è complesso in pezzi più piccoli e quindi più maneggevoli • La modularità viene utilizzato su diversi livelli di astrazione – frazionamento di un programma non solo in funzioni, ma a livello superiore in oggetti • Gli oggetti possono essere raggruppati in package, package componenti e subsystem – package, componenti e subsystem possono essere usati come blocchi per altri sistemi Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Modularità • O.O. modella la modularità con package , components e subsystem • Un package è un namespace che organizza un insieme di classi ed interfacce corrispondenti • Concettualmente un package è simile ad una directory nel file system. Possiamo quindi memorizzare file HTML in una directory, immagini in un’altra, e script in un’altra ancora • Tipicamente, sistemi complessi consistono di migliaia di classi, ha quindi senso organizzare le classi e le interfacce in package Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Ereditarietà “Qualsiasi graduatoria (ranking) o ordine di astrazione in una struttura ad albero” [Dizionario di Object Technology – Firesmith, Eykholt 1995] Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Ereditarietà • OO utilizza classi per raggruppare dati e funzionalità in concetti e l’ereditarietà per organizzare tali concetti in base ad un certo ordine – esempi: complessità, responsabilità • L’ereditarietà permette di descrive differenze o variazioni di un particolare concetto – la classe originale viene replicata e arricchita con aggiunte e modifiche Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Ereditarietà Maggiore Astrazione Mammifero Cetaceo Minore Astrazione Delfino Balena Gatto Felino Leopardo Leone Fratelli hanno stesso livello di astrazione Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Ereditarietà Classe base Classe derivata • Due tipi possono condividere caratteristiche e comportamenti, ma un tipo può contenere più caratteristiche di un altro, gestire più messaggi o trattarli in modo diverso • L’ereditarietà esprime questa similarità fra tipi utilizzando i concetti di tipi base e tipi derivati • Un tipo base contiene tutte le caratteristiche e i comportamenti che sono condivisi dai tipi che da esso derivano Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Ereditarietà superclasse classe genitore classe superiore Classe base Classe derivata sottoclasse classe figlia classe ereditata • Con l’ereditarietà la classe base viene “clonata” e vengono poi eseguite aggiunte e modifiche sulla replica • Se la classe base viene modificata, la classe derivata riflette tali cambiamenti Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Esempio di ereditarietà Shape draw() erase() mode() getColor() setColor() Circle Square Triangle • I tipi derivati (Circle Circle, Circle Square, Square Triangle) Triangle possono avere ulteriori caratteristiche e comportamenti di quello base (Shape Shape) Shape • Alcuni comportamenti possono essere diversi – per esempio, se si vuole calcolare l’area di una forma geometrica • La gerarchia dei tipi incorpora sia le somiglianze che le differenze fra le forme geometriche Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Ereditarietà • Quando si eredita da un tipo esistente, il tipo nuovo duplica l’interfaccia della classe base – tutti i messaggi inviabili a oggetti della classe base possono esserlo anche a oggetti della classe derivata • Poiché il tipo di una classe è identificato dai messaggi è possibile inviare, la classe derivata è dello stesso tipo della classe base – nell’esempio precedente: “un cerchio è una forma geometrica” Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Ereditarietà • Ci sono due modi per differenziare la nuova classe derivata dalla classe base originale 1. Si aggiungono nuovi metodi alla classe derivata (estensione estensione della classe) Shape draw() erase() mode() getColor() setColor() Circle Square Triangle flipVertical() flipHorizontal() Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Ereditarietà • Ci sono due modi per differenziare la nuova classe derivata dalla classe base originale 2. Si cambia il comportamento di un metodo della classe base mediante la sovrascrittura del metodo (overridding overridding) overridding Shape draw() erase() mode() getColor() setColor() Circle draw() erase() Romina Eramo Tecnologie dei Linguaggi di Programmazione Square draw() erase() Triangle draw() erase() DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Polimorfismo • Linguaggi procedurali (esempio Pascal) basati su idea che procedure e funzioni, e i loro operandi, hanno un unico tipo • Tali linguaggi sono detti monomorphic , cioè ogni valore e variabile può avere uno ed un solo tipo • Linguaggi O.O. sono detti polymorphic , cioè i valori e le variabili possono avere più di un tipo • Dal greco polymorphos “avere molte forme” Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Polimorfismo void doStuff(Shape s) { s.erase(); // ... s.draw(); } • Questo metodo parla con qualunque Shape, quindi è indipendente dal tipo di oggetto che sta disegnando e cancellando Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Polimorfismo Circle c = new Circle(); Triangle t = new Triangle(); Line l = new Line(); doStuff(c); doStuff(t); doStuff(l); • La chiamata a doStuff()funziona automaticamente in modo corretto, indipendentemente dal tipo esatto dell’oggetto • Questo è reso possibile dal late binding – quando si invia un messaggio ad un oggetto, il codice che viene chiamato non è determinato fino al momento dell’esecuzione Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Polimorfismo … Shape s = null; if (x <= 3) { s = new Circle(); } else { s = new Triangle(); } s.draw(); … • draw() può essere applicato indifferentemente a un cerchio, quadrato o triagolo... • In fase di compilazione, il compilatore non può sapere quale parte di codice sarà in esecuzione Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Polimorfismo … Shape s = null; if (x <= 3) { s = new Circle(); } else { s = new Triangle(); } s.draw(); … Posso invocare il metodo draw()? Compile time Quale metodo draw() deve essere invocato? Run-time Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Punti di forza dell’ OO • Singolo paradigma • Facilita il riuso di codice e di architetture • Modelli riflettono maggiormente la realtà – Descrizione più accurata dei dati e processi – Decomposizione basata su partizionamento naturale – Più facile da comprendere e mantenere • Stabilità – Piccolo cambiamento nei requisiti non significa massicci cambiamenti nel sistema durante lo sviluppo Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Java vs C++ • Sia C++ che Java sono linguaggi ibridi • Un linguaggio ibrido permette molteplici stili di programmazione – per esempio, OO/procedurale • La ragione per cui C++ è ibrido è quella di garantire la compatibilità all’indietro con il linguaggio C – C++ comprende molte delle caratteristiche indesiderabili di C, il che può rendere alcuni aspetti del C++ eccessivamente complicati • Java presuppone che si voglia fare solo programmazione orientata agli oggetti Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Java vs C++ • Java non supporta le strutture (struct (struct), struct), le unioni (union) (union) sono rese inutili dalla presenza delle classi • Java non supporta più i puntatori sono stati eliminati poiché sono la maggior causa degli errori in C/C++ • Java non supporta le funzioni essendo un linguaggio orientato agli oggetti, Java forza i programmatori a considerare le funzioni come metodi della classe Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Java vs C++ • Java non supporta il preprocessore, il typedef e i files header Java fornisce funzionalità simili ma con un maggior controllo • Java non supporta il coercion automatico si riferisce alla conversione implicita di tipi di dato che alcune volte si verifica in C e C++ • Java non permette l’overloading l’overloading degli operatori – Per esempio, è possibile definire funzioni che ridefiniscono la somma (+) e la moltiplicazione (*) fra due oggetti: operatori in overload : a+b*c chiamata di funzioni specifiche : somma(a,moltiplica somma moltiplica(b,c)) moltiplica • Java non supporta l’ereditarietà multipla è una caratteristica del C++ che permette di derivare una classe da più classi base Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche Java vs C++ • Java ha una classe String come parte del package java.lang questo differisce dall’array di caratteri terminante con null del C e C++ • Java gestisce gli argomenti della linea di comando in modo diverso dal C o C++ – In C++ void main(int argc, char *argv[]){ . . . }//end main function – In Java public static void main(String[] args){ . . . }//end main method • Java ha un sistema automatico per allocare e liberare la memoria (garbage (garbage collection) collection) non è necessario utilizzare funzioni di allocazione e deallocazione della memoria come in C e C++ Romina Eramo Tecnologie dei Linguaggi di Programmazione DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche