Lab metodi programmazione Testi Caratteristiche di Java Paradigmi

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