1.2 Hello World!
8.2.5 TestIntegrazione
@Override
public void addListener(AbstractController controller) { setOnAction(controller); }
@Override
public double getTempValue() {
return scale.valueToCelsius(Double.parseDouble(getText()));
}
@Override
public void update(Subject<Double> subject, Double state) { double value = subject.getState();
setText(String.format(Locale.US, "%.2f", scale.valueFromCelsius(value)));
} }
8.2.4 Controller
Il controller in questo caso molto semplice ha il solo scopo di fare da “passacarte” tra view e model senza particolari logiche e quindi risulta molto semplice.
public class TemperatureController extends AbstractController { public TemperatureController(Model model, TemperatureView view) {
this.model = model;
this.view = view;
view.addListener(this);
}
@Override
public void updateModel() {
model.setTemp(view.getTempValue());
}
@Override
public void handle(ActionEvent actionEvent) { updateModel();
} }
8.2.5 TestIntegrazione
Per poter testare il sistema nel suo complesso completiamo il codice del file IntegrationTestExample.java aggiungendo due attributi (le due TextView concrete) e inizializzando correttamente modello,
viste e controller all’interno del metodo
start()
. private TemperatureTextView celsiusField;private TemperatureTextView fahrenheitField;
8.2 Soluzioni
@Override
public void start(Stage stage) throws Exception { stage.setTitle("Lab08");
GridPane gridPane = new GridPane();
celsiusField = new TemperatureTextView(CelsiusScale.INSTANCE);
gridPane.add(celsiusField, 1, 0);
fahrenheitField = new TemperatureTextView(FahrenheitScale.INSTANCE);
gridPane.add(fahrenheitField, 1, 1);
TemperatureModel model = new TemperatureModel();
model.addObserver(celsiusField);
model.addObserver(fahrenheitField);
new TemperatureController(model, celsiusField);
new TemperatureController(model, fahrenheitField);
Scene scene = new Scene(gridPane);
stage.setScene(scene);
stage.show();
}
Glossario
accessor
Un metodo che permette di accedere a un attributo dello stato di una classe in maniera astratta e controllata. Non è necessario che esista una specifica variabile che rappresenta lo stato: esso può essere calcolato sulla base di altre informazioni private. Grazie agli accessor i clienti della classe possono dipendere unicamente da essi; la presenza di accessor però non garantisce di per sé l’incapsulamento,in particolare l’incapsulamento è pregiudi-cato se l’accessor ritorna un riferimento all’oggetto “interno” (meglio restituire una copia).
Gli accessor in lettura vengono detti getter, quelli in scrittura setter: quando lo stato dell’oggetto è ben incapsulato ed esiste solo un getter pubblico lo stato diventa accessibile ai clienti della classe solo in lettura. Convenzionalmente in Java ai messaggi per attivare metodi accessor si danno nomi col prefisso
get
oset
. 60, 61, 100, 102, vedi getter &setter bytecode
Il compilatore Java (
javac
) non produce codice macchina, ma istruzioni per la Java Vir-tual Machine,chiamate bytecode. In questo modo un programma Java non deve essere ricompilato quando viene eseguito su una macchina dotata di un processore diverso ri-spetto a quello su cui il programma è stato originariamente compilato, inoltre anche i servizi del sistema operativo sono mediati dalla Java Virtual Machine (“Write once, run everywhere” era lo slogan con cui veniva pubblicizzato Java: vale per tutti i linguaggi interpretati, in realtà.). Data la diffusione delle Java Virtual Machine,oggi molti linguaggi vengono tradotti in bytecode[, ]in alcuni casi prevedendo anche la possibilità di fare intera-gire componenti provenienti da linguaggi di alto livello diversi. 14,101, vedi Java Virtual Machineclasse
Un oggetto utilizzato per istanziare oggetti di un determinato tipo; tali oggetti si dicono
‘appartenenti’ alla classe dalla quale sono stati istanziati. In Java la definizione di una classe (class o enum) comprende la definizione dei metodi applicabili agli oggetti ap-partenenti a essa. 13–15, 19, 20, 24, 26, 27, 29–32, 34, 37, 75, 76, 78, 79, 99–101, vedi CRC
collaborazione
I componenti tramite cui un dato componente di un sistema risolve la porzione di problema di cui è responsabile. 26,30, vedi CRC &responsabilità
costruttore
La procedura con cui si crea un oggetto; l’operazione prende il nome di ‘istanziazione’. In Java il costruttore deve obbligatoriamente chiamarsi come la classe nella quale è definito e deve essere invocato con la parola chiave new. 15, 27, 29, 80, 99, 101, vedi oggetto &
istanziare
CRC
Class, Responsibility, and Collaboration. 30 dispatch
La scelta del metodo da eseguire in seguito all’invio di un messaggio a un oggetto (chia-mata). La scelta avviene è influenzata dalla gerarchia delle classi (overriding) e dalla presenza di metodi con lo stesso nome, ma diversi parametri (overloading). 101, vedi metodo,messaggio&oggetto
getter
Un accessor in lettura. 99, vedi accessor GUI
Graphical User Interface. 31, 93 IDE
Un Integrated Development Environment è un’applicazione che integra le funzionalità di editing, compilazione e debugging in maniera dipendente dal contesto di sviluppo. Mentre in un editor si agisce su un file, con un IDE si agisce su un progetto (generalmente composti da molti file). 25,38,40,77
incapsulamento
È l’applicazione nella scrittura dei programmi del principio fondamentale della information hiding per la gestione della complessità e dell’evoluzione del software secondo cui alcuni dettagli di un componente vengono nascosti è non è perciò necessario conoscerli per usare il componente stesso. 34,35,99,101, vedi information hiding
information hiding
Secondo questo principio le parti suscettibili di cambiamento devono essere nascoste agli utilizzatori di un componente. 100
interfaccia
L’elenco dei metodi disponibili ai “clienti” di un oggetto.In Java è possibile definire espli-citamente una interface come elenco astratto in cui ciascun metodo appare soltanto con la propria signature senza implementazione (o, da Java 8, con una implementazione default). Un’interfaccia definisce un tipo.Unaclass (o unaenum) possono implemen-tare (tramite il costruttoimplements) una o più interfacce,il che le rende compatibili con l’assegnamento a variabili dichiarate del tipo astratto dell’interfaccia.Per esempio, sono molto comuni definizioni come
List<Integer> lista
= newArrayList<>();
: una variabilelista
di tipo astratto (dato cheList<Integer>
è un’interfaccia e non sarebbe quindi possibile costruire un oggetto con newList<Integer>()
) che si riferisce a un oggetto concreto (di tipoArrayList<Integer>
) ottenuto istanziando la classe concreta (cioè priva di metodi abstract)ArrayList<Integer>
. 75, 76, 78, 79, 100, 101, vedi tipoistanza
Calco dall’inglese instance, ‘esempio’. 37,75,79,100,101, vedi istanziare istanziare
Significa creare un’istanza (cioè un esemplare) di un oggetto di una determinata classe.
14, 15,26–28,99,100
Glossario
jarSi tratta di un modo per distribuire tutti i file di un’applicazione o una libreria Java in un unico file compresso. 41
Java Virtual Machine
L’interprete dei programmi Java (
javac
) che esegue il bytecode ottenuto con la com-pilazione. Si tratta di macchina basata su stack e con supporto diretto alla program-mazione ad oggetti e concorrente. La Java Virtual Machine versione 11 è specificata qui:https://docs.oracle.com/javase/specs/jvms/se11/html/index.html. 15,16,26,42, 99,101, vedi bytecode
messaggio
Il nome di una delle operazioni possibili su un oggetto. In Java l’invio di un messaggio avviene con la cosiddetta dot notation: se
obj
è un riferimento a un oggetto,obj.msg
invia aobj
il messaggiomsg
, il che provocherà l’esecuzione del metodomsg
della classe cui appartieneobj
, secondo le regole di dispatching di Java. 13,31,99–101, vedi metodo&oggetto metodo
La procedura con cui un oggetto risponde alla ricezione di un messaggio. 13, 15,16, 27, 29,31,32,34–37,75,76,78,99–102, vedi messaggio&oggetto
oggetto
In un sistema orientato agli oggetti è l’unità di incapsulamento fondamentale di un processo in esecuzione che consiste così di oggetti che si inviano messaggi fra loro. La ricezione di un messaggio generalmente scatena l’esecuzione di una procedura che è il metodo con cui un oggetto risponde.
In Java gli oggetti di un sistema in esecuzione sono sempre esemplari (“istanze”) di una classe che ne definisce la struttura interna e i metodi (l’unica eccezione sono i tipi base come int eboolean: concettualmente sono sempre insiemi di valori, ma sono implementati in maniera diversa dalle classi;quando serve una classe vera e propria si deve ricorrere a
Int
⌋eger
eBoolean
). Un oggetto viene creato da una procedura speciale detta costruttore.In Java, una volta creato, un oggetto non può essere distrutto esplicitamente. Un oggetto, però, è accessibile solo tramite un riferimento, cioè un nome con cui riferircisi. Un determi-nato nome può essere assegdetermi-nato a oggetti diversi (per questo motivo i riferimenti vengono chiamati ‘variabili’) o uscire dall’ambito di visibilità del flusso di esecuzione, perciò può succedere che non ci sia più nessun nome per riferirsi a un oggetto che pure in memoria esiste ancora: periodicamente il garbage collector della Java Virtual Machine elimina gli oggetti ormai irraggiungibili. Si noti che gli oggetti anonimi, creati in una chiamata di un metodo senza assegnare esplicitamente una variabile, sono il valore attuale di un parametro formale, che è quindi il riferimento che li rende accessibili. 13–16, 19, 20, 22, 23, 26–32, 34,37,75,76,78–80,85,86,99–102, vedi incapsulamento&tell, don’t askOOP
Programmazione orientata agli oggetti. 13–15 overloading
In Java è permesso avere, nella stessa classe o interfaccia,due metodi con lo stesso nome (che risulta dunque “sovraccarico”, overloaded), purché le loro signature differiscano per numero o tipo dei parametri (invece non è sufficiente che cambi il tipo del valore di ritorno).
vedi signature
requisito
La definizione delle caratteristiche del problema che il committente di un sistema deve risolvere. 102, vedi specifica
responsabilità
La porzione di problema che risolve un dato componente di un sistema. 26, 30, 31, 34, vedi CRC&collaborazione
SDK
Software Development Kit. 26,40 setter
Un accessor in scrittura. 99, vedi accessor signature
La dichiarazione di un metodo con l’indicazione, oltre al nome, dei parametri e del tipo del valore di ritorno (che può anche essere void, cioè “vuoto”, mancante). 100,101, vedi interfaccia &overloading
specifica
La definizione delle caratteristiche che deve avere la soluzione di un problema. Generalmen-te si distingue fra specifica,che definisce le caratGeneralmen-teristiche della soluzione, e requisito,che invece definisce le caratteristiche del problema che il committente spera di risolvere grazie al sistema specificato. 75,102, vedi requisito
stato
In un dato istante dell’esecuzione di un processo, l’insieme dei valori di tutte le variabili che compongono un oggetto. A volte è opportuno considerare stati astratti, che corrispondono a più di uno stato o allo stato di più oggetti. 13–15,26,32,37,99, vedi oggetto
tipo
L’insieme dei valori possibili di una variabile; il tipo definisce inoltre quali operazioni sono ammesse su tali valori. 15,25,30,75,76,78–80,99–101