Lab metodi programmazione Linguaggio Java Progetto Testi C.S. Horstmann Computing Concepts with Java Essentials 3rd Edition, Wiley Ed. italiana: Concetti di informatica e fondamenti di Java 2 Seconda edizione, Apogeo java.sun.com Caratteristiche di Java Imperativo, object oriented Indipendente dalla piattaforma (“write once, run everywhere”) Eventi, concorrenza, GUI, … Internet/applet Librerie Paradigmi di programmazione Funzionale Imperativo Paradigma funzionale Programma = collezione di funzioni Funzione: dati -> risultato Es.: Scheme Trasparenza referenziale Paradigma imperativo Programma = sequenza di operazioni che trasformano lo stato Assegnamento, sequenza, cicli Stato = contenuto della variabili Programma: stato iniziale -> stato finale Set! e begin Funzioni che dipendono dalla “storia” dell’esecuzione Es.: rubrica telefonica, generatore numeri random Insieme di variabili che contengono lo stato Trasparenza referenziale In un’espressione E posso rimpiazzare una sottoespressione con un’altra che ha lo stesso valore senza cambiare il valore di E Es:. 3 + quadrato(2) = 3 + 4 E’ più facile ragionare sulle proprietà dei linguaggi funzionali puri perchè possiamo comprendere le espressioni indipendentemente dal contesto in cui appaiono Trasparenza referenziale f(x) = { cont := cont + 1; return (x*x); } Non è possibile sostituire un’espressione con il suo valore Non è possibile scambiare gli operandi Due valutazioni successive possono produrre risultati diversi Object orientation programmazione strutturata (‘70-’80) ! ! raffinamenti: procedure rimpiazzate con versioni più dettagliate strutture dati semplici e invariate durante raffinamenti successivi Problemi + complessi => sia procedure che strutture dati devono essere raffinati Programmazione object oriented Programmazione a oggetti Ogni entità del sistema da descrivere è modellata mediante un oggetto Oggetto ! ! Rappresentazione di un elemento concreto del mondo reale o di un concetto Stato + comportamento Un programma è costituito da un insieme di oggetti che interagiscono Programmazione a oggetti Il comportamento di un oggetto è costituito da un insieme di funzionalità Descrizione delle funzionalità dell’oggetto: ! ! Imperativa: c++, Java Funzionale: Ocaml Oggetto Stato ! ! ! Comportamento ! ! ! Oggetto Campi Attributi/caratteristiche Dati Metodi Funzionalità: azione o trasformazione che un oggetto esegue o a cui è sottoposto Procedure/funzioni Esempio Rettangolo Variabili (stato) Metodi (comportamenti) Oggetto = collezione di dati + metodi che operano sui dati ! ! Campi: base, altezza, posizione Metodi: muovi, disegna, ottieniAltezza, ottieniBase, area Interazione tra oggetti Gli oggetti interagiscono mediante l’invocazione di metodi Invocazione di un metodo dell’oggetto: ! ! ! Osservare lo stato dell’oggetto Modificare lo stato dell’oggetto Creare un nuovo oggetto (costruttore) Messaggi Gli oggetti interagiscono e comunicano tra loro mediante I messaggi. Esempio Punti del piano Stato: coordinate cartesiane x,y Metodi: ! ! ! getX, getY setX, setY moveO, moveV Esempio Punto origine: x=0, y=0 origine.getX -> 0 origine.getY -> 0 origine.setX(10) origine.moveO(-2) origine.getX -> 8 origine.getY -> 0 Scheme: define-struct Insieme di campi (stato) Costruttore, selettori, predicati Accesso ai campi mediante selettori OO: ! ! ! Linguaggi class-based: ! l'implementazione dell'oggetto e' specificata dalla classe un oggetto e' creato istanziando una classe Linguaggi delegation-based: ! Stesse finalità dell’object orientation OO come estensione del concetto di ADT Encapsulation (dopo) Campi Costruttori Altri metodi Class-based vs delegationbased ! Abstract Data Types gli oggetti sono definiti direttamente a partire da altri oggettiaggiungendo o rimpiazzando metodi Classe Una classe è un prototipo che definisce la struttura di un insieme di oggetti Definizione di classe ~ define-struct Oggetto = istanza di una classe Costruzione di un oggetto ~ make-XYZ Classe La classe specifica il comportamento e la struttura dello stato Un oggetto che è istanza di una classe ! ! ha valori propri contenuti nei campi condivide con le altre istanze della classe I metodi e I nomi dei campi Esempio Classe Point: ! ! Istanze della classe Point: ! ! ! Encapsulation L’utente del servizio è tenuto a conoscere solo le informazioni necessarie per usufruire del servizio Lo stato dell’oggetto è nascosto all’utilizzatore E’ possibile accedere all’oggetto solo attraverso I metodi Variabili: x, y Metodi: getX, getY:, setX, setY, moveO, moveV origine (x=0,y=0) sonoSuAsseX (x=15,y=0) altroPunto (x=-2, y=35) Encapsulation - vantaggi Modularità ! Classi diverse sviluppate in modo indipendente Information hiding ! lo stato e la definizione dei metodi sono nascosti all’utilizzatore e possono essere modificati Protezione ! Impedire accesso incontrollato allo stato (stato inconsistente) Esempio Punti del piano Posso modificare l’implementazione utilizzando coordinate polari anziché coordinate cartesiane Nuovo stato: rho, theta Modifico l’implementazione dei metodi L’interfaccia dei metodi resta invariata Ereditarietà La classe ColorPoint è una sottoclasse (subclass) di Point Point è una sopraclasse (superclass) di ColorPoint ColorPoint eredita lo stato e I metodi di Point Ereditarietà Definizione di nuove classi a partire da classi esistenti, specificando solamente la parte aggiuntiva Esempio: classe ColorPoint ! Stato: " stato di Point + " colore ! Metodi: " metodi di Point + " getColor, setColor Ereditarietà Abilità di utilizzare la definizione di oggetti più semplici per costruire oggetti più complessi Vantaggi: riutilizzo di codice Gerarchia di classi Ridefinizione di metodi Compilatore Compilatori vs interpreti Java Virtual Machine Interprete Traduce ed esegue un’istruzione alla volta Read-Eval-Print Loop Es.: Scheme Traduzione da linguaggio ad alto livello a linguaggio macchina Una volta compilato, l’eseguibile è utilizzabile più volte E’ necessario un compilatore per ogni architettura Java Compilato e interpetato Java Virtual Machine Java Bytecode Un solo compilatore da Java a Bytecode Un interprete di bytecode per ogni architettura Java Virtual Machine Perché il bytecode? È più semplice scrivere un interprete di bytecode che un compilatore da Java a linguaggio macchina Sicurezza per applet: l’interprete di bytecode fornisce protezione da codice “pericoloso” Java Virtual Machine