Tecnologia e Applicazioni Internet 2010/11

Documenti analoghi
Operazioni di input/output. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi 132 Sesto San Giovanni

Corso sul linguaggio Java

Cifratura simmetrica

Flussi, lettori e scrittori

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

20 - Input/Output su File

(VHUFLWD]LRQLGLEDVHVXOOH6RFNHWLQ-DYD 6RFNHWGLWLSRVWUHDP

Chat. Si ha un server in ascolto sulla porta Quando un client richiede la connessione, il server risponde con: Connessione accettata.

Un flusso (stream) è una astrazione che produce e/o consuma informazioni.

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Agent and Object Technology Lab Dipartimento di Ingegneria dell Informazione Università degli Studi di Parma. Ingegneria del software A

Il linguaggio Java I file sequenziali

Java I/O e serializzazione

Corso di Reti di Calcolatori L-A

Tecnologia e Applicazioni Internet 2011/12

Operazioni di scrittura e lettura con periferici in linguaggio Java

ProgettAzione tecnologie in movimento - V anno Unità 4 - Realizzare applicazioni per la comunicazione in rete

Esercitazione n 4. Capacità di analisi e di estensione di progetti esistenti Il concetto di filtro Linguaggio Java:

Eclipse. Avviare un progetto e compilare un semplice programma

Laboratorio di Informatica Lezione 4

La prima applicazione Java. Creazione di oggetti - 1. La prima applicazione Java: schema di esecuzione. Gianpaolo Cugola - Sistemi Informativi in Rete

LETTURA DI DATI DA INPUT

Assembler di Spim. Assembler di SPIM. Struttura di un programma assembler. Direttive

Realizzazione di una classe con un associazione

Università degli Studi di Modena e Reggio Emilia. Facoltà di Ingegneria Reggio Emilia CORSO DI TECNOLOGIE E APPLICAZIONI WEB. Http con java, URL

Tecnologie Web L-A. Java e HTTP. Dario Bottazzi Tel , dario.bottazzi@unibo.it, SkypeID: dariobottazzi. Java e TCP/IP in a Nutshell

Architettura Client-Server

Gestione delle Eccezioni

Compute engine generici in RMI

Esercitazioni Ingegneria del So2ware 3 - Programmazione Java Excep<ons, I/O

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 21 Dicembre 2006

Introduzione. Java. Streams. Streams

(VHUFLWD]LRQLGLEDVHVXOOH6RFNHWLQ-DYD 6RFNHWGLWLSRGDWDJUDP

Prova d Esame Compito B

Concetti Base Eccezioni Eccezioni e Metodi Gerarchia di Eccezioni. Java: Eccezioni. Damiano Macedonio

SOMMARIO Coda (queue): QUEUE. QUEUE : specifica QUEUE

Input e Output in Java

Luca Mari, Sistemi informativi applicati (reti di calcolatori) appunti delle lezioni. Architetture client/server: applicazioni server

PHPUnit Ricettario Del Programmatore Scontroso

Introduzione alla programmazione Java. Dott. Ing. M. Banci, PhD

Esercizi della lezione 5 di Java

Esercitazione 6. Tutor: Ing. Diego Rughetti. Anno Accademico 2007/2008

Input/Output in Java

Telematica II 17. Esercitazione/Laboratorio 6

Prova d Esame Compito A

Gestione delle eccezioni Individuazione e ripristino parseint Individuazione e ripristino Individuazione e ripristino parseint

Corso di Laurea in Informatica e Comunicazione Digitale. a.a Interazione Uomo-Macchina. Introduzione a Java.

Utilizzo delle classi

LABORATORIO DI INFORMATICA parte 6 -

1. Soluzione esercizio XYZ SpA

La prima applicazione Java con NetBeans IDE. Dott. Ing. M. Banci, PhD

10 - Programmare con gli Array

Nascita di Java. Che cos e Java? Caratteristiche di Java. Java: linguaggio a oggetti

Le command line di Java

7 Esercitazione (svolta): Callback. Polling. Java RMI: callback. Server. Server. Client. Client. due possibilità:

Lettura e scrittura - Stream

Java I/O e serializzazione

Laboratorio Reti di Calcolatori Laurea Triennale in Comunicazione Digitale. Anno Accademico 2012/2013

Lezione 5: Socket SSL/ TLS. Corso di Programmazione in Rete Laurea Magistrale in Ing. Informatica Università degli Studi di Salerno

Main System Monitor Keyboard

INPUT OUTPUT Programmazione in rete e laboratorio. Le operazioni di I/O avvengono attraverso stream (sequenze di byte)

Reflection in Java. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

Sincronizzazione con Java

RMI. Java RMI RMI. G. Prencipe

Gestione di errori e situazioni eccezionali. Gestione delle eccezioni. Gestione tradizionale di errori e situazioni eccezionali (2)

MagiCum S.r.l. Progetto Inno-School

LETTURA DI DATI DA INPUT. Gli stream di byte consentono già di leggere dati (numeri di vario tipo), tramite la classe DataInputStream

Corso di Reti di Calcolatori. java.net.url

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

SAPIENZA Università di Roma Facoltà di Ingegneria dell Informazione, Informatica e Statistica

Gestione delle eccezioni in Java

Il sistema operativo UNIX/Linux. Gli script di shell

Reti di Calcolatori:

Laboratorio di Sistemi Distribuiti Leonardo Mariani

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

Introduzione al Linguaggio C

3. La sintassi di Java

Programmare con le Socket TCP

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Unità B3 Strutture di controllo

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Esempi di esercizi d esame

Tecnologia e Applicazioni Internet 2008/9

Algoritmi di Ricerca. Esempi di programmi Java

UML Diagrammi delle classi. UML Diagramma classi 1

GESTIONE DEI PROCESSI

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

QUEUE : considerazioni. QUEUE : considerazioni. QUEUE : esempio. QUEUE : esempio

Tale attività non è descritta in questa dispensa

Capitolo 13: Gestione delle eccezioni. Capitolo 13. Gestione delle eccezioni Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2

Programmazione Orientata agli Oggetti in Linguaggio Java

Corso sul linguaggio Java

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

JAVA INTRODUZIONE C++ JDK e JRE API IDE (BLUEJ) JAVA Introduzione. Versioni e IDE DIAPOSITIVA 2 ALESSANDRO URSOMANDO

Come trattare il risultato di un comando SQL (relazioni) che

Programmazione a Oggetti Lezione 10. Ereditarieta

SOMMARIO INTRODUZIONE...XV CAPITOLO 1: PRESENTAZIONE...1 CAPITOLO 2: FONDAMENTI DI JAVA...39

ELEMENTI DI PROGETTAZIONE SOFTWARE

Parte II: Reti di calcolatori Lezione 12

Transcript:

Tecnologia e Applicazioni Internet 2010/11 Lezione 1 - Gestione delle dipendenze Matteo Vaccari http://matteo.vaccari.name/ vaccari@pobox.com 1

Modalità di esame Preparazione di un elaborato, da solo o in coppia Discussione orale dell elaborato 2

Che cosa rende il codice difficile da testare? 3

Mescolare new e logica public class Option { @Test public void shouldrecognizeexpiredoption() { Date expiration = dateat(1995, MAY, 28); Option option = new Option(expiration); private final Date expiration; public Option(Date expiration) { this.expiration = expiration; asserttrue(option.isexpired()); public boolean isexpired() { Date now = new Date(); return expiration.before(now); Roberto Albertini, Sourcesense 4

public class Option { @Test public void shouldrecognizeexpiredoption() { Date expiration = dateat(2008, MAY, 28); Option option = new Option(expiration); private final Date expiration; public Option(Date expiration) { this.expiration = expiration; asserttrue(option.isexpired()); public boolean isexpired() { Date now = new Date(); return expiration.before(now); @Test public void shouldrecognizenonexpiredoption() { Date expiration = dateat(2020, MAY, 28); Per quanto tempo funzionerà? Option option = new Option(expiration); assertfalse(option.isexpired()); Come posso testare i casi limite? Roberto Albertini, Sourcesense 5

new Date() non è programmabile public boolean isexpired() { Date now = new Date(); return expiration.before(now); lo sostituisco con un collaboratore public boolean isexpired() { Date now = clock.now(); return expiration.before(now); Roberto Albertini, Sourcesense 6

private final Date expiration; public Option(Date expiration) { this.expiration = expiration; devo esplicitare la dipendenza rendere iniettabile il collaboratore private final Date expiration; private final Clock clock; public Option(Date expiration, Clock clock) { this.expiration = expiration; this.clock = clock; Roberto Albertini, Sourcesense 7

Il codice di produzione public class Option { public interface Clock { Date now(); private final Date expiration; private final Clock clock; public Option(Date expiration, Clock clock) { this.expiration = expiration; this.clock = clock; public Option(Date expiration) { this(expiration, new RealClock()); public class RealClock implements Clock { public Date now() { return new Date(); Roberto Albertini, Sourcesense 8

Il codice di test public class OptionTest { @Test public void shouldrecognizeexpiredtask() { Clock clockat2009028 = new ProgrammableClock( dateat(2009, MAY, 28)); Date expiration = dateat(2009, MAY, 27); Option option = new Option(expiration, clockat20090528); public interface Clock { Date now(); public class ProgrammableClock implements Clock { private Date now; public ProgrammableClock(Date date) { this.now = date; asserttrue(option.isexpired()); public Date now() { return now; Roberto Albertini, Sourcesense 9

nit Testing a Class Stimulus Test Driver Class Under Test Asserts Miško Hevery 10

nit Testing a Class Test Driver Class Under Test Other Class Other Class Object Lifetime and Calling Object Instantiated Object Passed In Global Object Other Class Miško Hevery 11

nit Testing a Class File System Other Class Seam CPU Intensive Test Driver Class Under Test Other Class Other Class Other Class Destructive operation Object Lifetime and Calling Object Instantiated Other Class Other Class Other Servers Object Passed In Global Object Miško Hevery 12

nit Testing a Class Test Driver Class Under Test Seam Other Friendly Class Other Friendly Class Object Lifetime and Calling Object Instantiated Object Passed In Global Object Other Friendly Class Miško Hevery 13

nit Testing a Class Friendly Test Driver Class Under Test Seam Friendly Friendly Object Lifetime and Calling Object Instantiated Object Passed In Global Object Miško Hevery 14

wo piles Pile of Objects Business logic This is why you're writing code Pile of New Keywords Provider<T> objects Factories Builders This is how you get the code you write to work together new new new new new new new new new new new Miško Hevery 15

wo piles Pile of Objects Responsibility is business logic, domain abstractions Pile of New Keywords Responsibility is to build object graphs new new new new new new graph new Miško Hevery 16

La struttura di un main public static void main(string[] args) throws Exception { // Creation Phase Server server = new ServerFactory(args).createServer(); // Run Phase server.start(); 17

Stato Singleton Metodi statici JNDI Service locators 18

Stato Rende le esecuzioni inconsistenti eseguo due volte e ottengo risultati diversi Nasconde le collaborazioni non so più quali da quali cose dipende la classe sotto test Diventa rilevante l ordine dei test o molto complicate le setup e teardown dei test 19

Come si cura Non si usano mai variabili globali non sempre è possibile ad esempio il db è una variabile globale 20

Come si cura si introduce una dipendenza iniettabile il nuovo oggetto sarà responsabile dell accesso allo stato globale nei test si inietta una istanza di test 21

Cavalcare i collaboratori 22

Legge di Demetra dog.getbody().gettail().wag(); Tell, Don't Ask! dog.expresshappiness(); 23

Legge di Demetra talk only to your friends Ogni metodo M di un oggetto O può invocare solo i metodi dei seguenti tipi di oggetti: 1. dei propri campi 2. dei parametri passati al metodo 3. di ogni oggetto che crea 24

Violazione della Legge di Demetra Rende difficile trovare un errore evidenziato da una barra rossa molti oggetti sono coinvolti nell esecuzione Complica il setup dei test devo preparare tutte le combinazioni di stati degli oggetti coinvolti 25

Violazione della Legge di Demetra Rende la classe accoppiata a tutte le interfacce attraversate dalla catena di punti posso arrivare ad una classe non testabile 26

Come si cura seguendo il principio "Tell, Don't Ask" i getter vengono sostituiti con con metodi che invocano delle azioni piuttosto che chiedere altri oggetti 27

Introduction to Java I/O 28

Streams byte streams character streams InputStream, OutputStream Reader, Writer 29

java.io.inputstream public abstract class InputStream { /** * @return the next byte of data, or <code>-1</code> if the end of the * stream is reached. */ public abstract int read() throws IOException; /** * Closes this input stream and releases any system resources associated * with the stream. */ public void close() throws IOException { //... 30

java.io.reader public abstract class Reader { /** * Read characters into a portion of an array. This method will block * until some input is available, an I/O error occurs, or the end of the * stream is reached. * * @param cbuf Destination buffer * @param off Offset at which to start storing characters * @param len Maximum number of characters to read * * @return The number of characters read, or -1 if the end of the * stream has been reached * * @exception IOException If an I/O error occurs */ abstract public int read(char cbuf[], int off, int len) throws IOException; 31

java.io.reader public abstract class Reader { /** * Read a single character. This method will block until a character is * available, an I/O error occurs, or the end of the stream is reached. * * @return The character read, as an integer in the range 0 to 65535 * (<tt>0x00-0xffff</tt>), or -1 if the end of the stream has * been reached */ public int read() throws IOException { char cb[] = new char[1]; if (read(cb, 0, 1) == -1) return -1; else return cb[0]; /** * Close the stream. Once a stream has been closed, further read(), * ready(), mark(), or reset() invocations will throw an IOException. * Closing a previously-closed stream, however, has no effect. * * @exception IOException If an I/O error occurs */ abstract public void close() throws IOException; 32

java.io.writer public abstract class Writer { /** * Write a single character. */ public void write(int c) throws IOException { writebuffer[0] = (char) c; write(writebuffer, 0, 1); /** * Write an array of characters. */ public void write(char cbuf[]) throws IOException { write(cbuf, 0, cbuf.length); /** * Write a portion of an array of characters. */ abstract public void write(char cbuf[], int off, int len) throws IOException; /** * Write a string. */ public void write(string str) throws IOException { write(str, 0, str.length()); 33

java.io.writer /** * Flush the stream. */ abstract public void flush() throws IOException; /** * Close the stream, flushing it first. Once a stream has been closed, * further write() or flush() invocations will cause an IOException to be * thrown. Closing a previously-closed stream, however, has no effect. */ abstract public void close() throws IOException; 34

Example: copying a character stream import java.io.filereader; import java.io.filewriter; import java.io.ioexception; public class CopyCharacters { public static void main(string[] args) throws IOException { Reader inputstream = null; Writer outputstream = null; try { inputstream = new FileReader("xanadu.txt"); outputstream = new FileWriter("characteroutput.txt"); int c; while ((c = inputstream.read())!= -1) { outputstream.write(c); finally { if (inputstream!= null) { inputstream.close(); if (outputstream!= null) { outputstream.close(); Hard to test! Hard to test! 35

Line I/O public class CopyLines { public static void main(string[] args) throws IOException { BufferedReader inputstream = null; PrintWriter outputstream = null; try { inputstream = new BufferedReader(new FileReader("xanadu.txt")); outputstream = new PrintWriter(new FileWriter("characteroutput.txt")); String l; while ((l = inputstream.readline())!= null) { outputstream.println(l); finally { if (inputstream!= null) { inputstream.close(); if (outputstream!= null) { outputstream.close(); 36

Bridging byte streams to char streams // reading chars from an input stream of bytes public void frombytestochars(inputstream bytestream) throws UnsupportedEncodingException { InputStreamReader charstream = new InputStreamReader(byteStream, "UTF-8"); // read from charstream // writing chars to an output stream of bytes public void fromcharstobytes(outputstream bytestream) throws UnsupportedEncodingException { OutputStreamWriter charstream = new OutputStreamWriter(byteStream, "UTF-8"); // write to charstream 37

Standard charsets Every implementation of the Java platform is required to support the following standard charsets. US-ASCII Seven-bit ASCII, a.k.a. ISO646-US, a.k.a. the Basic Latin block of the Unicode character set ISO-8859-1 ISO Latin Alphabet No. 1, a.k.a. ISO-LATIN-1 UTF-8 Eight-bit UCS Transformation Format UTF-16BE Sixteen-bit UCS Transformation Format, big-endian byte order UTF-16LE Sixteen-bit UCS Transformation Format, little-endian byte order UTF-16 Sixteen-bit UCS Transformation Format, byte order identifiableied by an optional byte-order mark http://download.oracle.com/javase/6/docs/api/java/nio/charset/charset.html 38

Esercizio: clone di paste(1) 39

Problema: incollare file riga per riga prova uno due tre alfa beta + gamma delta provaalfa unobeta duegamma tredelta 40

Soluzione veloce import java.io.*; public class Main { public static void main(string... args) throws IOException { BufferedReader first = new BufferedReader(new FileReader(args[0])); BufferedReader second = new BufferedReader(new FileReader(args[1])); BufferedWriter out = new BufferedWriter(new FileWriter(args[2])); String stringfromfirst, stringfromsecond; while ((stringfromfirst = first.readline())!= null && (stringfromsecond = second.readline())!= null) { out.append(stringfromfirst); out.append(stringfromsecond); out.newline(); first.close(); second.close(); out.close(); Quando abbiamo affrontato il problema anni fa, lo abbiamo risolto con una soluzione veloce 41

La soluzione veloce può avere risolto il problema originariamente. Ma quando dobbiamo, tempo dopo, risolvere un problema simile ma più complesso, adattare il vecchio software può risultare difficile. Nuovi requisiti! uno due tre alfa xxx + beta + yyy gamma zzz uno, alfa, xxx due, beta, yyy tre, gamma, zzz Numero arbitrario di file in ingresso Output (opzionalmente) separato da virgole Righe (opzionalmente) numerate 42

Modello UML della versione veloce main() Main Non c è molta struttura. 43

Primo tentativo di riprogettazione Presentazione Persistenza Main main() InputFile readline() OutputFile writeline() Dominio PasteService execute() Molto meglio. C è però un problema: il PasteService invoca direttamente i metodi della persistenza. Il dominio dipende dal 44

Invertiamo le dipendenze Main main() <<creates>> <<creates>> InputFile readline() Persistenza OutputFile writeline() <<creates>> <<implements>> «interface» IInputFile readline() Dominio <<implements>> «interface» IOutputFile writeline() PasteService execute() 45

import java.io.ioexception; public class PasteService { public void execute(string firstfilename, String secondfilename, String outputfilename) throws IOException { InputFile first = new InputFile(firstFileName); InputFile second = new InputFile(secondFileName); OutputFile out = new OutputFile(outputFileName); String stringfromfirst, stringfromsecond; while ((stringfromfirst = first.readline())!= null && (stringfromsecond = second.readline())!= null) { out.writeline(stringfromfirst + stringfromsecond); first.close(); second.close(); out.close(); 46