• Non ci sono risultati.

PROVA FINALE – Ingegneria del software

N/A
N/A
Protected

Academic year: 2021

Condividi "PROVA FINALE – Ingegneria del software"

Copied!
17
0
0

Testo completo

(1)

Jody Marca – jody.marca@polimi.it

Laboratorio N° 2

(2)

Cosa faremo oggi

Javadocs

Uso del debugger Input Output

Serializzazione degli oggetti

(3)

© 2015 – Jody Marca – Laboratorio numero 2

Javadoc

Javadoc è uno strumento che permette di documentare i un programma all’interno dei sorgenti stessi.

Anziché scrivere la documentazione di un programma in un file separato, il programmatore inserisce nel codice sorgente dei commenti particolari tags. Tali commenti vengono estratti dal programma javadoc che li converte in un formato più semplice per la consultazione

In generale un commento Javadoc è un testo HTML racchiuso tra i tag /** e */

(4)

Javadoc – tags principali

Può contenere tag HTML per aiutare la formattazione

<p>, e la presentazione come <b>, <i>, ecc

Tag Descrizione

@author Nome dello sviluppatore.

@deprecated Indica che l'elemento potrà essere eliminato da una versione successiva del software.

@link Crea un collegamento ipertestuale alla documentazione locale o a risorse esterna

@param Definisce i parametri di un metodo. Richiesto per ogni parametro.

@return Indica i valori di ritorno di un metodo.

@see Indica un'associazione a un altro metodo o classe.

@since Indica quando un metodo è stato aggiunto a una classe.

@throws Indica eccezioni lanciate da un metodo.

@version Indica il numero di versione di una classe o un metodo.

(5)

© 2015 – Jody Marca – Laboratorio numero 2

Debugger

Un debugger è un insieme di strumenti che ci permette di localizzare, isolare e quindi risolvere i bug presenti in un software. Ci permette di esaminare il programma

riga per riga in modalità di interruzione dell’esecuzione e di guardare i contenuti delle variabili

Per definire il punto di interruzione dobbiamo inserire dei Breakpoint

(6)

Debugger / 2

Proviamo a debuggare l’esercizio realizzato durante il primo laboratorio.

Individuiamo il problema Definiamo dei Breakpoint

Seguiamo il flusso di esecuzione Risolviamo il problema

(7)

© 2015 – Jody Marca – Laboratorio numero 2

Input Output

In Java la gestione dell’input-output è basata su stream Tutte gli stream sono figli di InputStream o OutputStream

Gli InputStream sono utilizzati per leggere da una sorgente di dati Gli OutputStream sono utilizzati per scrivere i dati

(8)

© 2015 – Jody Marca – Laboratorio numero 2

Leggere e scrivere un file

L’interazione con i file in Java deve seguire il seguente flusso:

Inizializzazione dello stream di lettura/scrittura Lettura/scrittura dei dati

Chiusura dello stream di lettura/scrittura

Possiamo suddividere i files in due categorie:

File di testo File binari

(9)

© 2015 – Jody Marca – Laboratorio numero 2

File di testo

Possiamo scrivere e leggere un file di testo convertendo i caratteri in bytes e vice versa

File byteFile = new File(NOME_FILE);

String stringa = "Ciao";

FileOutputStream fileOut = new FileOutputStream(byteFile);

fileOut.write(stringa.getBytes()); //Scrittura su file fileOut.close();

byte[] byteArray = new byte[1024];

FileInputStream fileIn = new FileInputStream(byteFile);

int len = fileIn.read(byteArray); //Lettura da file fileIn.close();

stringa = new String(byteArray, 0, len);

(10)

© 2015 – Jody Marca – Laboratorio numero 2

File di testo / 2

Possiamo inoltre scrivere e leggere un file di testo utilizzando direttamente delle stringhe di testo

File textFile = new File(NOME_FILE);

FileWriter outStr = new FileWriter(textFile);

PrintWriter writer = new PrintWriter(outStr);

writer.write("Ciao"); //Scrittura su file writer.close();

FileReader inStr = new FileReader(textFile);

BufferedReader reader = new BufferedReader(inStr);

String stringaFile = reader.readLine(); //Lettura da file reader.close();

inStr.close();

(11)

© 2015 – Jody Marca – Laboratorio numero 2

File binari

Su un file binario possiamo leggere e scrivere tipi primitivi.

File binFile = new File(NOME_FILE);

String stringa = "Ciao"; int intero = 5; //Tipi che andrò a scrivere e leggere FileOutputStream fileOutStr = new FileOutputStream(binFile);

DataOutputStream dataOut = new DataOutputStream(fileOutStr);

dataOut.writeUTF(stringa); //Scrittura su file dataOut.writeInt(intero); //Scrittura su file dataOut.close();

fileOutStr.close();

FileInputStream fileInStr = new FileInputStream(binFile);

DataInputStream dataIn = new DataInputStream(fileInStr);

stringa = dataIn.readUTF(); //Lettura da file intero = dataIn.readInt(); //Lettura da file dataIn.close();

fileInStr.close();

(12)

Serializzazione

La serializzazione è il processo che mi permette di

tradurre un’istanza di una classe in uno stream di byte che posso trasferire su un file o su un canale di

comunicazione

La deserializzazione è il processo inverso che mi permette di ricostruire la mia istanza della classe da uno stream di byte mantenendo lo stato che aveva prima della

serializzazione

(13)

© 2015 – Jody Marca – Laboratorio numero 2

Serializzazione /2

Per essere serializzabile una classe deve:

implementare l’interfaccia Serializable essere dichiarata come pubblica

avere tutte le variabili serializzabili

import java.io.Serializable;

public class Oggetto implements Serializable {

//Identificativo univoco della versione della classe serializzabile private static final long serialVersionUID = 1L;

private String stringa = null;

private Integer intero = null;

//Costruttore e metodi setter e getter omessi }

(14)

Stream di serializzazione

Per serializzare un oggetto si usa ObjectOutputStream

Oggetto oggetto = new Oggetto();

File objFile = new File(NOME_FILE);

FileOutputStream fileOut = new FileOutputStream(objFile);

ObjectOutputStream objOut = new ObjectOutputStream(fileOut);

objOut.writeObject(oggetto);

objOut.close();

fileOut.close();

(15)

© 2015 – Jody Marca – Laboratorio numero 2

Stream di deserializzazione

Per deserializzare un oggetto si usa ObjectInputStream

Oggetto oggetto = null;

File objFile = new File(NOME_FILE);

FileInputStream fileIn = new FileInputStream(objFile);

ObjectInputStream objIn = new ObjectInputStream(fileIn);

oggetto = (Oggetto) objIn.readObject();

objIn.close();

fileIn.close();

(16)

Serializzazione – variabili transient e static

Posso definire delle variabili che non voglio che vengano serializzate dichiarandole transient

ES: private transient Integer variabile = null;

Le variabili dichiarate static non vengono serializzate quindi se modifico una variabile dichiarata static, serializzo e deserializzo perdo la modifica

ES: private static Integer variabile = 5;

Evitate i side-effects dichiarando quando possibile le

variabili static come final in modo che il loro valore non possa essere modificato durante l’esecuzione

ES: private static final Integer variabile = 5;

(17)

© 2015 – Jody Marca – Laboratorio numero 2

Esercizio

Progettare un insieme di classi (utilizzando l’ereditarietà) che rappresentano degli articoli venduti in un

supermercato

Implementare le classi e un semplice programma con

interfaccia da console che ci permette di gestire i prodotti del supermercato calcolando le spese d’acquisto e i ricavi

Implementare dei metodi che possano leggere e scrivere su file in modo da rendere persistente lo stato del

magazzino

Riferimenti

Documenti correlati

CONTENUTI E CONOSCENZE della PARTE INTRODUTTIVA – e, parzialmente, le metodologie, le tipologie e le modalità di verifica e la valutazione), si rinvia alle

public static void main(String[] args) throws Exception { //Inizializzazione del Udp Socket – lato server. DatagramSocket serverSocket =

public class ClientImpl extends UnicastRemoteObject implements Client { public void callBack() throws RemoteException{. System.out.println(&#34;Ricevuta callback dal server&#34;);

Non deve contenere alcuna funzione di logica applicativa tranne quella di generazione degli output..

Il sistema operativo considerato in questa guida è Windows, tuttavia i passi da seguire sotto Linux sono esattamente gli stessi (il corretto funzionamento degli strumenti è

public class PersistentClock implements Serializable, Runnable { private static final long serialVersionUID = 1;. private transient

[r]

Il metodo length length () () può essere invocato su un oggetto String String per sapere la lunghezza della sequenza di caratteri che l’oggetto rappresenta. String str = new