• Non ci sono risultati.

TestIntegrazione

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

o

set

. 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 Machine

classe

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

= new

ArrayList<>();

: una variabile

lista

di tipo astratto (dato che

List<Integer>

è un’interfaccia e non sarebbe quindi possibile costruire un oggetto con new

List<Integer>()

) che si riferisce a un oggetto concreto (di tipo

ArrayList<Integer>

) ottenuto istanziando la classe concreta (cioè priva di metodi abstract)

ArrayList<Integer>

. 75, 76, 78, 79, 100, 101, vedi tipo

istanza

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

jar

Si 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 a

obj

il messaggio

msg

, il che provocherà l’esecuzione del metodo

msg

della classe cui appartiene

obj

, 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

e

Boolean

). 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 ask

OOP

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

Documenti correlati