Lo sviluppo software guidato dai test: una esperienza con JUnit

Save this PDF as:
 WORD  PNG  TXT  JPG

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Lo sviluppo software guidato dai test: una esperienza con JUnit"

Transcript

1 Lo sviluppo software guidato dai test: una esperienza con JUnit Versione del 13 Gennaio 2004 Vittorio Scarano Dipartimento di Informatica ed Applicazioni Università di Salerno, 84081, Baronissi (SA) Italy. 1 Introduzione Tra le metodologie per lo sviluppo di software, è stata proposta recentemente una disciplina dal nome di Extreme Programming (XP), basata sui valori di semplicità, comunicazione, feedback (testing) e coraggio. L obiettivo principale di XP è quello di organizzare lo sviluppo di software in maniera da escludere la realizzazione di prodotti semilavorati diversi da quelli strettament necessari. In un certo senso, la XP si propone di mantenere il processo di produzione all interno dei due binari di efficacia e della controllabilità. Evitare, quindi, di produrre ponderosa documentazione di analisi e di specifiche formali ed, allo stesso tempo, produrre software con un preciso ambiente di controllo e di feedback, sia dal prodotto software stesso (attraverso fasi di testing) che dal committente e utilizzatore del prodotto. Il dibattito all interno della comunitaà scientifica sulla applicabilità di questa metodologia in tutti i contesti è tuttora aperto; probabilmente l utilizzo di questa metodologia all interno di qualsiasi tipo di progetto ed in qualsiasi situazione rappresenta una esagerazione. La utilità diextreme Programming sembra, però, riconosciuta all interno di progetti di dimensione medio-piccole, con scadenze pressanti e necessità di adeguamento a situazioni estremamente dinamiche. All interno delle prassi consolidate(le cosiddette core practices) proposteda XP, particolarmente interessante è la enfasi sullo Sviluppo guidato dai test, il cosiddetto Test-Driven Development. Infatti, anche tra i commenti più criticia cui è soggetta la XP, si riscontra un convergente giudizio positivo sulla pratica di sottoporre il proprio software in maniera strutturata e continua a test di sviluppo 1. 1 Una altra prassi universalmente giudicata in maniera positiva è la cosiddetta pair programming, cioè la programmazione in coppie di programmatori, cosa che permette (da esperimenti effettuati) la produzione di software di maggiore qualità in tempo minore. 1

2 2 UN ESEMPIO DI APPLICAZIONE 1.1 JUnit Lo sviluppo guidato dai test consiste nella tecnica di sviluppare una nuova funzionalità di un programma attraverso la ripetizione continua di un ciclo di produzione molto breve che consiste di due sole fasi: (1) scrittura di un test che il programma, con la nuova funzionalità, deve poter passare, (2) se il test non viene superato con successo, si modifica il codice nella maniera più semplice possibile per far passare il test. Non si può passare ad un nuovo test se non si sono superati tutti i test precedenti. Basando tutto lo sviluppo di software su questi rapidissimi cicli di produzione, è necessario avere a disposizione uno strumento automatico per la realizzazione di questi test. JUnit, lo strumento che andiamo ora a presentare, ha questo scopo. 1.1 JUnit JUnit è un ambiente per scrivere test scritto da Erich Gamma (autore, con altri, dei Design Patterns) e Kent Beck (autore e guru di Extreme Programming). L ambiente è disponibile anche in altri linguaggi (quali C, C++, SmallTalk, etc.) e supporta il programmatore nella definizione di test, nella loro raccolta in suite di test e nella loro esecuzione. JUnit è Open Source Software, rilasciato sotto la licenza IBM Common Public License (versione 0.5). Ha vinto nel 2002 e nel 2003 il premio JavaWorld Editors Choice Awards (ECA) in qualità di migliore strumento per il Performance Monitoring e il Testing in Java. L obiettivo di JUnit è quello di fornire al programmatore un ambiente che permette di sapere in ogni momento e con poco sforzo se il proprio programma ha superato tutti i test oppure no. Questo permette lo sviluppo rapido del software e la possibilità di rilasciare il programma (release) in ogni momento: infatti ad ogni passo dello sviluppo il programma deve passare con successo il 100% dei test definiti. Questo permette di fondere la fase di testing all interno dello sviluppo, cosa particolarmente utile per progetti di dimensione medio-piccole, dove il codice deve essere pronto ad evolvere guidato dalla dinamicità dei requisiti. Le funzionalità di JUnit rappresentano un ambito familiare dove il programmatore riesce a integrare testing e sviluppo in maniera armonica, permettendo di costruire nuovi test basandosi sui vecchi, di integrare insiemi di test sviluppati da altri programmatori e di valutare con estrema semplicità il risultato dei test. 2 Un esempio di applicazione Presentiamo ora un esempio didattico per illustrare il procedimento di sviluppo guidato dai test. L esempio è scritto in Java ed usa JUnit. E stato sviluppato sotto Eclipse, ma altri ambienti (JBuilder ad esempio) offrono simili funzionalità. In ogni modo, la suite di JUnit permette di svincolarsi completamente da qualsiasi ambiente di sviluppo (non che questo sia necessariamente un bene, attenzione!) e di poter essere eseguita lanciando la JVM da linea di comando. Pag. 2

3 2 UN ESEMPIO DI APPLICAZIONE 2.1 Il nostro obiettivo 2.1 Il nostro obiettivo L obiettivo del nostro esempio è quello di scrivere un metodo media() di una classe Calcolatore che deve, semplicemente, calcolare la media dei valori interi passati come parametro in un vettore e restituirla. Il valore restituito èun intero e, come tale, quindi viene soggetto al troncamento della parte decimale. Insomma la media di 1 e 2 sarà 1. Si tratta, evidentemente, di un metodo che ha valenza esclusivamente esemplificativa eppure, anche attraverso l uso della tecnologia JUnit, riserverà qualche sorpresa anche a programmatori di una certa esperienza. 2.2 La tecnica di JUnit Ricordiamo la filosofia di uso di JUnit: non si deve scrivere una linea di codice senza che sia scritto un test che ne verifichi il corretto funzionamento. Questa posizione (estremista ma, come vedremo, utile) serve a prevenire una pratica sconveniente che viene utilizzata spesso: si sviluppa il software rimandando la fase di testing successivamente. Quando poi, sotto la pressione per la consegna del lavoro, si rende necessario affrettare (oppure eliminare del tutto) qualche fase del lavoro, la prima candidata risulta essere la fase di testing. Questa non è, chiaramente, una scelta intelligente 2 da fare. Forzando il programmatore a scrivere prima un test si ottiene, innanzitutto, a fare sì che il codice sviluppato sia necessariamente testato. Poi, si ottiene anche un effetto virtuoso : il programmatore impara a scrivere nuovo codice creando un test che fallisca sul suo vecchio codice e che, quindi, in un certo senso lo metta in crisi. In questa maniera, il software sviluppato risulta essere particolarmente robusto a malfunzionamenti, in quanto la attitudine (che qualcuno potrebbe definire masochista) del programmatore ha cercato di evidenziare tutte le possibili anomalie durante la fase di sviluppo. Quindi, ricordiamo, la produzione avviene per cicli brevissimi che si compongono delle due fasi seguenti: 1. sviluppo di un test che rappresenta una funzionalità che il nostro codice deve poter offrire; 2. se il codice non viene passato, si propone la più semplice soluzione che possa risolvere il problema. Un commento merita la enfasi sulla semplicità della soluzione da proporre. A volte, sembra che questo suggerimento non abbia molto senso: in un certo senso la soluzione può anche cercare di prevenire problemi futuri. Questo, però, rappresenta esattamente il contrario della filosofia dello sviluppo guidato dai test che richiede che ogni parte di codice sia testata. Quindi, scrivere soluzioni complesse significherebbe introdurre codice cui non corrisponde un test da superare e quindi, codice non affidabile. 2 E stato scritto che questo equivale a spegnere la luce proprio quando la notte si fa più buia. Pag. 3

4 2 UN ESEMPIO DI APPLICAZIONE 2.3 Il primo passo 2.3 Il primo passo Iniziamo, secondo il puro stile JUnit, con lo scrivere il nostro codice iniziando dal test. Quindi, dovendo scrivere un metodo che calcoli la media di un vettore di interi, si deve partire dal primo test. Creiamo, quindi una test unit (come classe JUnit) che faccia un test iniziale. La prima stesura del file (che chiameremo CalcolatoreTest.java) sarà seguente: 1 import junit.framework.testcase; 2 public class CalcolatoreTest extends TestCase { 3 Calcolatore c; 4 public void setup(){ 5 c = new Calcolatore(); 6 } 7 public void testiniziale(){ 8 int[] valori = new int[]{0}; 9 assertequals(0, c.media(valori)); 10 } 11 } Come si può notare alla linea 2, la classe CalcolatoreTest eredita dalla classe junit.framework.testcase.testcase. Dopo avere dichiarato come campo della classe una variabile c oggetto istanza della classe Calcolatore (linea 3), definiamo, innanzitutto, un metodo setup() (linee 4-6) che ha lo scopo di approntare gli oggetti che servono per ogni test. Ricordiamo che il metodo setup() viene chiamato prima della esecuzione di ognimetododiquestaclasseilcuinome inizia per test. In questo esempio non abbiamo la necessità di utilizzare il metodo teardown() che viene chiamato alla fine della esecuzione di ogni singolo test. Fedeli alla filosofia del Test-Driven Development, cerchiamo di scrivere il primo test quando ancora non abbiamo scritto neanche una riga della classe Calcolatore. Lacosapuò sembrare paradossale, ma una volta abituati e, specialmente, una volta osservato i vantaggi che questa tecnica porta, diventerà una maniera molto naturale di procedere. Per prima cosa vogliamo che il nostro metodo calcoli correttamente la media Test # 1. La media di 0 è 0. di 0. Quindi, il test che vogliamo scrivere, che chiamiamo, opportunamente, testiniziale() è contenuto alle linee La prima cosa che vogliamo controllare è che questo metodo calcoli correttamente la media di un solo valore, 0, che viene inserito in un vettore di interi chiamato valori dimensionato ad un solo elemento. Questo viene effettuato controllando (linea 9) con assertequals che il risultato restituito dal metodo media() passando valori come parametro sia uguale a 0. A questo punto possiamo passare ad effettuare il primo di una lunga se- rie di test a cui sottoporremo la nostra classe Calcolatore. In effetti, questo primo test risulta davvero estremamente sfortunato: non riusciamo neanche a Pag. 4

5 2 UN ESEMPIO DI APPLICAZIONE 2.3 Il primo passo compilare la classe CalcolatoreTest per il semplicissimo motivo che la classe Calcolatore (cioè laclassecheè da testare) non esiste ancora! Quindi, dobbiamo, come prima cosa creare questa classe con il metodo richiesto media(). Ecco il risultato: 1 public class Calcolatore { 2 public int media(int[] valori) { 3 return 0; 4 } 5 } In effetti, avere scritto questa versione (assolutamente minimalista) della classe Calcolatore, risponde alla precisa indicazione di semplicità che viene dettata dalle prassi della cosiddetta Extreme Programming. In sintesi,il principio richiede al programmatore di scrivere la soluzione più semplice per poter far passare il test. Non si richiede (anzi viene sconsigliato) il cercare di progettare ipotizzando i test futuri a cui il nostro oggetto verrà sottoposto. In effetti, dopo aver scritto queste poche righe di codice il nostro test testiniziale() viene passato: il nostro metodo media() calcola la media di 0. Quando abbiamo finito di festeggiare, possiamo passare al nostro prossimo test. Diciamo che vorremmo che il nostro metodo calcoli correttamente la Test # 2. La media di 1 è 1, media di 0 ma anche la media di 1, 2,..., diciamo almeno fino a 9. Quindi possiamo passare a scrivere il prossimo test che chiamiamo testognivalore(). Ricordiamo che ad ogni passo verranno rieseguiti tutti i test contenuti nel TestCase CalcolatoreTest, quindi alla prossima esecuzione verranno eseguiti sia testiniziale() che testognivalore(), e così via per ogni test che aggiungeremo. Ecco il codice di testognivalore(): quella di 2 è 2, etc. fino a 9. 1 public void testognivalore() { 2 int[] valori = new int[1]; 3 String message; 4 for (int i=0; i<10; i++) 5 { 6 valori[0]=i; 7 message = "Media di "+i; 8 assertequals(message,i, c.media(valori)); 9 } 10 } Come possiamo notare, il test controlla che il valore sia corretto alla linea 8. Lanciamo questo test e, non senza stupore, riscontriamo che il test fallisce quando proviamo a calcolare la media di 1. Pag. 5

6 2 UN ESEMPIO DI APPLICAZIONE 2.3 Il primo passo Bene. Proviamo a fare passare questo test. Ricordiamo l obbligo di mantenere la semplicità nelle modifiche. Quindi la nostra modifica consiste nello scrivere il metodo media() in modo che restituisca come media il primo valore del vettore così: 2 return valori[0]; 3 } Lanciamo il test e notiamo che viene superato. Proviamo a controllare se il nostro metodo calcola la media correttamente Test # 2. La media di -1 è - anche se passiamo un valore negativo. Quindi quello che vogliamo controllare è effettuato dal questo metodo che aggiungiamo a CalcolatoreTest. 1, quella di -2 è -2, etc. fino a public void testvalorenegativo() { 2 int[] valori = new int[1]; 3 String message; 4 for (int i=-9; i<0; i++) 5 { 6 valori[0]=i; 7 message = "Media di "+i; 8 assertequals(message,i, c.media(valori)); 9 } 10 } Eseguiamo il test ed otteniamo che va tutto bene. Questo in generale, non è un bene... Effettivamente, il test che abbiamo scritto sembra inutile (in questo momento) e dobbiamo passare ad un passo successivo, insomma abbiamo preso coraggio ed è ora di passare oltre. Adesso, coraggiosamente cerchiamo di controllare se il metodo media() Test # 3. La media di 1 e 1 è calcola la media correttamente quando passiamo due valori uguali. Questo controllo viene effettuato da questo test: 1, quella di 2 e 2 è 2, etc. fino a 9 e 9. 1 public void testognicoppiaconstessovalore() { 2 int[] valori = new int[2]; 3 String message; 4 for (int i=0; i<10; i++) 5 { 6 valori[0]=i; 7 valori[1]=i; 8 message = "Media di "+i+" e "+i; 9 assertequals(message,i, c.media(valori)); Pag. 6

7 2 UN ESEMPIO DI APPLICAZIONE 2.3 Il primo passo 10 } 11 } Effettuiamo il test e (ancora una volta!) otteniamo che il test funziona. Dobbiamo essere ancora più coraggiosi, proviamo a fare la media di coppie Test # 4. La media tra 7 e 9 è 8. di valori diversi! Quindi scriviamo in CalcolatoreTest il metodo seguente che controlla se media() calcola correttamente la media tra 7 e 9: 1 public void testduevalori(){ 2 int[] valori = new int[]{7,9}; 3 assertequals(8, c.media(valori)); 4 } Lanciamo il test e, finalmente, notiamo che il nostro test fallisce. Finalmente possiamo mettere mano al codice del nostro metodo. La soluzione sembra semplice, no? In effetti, basta restituire il valore della media calcolata sui due interi, semplice. E quello che facciamo: 2 return (valori[0]+ valori[1])/2; 3 } Fatto? Proviamo ad eseguire il test e, con sorpresa, notiamo che non va a buon fine! Infatti questa volta il test che fallisce è uno dei precedenti: la modifica che abbiamo fatto, mentre ha fatto superare l ultimo test, ha però resononpiùcor- retto il testiniziale lanciando la eccezione ArrayIndexOutOfBoundsException. Infatti, basta notare che, quando passiamo un vettore di un solo elemento il risultato dipende solo dal primo, mentre nel caso in cui passiamo due valori (diversi) il risultato dipende da entrambi. E quindi è importante utilizzare all interno del codice la lunghezza del vettore passato come parametro a media(). Unpoco di riflessione ci convince che dobbiamo necessariamente calcolare la media in funzione del numero di elementi passati nel vettore, scrivendo quindi il codice seguente: 2 int sommavalori=0; 3 for (int i=0; i< valori.length ; i++) { 4 sommavalori += valori[i]; 5 } 6 return sommavalori/valori.length; 7 } Ed adesso il nostro metodo funziona correttamente su ciascuno dei test che abbiamo sviluppato. Pag. 7

8 2 UN ESEMPIO DI APPLICAZIONE 2.4 Miglioriamo il codice Giusto per essere sicuri, facciamo in modo di controllare che la media di Test # 5. La media di tutte le tutte le possibili combinazioni di valori tra 0 e 9 sia corretta. Scriviamo quindi questo metodo: coppie i e j, tra 0 e 9è corretta. 1 public void testognicoppia() { 2 int[] valori = new int[2]; 3 String message; 4 for (int i=0; i<10; i++) 5 for (int j=0; j<10; j++) { 6 valori[0]=i; 7 valori[1]=j; 8 message = "Media di "+i+" e "+j; 9 assertequals(message,(i+j)/2, c.media(valori)); 10 } 11 } Funziona! In effetti, adesso possiamo eseguire tutti i nostri test ed ottenere finalmente che tutti funzionano. Questa stesura del metodo della media rappresenta quella che probabilmente qualsiasi programmatore avrebbe realizzato in partenza. La cosa, adesso, si fa interessante. Come possiamo cercare di costruire un test che questo metodo non riesce a superare? 2.4 Miglioriamo il codice E venuto il momento di testare cosa succede se forniamo al metodo dei dati in maniera non corretta. Ad esempio, un primo controllo che si dovrebbe fare è Test # 6. Con vettore null, quello di controllare che il metodo media() quando viene passata una variabile con valore null restituisca una eccezione IllegalArgumentException. Come al solito, questo viene effettuato scrivendo prima il test, facendolo fallire e poi modificando il codice per far passare il test (e tutti i precedenti). quindi, questo metodo: Creiamo, lancia una eccezione. 1 public void testarraynull() { 2 int[] valori = null ; 3 try { 4 int media = c.media(valori); 5 fail ("Permette un array null!"); 6 } catch (IllegalArgumentException e) { 7 // non colta 8 } 9 } E da notare che alla linea 5 non si fa altro che chiedere al metodo di calcolare la media di un vettore null. Non si controlla il risultato: piuttosto, se la chiamata a media() non genera una eccezione IllegalArgumentException(che Pag. 8

9 2 UN ESEMPIO DI APPLICAZIONE 2.4 Miglioriamo il codice viene colta dalla catch della linea 6) allora lanciamo una eccezione con il metodo fail(). Eseguiamo il test e vediamo che effettivamente questo fallisce. In effetti, fallisce perché viene generata una eccezione NullPointerException nella riga 3 della ultima stesura del metodo media(), quando si cerca di accedere al campo length di un riferimento null. Come possiamo modificare il codice di media()? Inserendo un controllo (a inizio metodo) che il parametro passato non sia nullo. Ecco fatto: 2 int sommavalori=0; 3 if (valori == null) 4 throw new IllegalArgumentException(); 5 for (int i=0; i< valori.length ; i++) { 6 sommavalori += valori[i]; 7 } 8 return sommavalori/valori.length; 9 } Tutto a posto! Adesso lanciamo i test e vanno a buon fine tutti. metodo media() un vettore di interi che ha lunghezza 0, questo potrebbe creare dei problemi. Vediamo: Continuiamo a cercare di mettere in crisi il metodo media(). Una situazione Test # 7. Con vettore di lun- abbastanza intricata non è stata ancora controllata. Infatti, se passiamo al ghezza 0, lancia una eccezione. 1 public void testarrayvuoto () { 2 int[] valori = new int[0]; 3 try { 4 int media = c.media(valori); 5 fail ("Permette un array di zero elementi!"); 6 } catch (IllegalArgumentException e) { 7 // non colta 8 } Effettivamente ci siamo riusciti! Adesso il nostro metodo media() dà un errore dovuto alla divisione per zero che si effettua alla fine nella linea 8, essendo valori.length pari a 0. Modifichiamo il codice di media() per risolvere questo problema. Supponiamo, ora, che il programmatore compia un errore dovuto alla distrazione cioè che inserisca nella funzione media un controllo che nella condizione dell if contenga l AND logico delle condizioni (valori == null) e (valori.length == 0) invece che l OR logico, come sarebbe corretto. Un errore banale, ma che può capitare. Quindi modifichiamo il codice come segue: Pag. 9

10 2 UN ESEMPIO DI APPLICAZIONE 2.4 Miglioriamo il codice 2 int sommavalori=0; 3 if (valori == null && valori.length==0) 4 throw new IllegalArgumentException(); 5 for (int i=0; i< valori.length ; i++) { 6 sommavalori += valori[i]; 7 } 8 return sommavalori/valori.length; 9 } A questo punto, il programmatore (che ha compiuto l errore) potrebbe ritenere di aver risolto il problema e passare a fasi successive (magari anche ad altro codice). Invece, la metodologia dello sviluppo guidato dai test, obbliga a controllare che ogni linea di codice superi il 100% dei test elaborati. Quindi, viene lanciato il test che, contrariamente alle aspettative del programmatore, non viene passato. Quindi il programmatore può scoprire l errore e scrive correttamente il codice come segue: 2 int sommavalori=0; 3 if (valori == null valori.length==0) 4 throw new IllegalArgumentException(); 5 for (int i=0; i< valori.length ; i++) { 6 sommavalori += valori[i]; 7 } 8 return sommavalori/valori.length; 9 } Si può controllare il programma e verificare che ora tutti i test (compreso l ultimo) vengono passati con successo. Facciamo un attimo di pausa e commentiamo sulla attitudine di cercare di mettere in crisi il proprio codice per scoprirne debolezze e correggerle. L ultimo test rappresenta un classico esempio di come questa maniera di programmare produca codice più robusto ed affidabile. Un metodo media() come quello che abbiamo elaborato finora gestisce anche casi limite (come, ad esempio, il vettore non nullo ma di zero elementi) che normalmente non ci saremmo posti come problema (da programmatore) se il gioco che stiamo giocando non comportasse l obbligo di cercare di far fallire il nostro stesso programma per correggerne gli errori Non solo, proprio l ultimo esempio ha dimostrato come la abitudine a dover passare un test per ogni linea di codice scritta permette di far scoprire al programmatore distratto alcuni errori che magari sarebbero passati inosservati 3 come quello dell utilizzo di un AND logico al posto di un OR logico. 3 La legge di Murphy garantisce che gli errori si sarebbero evidenziati nella peggiore del- Pag. 10

11 2 UN ESEMPIO DI APPLICAZIONE 2.4 Miglioriamo il codice Adesso, immaginiamo un altro tipo di casi limite, ad esempio, quando i valori Test # 8. passati all interno del vettore valori risultano essere molto grandi. Quindi, controlliamo che il metodo media() calcoli correttamente la media di un singolo valore che è pari al massimo valore memorizzabile in un intero, che è definito come una costante nella classe wrapper per gli interi: Integer.MAX VALUE. Scriviamo quindi il metodo seguente: 1 public void testmaxvalueintero() { 2 int[] valori = new int[1]; 3 String message; 4 valori[0]=integer.max_value; 5 message = "Media di "+valori[0]; 6 assertequals(message,integer.max_value, c.media(valori)); 7 } Proviamo ad eseguirlo... e funziona. Dobbiamo trovare qualche cosa di meglio. La media di MAX VALUE è MAX VALUE. generata un eccezione ArithmeticException: 1 public void testduemaxvalueintero() { 2 int[] valori = new int[2]; 3 String message; 4 try { 5 valori[0]=integer.max_value; 6 valori[1]=integer.max_value; 7 message = "Media di "+valori[0]+" e "+valori[1]; 8 assertequals(message,integer.max_value, c.media(valori)); 9 fail ("Non riconosce l overflow!"); 10 } catch (ArithmeticException e) { 11 // non colta 12 } 13 } Proviamo a scrivere un test simile ma questa volta che fallisca. Ovviamente, il problema si presenterà se andiamo a calcolare la media di due MAX VALUE. Scriviamo quindi il seguente metodo, prevedendo che in caso di overflow venga Test # 9. La media di 2 valori MAX VALUE è MAX VALUE. Evviva! Il test fallisce! In effetti, si deve trattare il problema dell overflow: stiamo sommando dei valori interi e potremmo oltrepassare la capacità dime- morizzazione di un intero in Java. Due sono i passi che dobbiamo fare: (1) Come si fa a controllare se abbiamo generato un overflow? (2) cosa dobbiamo fare in questo caso? La risposta alla seconda domanda è semplice: si deve lanciare una eccezione di tipo ArithmeticException. La risposta alla prima domanda invece si nasconde nei meandri dei ricordi degli studi effettuati al primo anno del corso di le situazioni in maniera, cioé, da recare simultaneamente il massimo danno al client, allo sviluppatore ed al manager del progetto. Pag. 11

12 2 UN ESEMPIO DI APPLICAZIONE 2.4 Miglioriamo il codice Laurea in Informatica. Infatti, durante il corso di Architettura, si impara come controllare l overflow di operazioni in complemento a due: quando si sommano due positivi il risultato deve essere positivo, altrimenti vuol dire che abbiamo generato un overflow. A questo punto la maniera per modificare il metodo media() è il seguente: 2 int sommavalori=0; 3 int appoggiosomma; 4 if (valori == null valori.length == 0) 5 throw new IllegalArgumentException(); 6 for (int i=0; i< valori.length ; i++) { 7 appoggiosomma = sommavalori; 8 sommavalori += valori[i]; 9 if (appoggiosomma > 0 && valori[i]> 0 && sommavalori < 0) 10 throw new ArithmeticException(); 11 } 12 return sommavalori/valori.length; 13 } Quello che è stato fatto è semplicemente l inserimento di una nuova variabile intera appoggiosomma che mantiene (linea 7) il valore della variabile sommavalori prima che questa venga modificata (nella linea 8). A questo punto si può controllare se la somma del vecchio valore e del valore che stiamo sommando (valori[i]) ha generato un valore negativo (linea 9). In questo caso lanciamo una eccezione (linea 10). Controlliamo se funziona tutto. Lanciamo il test ed otteniamo che non ci sono errori. Ok, bene. Abbiamo capito in che direzione andare. Dovremmo testare cosa succede anche con MIN VALUE. In questo momento dobbiamo ricordarci di applicare (alla lettera) i dettami del Test-driven Development: si deve modificare il programma nella maniera più semplice per poter passare il test che aveva fallito in precedenza. Quindi, prima di fare qualsiasi modifica che permetta di gestire a vedere se riusciamo a calcolare correttamente la media di due valori negativi molto piccoli (MIN VALUE) con questo metodo: overflow negativi dobbiamo scrivere un test e farlo fallire. Quindi, proviamo Test # 10. La media di 2 valori MIN VALUE è MIN VALUE. 1 public void testdueminvalueintero() { 2 int[] valori = new int[2]; 3 String message; 4 try { 5 valori[0]=integer.min_value; 6 valori[1]=integer.min_value; 7 message = "Media di "+valori[0]+" e "+valori[1]; 8 assertequals(message,integer.min_value/2, c.media(valori)); Pag. 12

13 2 UN ESEMPIO DI APPLICAZIONE 2.4 Miglioriamo il codice 9 fail ("Non riconosce l overflow negativo!"); 10 } catch (ArithmeticException e) { 11 // non colta 12 } 13 } Evviva! Non funziona. Adesso possiamo modificare il programma. E la cosa sembra facile: abbiamo appena tratta il caso dell overflow positivo, basta invertire le condizioni e tratteremo l overflow negativo. Vediamo cosa otteniamo. 2 int sommavalori=0; 3 int appoggiosomma; 4 if (valori == null valori.length == 0) 5 throw new IllegalArgumentException(); 6 for (int i=0; i< valori.length ; i++) { 7 appoggiosomma = sommavalori; 8 sommavalori += valori[i]; 9 if (appoggiosomma > 0 && valori[i]> 0 && sommavalori < 0) 10 throw new ArithmeticException(); 11 if (appoggiosomma < 0 && valori[i]< 0 && sommavalori > 0) 12 throw new ArithmeticException(); 13 } 14 return sommavalori/valori.length; 15 } Bene, sembra fatta. Eseguiamo il test... e non funziona! Perché? Abbiamo semplicemente invertito le condizioni per l overflow positivo? Perché nonva? Un pochino di osservazione vi farà notare che le condizioni di overflow non sono speculari: mentre basta controllare che la somma di due positivi dia un negativo per controllare l overflow positivo, per controllare l overflow negativo si deve controllare anche che il risultato non sia zero! Infatti la somma di due valori MIN VALUE dà come risultato proprio zero! Quindi dobbiamo modificare la linea 11 in modo da controllare anche se il risultato della somma di due negativi dà zero, come segue: 2 int sommavalori=0; 3 int appoggiosomma; 4 if (valori == null valori.length == 0) 5 throw new IllegalArgumentException(); 6 for (int i=0; i< valori.length ; i++) { 7 appoggiosomma = sommavalori; 8 sommavalori += valori[i]; 9 if (appoggiosomma > 0 && valori[i]> 0 && sommavalori < 0) Pag. 13

14 3 CONCLUSIONI 10 throw new ArithmeticException(); 11 if (appoggiosomma < 0 && valori[i]< 0 && sommavalori >= 0) 12 throw new ArithmeticException(); 13 } 14 return sommavalori/valori.length; 15 } Bene, adesso funziona tutto. 3 Conclusioni 3.1 Alcuni commenti La tecnologia relativa a JUnit rappresenta uno strumento molto utile per il supporto al programmatore. Una volta abituatisi allo stile di programmazione (che richiede di partire, in maniera apparentemente irrazionale, dalla scrittura di test per arrivare (solo successivamente) alla scrittura del codice) l aiuto che viene fornito al programmatore risulta notevole. Con questo semplice esempio abbiamo voluto enfatizzare alcuni degli aspetti positivi della tecnica programmazione guidata dai test. In particolare, ritengo opportuno sottolineare come alcune situazioni potenzialmente pericolose sono state evitate proprio con la enfasi sulla attività di test che deve precedere quella di codifica. Ad esempio, possiamo citare il passo del Test n. 10 che verificava la corretta segnalazione di overflow in caso di somma di due valori MIN VALUE. La asimmetria nella condizione di test per l overflow positivo e quella per l overflow negativa sarebbe potuta probabilmente sfuggire anche a programmatori esperti. L obbligo di fornire prima un test specifico, che deve essere passato con successo, ha forzato il programmatore a scrivere un test apparentemente banale e inutile (vale a dire, che doveva sicuramente essere passato) che ha rivelato invece un problema nel codice la cui soluzione ha permesso di creare del codice di maggiore qualità (robusto ed affidabile). Una situazione di errore diversa, ma egualmente pericolosa, si è verificata nel il Test n. 7 che ha permesso di scoprire immediatamente una distrazione del programmatore. Riconoscere immediatamente un errore così banale ha dei notevoli vantaggi pratici ed economici: in quel momento, e trattando quei programmi, il programmatore ha immediatamente riconosciuto e potuto correggere l errore. Immaginate, invece, il tempo che avrebbe impiegato se, magari dopo due mesi, un tester (o peggio, il cliente!) avesse chiamato per dire che A uncertopunto viene generata una eccezione... e non funziona più nulla!. Il programmatore potrebbe impiegare giorni interi per trovare questo semplice errore. Un altro aspetto particolarmente interessante è il fatto che il nostro progetto software compie solamente passi avanti in quanto ad ogni fase di test effettuiamo tutti i test contenuti nella test unit. Questo ha permesso di evidenziare errori Pag. 14

15 RIFERIMENTI BIBLIOGRAFICI 3.2 Note bibliografiche che possono essere stati inseriti successivamente, modificando parti del codice apparentemente non correlate. Dopo aver terminato la descrizione delle meraviglie di questo framework, una parola deve essere spesa per avvertire di alcune limitazioni della tecnologia JUnit. Innanzitutto, si deve assolutamente evitare di considerare codice prodotto da questa tecnica come error free. Diciamo che la tecnologia JUnit facilita la vita di chi deve scrivere codice attraverso una attività ditestcontinuoma che non forza nessuno a scrivere dei test significativi. Insomma, JUnit è uno strumento efficace, ma semplicemente il fatto di usarlo non garantisce la qualità del nostro software: ci vuole anche molta inventiva, esperienza e capacità per usarlo al meglio. Poi, si dovrebbe tenere presente le limitazioni di uso di JUnit all interno di applicazioni. Ad esempio, mentre sembra immediato l uso per le parti della applicazione che compongono la business logic, èpiù difficile immaginarne l uso per la componente di visualizzazione. Anche se qualche sistema di testing automatico per interfacce su palmari esiste, un sistema così completo come JUnit per testare la qualità diunainterfacciasembracomplicatodaottenere. 3.2 Note bibliografiche Molte informazioni su Extreme Programming possono essere trovate su alcuni siti dedicati a questa metodologia di programmazione [1, 2]. Materiale ed informazioni su JUnit si trovano, invece, sul sito ufficiale dedicato a JUnit [3], e nella documentazione che si trova nel package che viene scaricato (nella directory doc). Infine, interessante è il materiale contenuto nella JUnit Frequently Asked Questions [4]. L esempio di uso della media è stato ispirato (almeno per la parte iniziale) da un (più semplice) esempio mostrato in Riferimenti bibliografici [1] [2] [3] JUnit Official Home Page [4] JUnit Frequently Asked Questions Pag. 15

Test di unità con JUnit4

Test di unità con JUnit4 Test di unità con JUnit4 Richiamo sul test di unità Il test d unità è una metodologia che permette di verificare il corretto funzionamento di singole unità di codice in determinate condizioni. Nel caso

Dettagli

Esercizi su. Funzioni

Esercizi su. Funzioni Esercizi su Funzioni ๒ Varie Tracce extra Sul sito del corso ๓ Esercizi funz_max.cc funz_fattoriale.cc ๔ Documentazione Il codice va documentato (commentato) Leggibilità Riduzione degli errori Manutenibilità

Dettagli

10 - Programmare con gli Array

10 - Programmare con gli Array 10 - Programmare con gli Array Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it

Dettagli

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

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012 Fondamenti di informatica Oggetti e Java ottobre 2012 1 JUnit JUnit è uno strumento per assistere il programmatore Java nel testing JUnit consente di scrivere test di oggetti e classi Java i test sono

Dettagli

Codici Numerici. Modifica dell'informazione. Rappresentazione dei numeri.

Codici Numerici. Modifica dell'informazione. Rappresentazione dei numeri. Codici Numerici. Modifica dell'informazione. Rappresentazione dei numeri. A partire da questa lezione, ci occuperemo di come si riescono a codificare con sequenze binarie, quindi con sequenze di 0 e 1,

Dettagli

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti 13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/

Dettagli

4 3 4 = 4 x 10 2 + 3 x 10 1 + 4 x 10 0 aaa 10 2 10 1 10 0

4 3 4 = 4 x 10 2 + 3 x 10 1 + 4 x 10 0 aaa 10 2 10 1 10 0 Rappresentazione dei numeri I numeri che siamo abituati ad utilizzare sono espressi utilizzando il sistema di numerazione decimale, che si chiama così perché utilizza 0 cifre (0,,2,3,4,5,6,7,8,9). Si dice

Dettagli

tesi di laurea Anno Accademico 2009/2010 relatore Ch.mo prof. Porfirio Tramontana candidato Pasquale Ludi Matr. 534\000438

tesi di laurea Anno Accademico 2009/2010 relatore Ch.mo prof. Porfirio Tramontana candidato Pasquale Ludi Matr. 534\000438 tesi di laurea Anno Accademico 2009/2010 relatore Ch.mo prof. Porfirio Tramontana candidato Pasquale Ludi Matr. 534\000438 Obbiettivi del progetto: Sviluppo di un applicazione Flex in AdobeFlashBuilder

Dettagli

I SISTEMI DI NUMERAZIONE

I SISTEMI DI NUMERAZIONE Istituto di Istruzione Superiore G. Curcio Ispica I SISTEMI DI NUMERAZIONE Prof. Angelo Carpenzano Dispensa di Informatica per il Liceo Scientifico opzione Scienze Applicate Sommario Sommario... I numeri...

Dettagli

Corso di Informatica

Corso di Informatica Corso di Informatica Modulo T3 1-Sottoprogrammi 1 Prerequisiti Tecnica top-down Programmazione elementare 2 1 Introduzione Lo scopo di questa Unità è utilizzare la metodologia di progettazione top-down

Dettagli

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP) 12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP) Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica,

Dettagli

Poca documentazione: uso di Story Card e CRC (Class Responsibility Collabor) Collaborazione con il cliente rispetto alla negoziazione dei contratti

Poca documentazione: uso di Story Card e CRC (Class Responsibility Collabor) Collaborazione con il cliente rispetto alla negoziazione dei contratti Sviluppo Agile [Cockburn 2002] Extreme Programming (XP) [Beck 2000] Sono più importanti auto-organizzazione, collaborazione, comunicazione tra membri del team e adattabilità del prodotto rispetto ad ordine

Dettagli

Complemento al corso di Fondamenti di Informatica I corsi di laurea in ingegneria, settore dell informazione Università la Sapienza Consorzio Nettuno

Complemento al corso di Fondamenti di Informatica I corsi di laurea in ingegneria, settore dell informazione Università la Sapienza Consorzio Nettuno Rappresentazione di numeri Complemento al corso di Fondamenti di Informatica I corsi di laurea in ingegneria, settore dell informazione Università la Sapienza Consorzio Nettuno Un numero e un entità teorica,

Dettagli

Siamo così arrivati all aritmetica modulare, ma anche a individuare alcuni aspetti di come funziona l aritmetica del calcolatore come vedremo.

Siamo così arrivati all aritmetica modulare, ma anche a individuare alcuni aspetti di come funziona l aritmetica del calcolatore come vedremo. DALLE PESATE ALL ARITMETICA FINITA IN BASE 2 Si è trovato, partendo da un problema concreto, che con la base 2, utilizzando alcune potenze della base, operando con solo addizioni, posso ottenere tutti

Dettagli

Esercitazione in Laboratorio: risoluzione di problemi di programmazione lineare tramite Excel il mix di produzione

Esercitazione in Laboratorio: risoluzione di problemi di programmazione lineare tramite Excel il mix di produzione Esercitazione in Laboratorio: risoluzione di problemi di programmazione lineare tramite Excel il mix di produzione Versione 11/03/2004 Contenuto e scopo esercitazione Contenuto esempi di problema di programmazione

Dettagli

Obiettivo Principale: Spiegare come la stessa cosa possa essere realizzata in molti modi diversi e come, a volte, ci siano modi migliori di altri.

Obiettivo Principale: Spiegare come la stessa cosa possa essere realizzata in molti modi diversi e come, a volte, ci siano modi migliori di altri. 6 LEZIONE: Algoritmi Tempo della lezione: 45-60 Minuti. Tempo di preparazione: 10-25 Minuti (a seconda che tu abbia dei Tangram disponibili o debba tagliarli a mano) Obiettivo Principale: Spiegare come

Dettagli

Scrivere un programma in Java

Scrivere un programma in Java Programmare in JAVA Leonardo Rigutini Dipartimento Ingegneria dell Informazione Università di Siena Via Roma 56 53100 SIENA uff. 0577 234850 - interno: 7102 Stanza 119 rigutini@dii.unisi.it http://www.dii.unisi.it/~rigutini/

Dettagli

IMSV 0.8. (In Media Stat Virtus) Manuale Utente

IMSV 0.8. (In Media Stat Virtus) Manuale Utente Introduzione IMSV 0.8 (In Media Stat Virtus) Manuale Utente IMSV è una applicazione che calcola che voti può'prendere uno studente negli esami che gli mancano per ottenere la media che desidera. Importante:

Dettagli

Linguaggi e Paradigmi di Programmazione

Linguaggi e Paradigmi di Programmazione Linguaggi e Paradigmi di Programmazione Cos è un linguaggio Definizione 1 Un linguaggio è un insieme di parole e di metodi di combinazione delle parole usati e compresi da una comunità di persone. È una

Dettagli

Correttezza. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 10. A. Miola Novembre 2007

Correttezza. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 10. A. Miola Novembre 2007 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1 Dispensa 10 Correttezza A. Miola Novembre 2007 http://www.dia.uniroma3.it/~java/fondinf1/ Correttezza 1 Contenuti Introduzione alla correttezza

Dettagli

I SISTEMI DI NUMERAZIONE E LA NUMERAZIONE BINARIA

I SISTEMI DI NUMERAZIONE E LA NUMERAZIONE BINARIA I SISTEMI DI NUMERAZIONE E LA NUMERAZIONE BINARIA Indice Introduzione Il sistema decimale Il sistema binario Conversione di un numero da base 10 a base 2 e viceversa Conversione in altri sistemi di numerazione

Dettagli

Organizzazione della lezione. Extreme Programming (XP) Lezione 19 Extreme Programming e JUnit. JUnit. JUnit. Test-Driven Development

Organizzazione della lezione. Extreme Programming (XP) Lezione 19 Extreme Programming e JUnit. JUnit. JUnit. Test-Driven Development Organizzazione della lezione Lezione 19 Extreme Programming e JUnit Vittorio Scarano Corso di Programmazione Distribuita (2003-2004) Laurea di I livello in Informatica Università degli Studi di Salerno

Dettagli

Rappresentazione delle informazioni

Rappresentazione delle informazioni Rappresentazione delle informazioni Abbiamo informazioni (numeri, caratteri, immagini, suoni, video... ) che vogliamo rappresentare (e poter elaborare) in un calcolatore. Per motivi tecnologici un calcolatore

Dettagli

Fasi del ciclo di vita del software (riassunto) Progetto: generalità. Progetto e realizzazione (riassunto)

Fasi del ciclo di vita del software (riassunto) Progetto: generalità. Progetto e realizzazione (riassunto) Università degli Studi di Roma La Sapienza Facoltà di Ingegneria Sede di Latina Laurea in Ingegneria dell Informazione Fasi del ciclo di vita del software (riassunto) Corso di PROGETTAZIONE DEL SOFTWARE

Dettagli

1. Calcolare la probabilità che estratte a caso ed assieme tre carte da un mazzo di 40, fra di esse vi sia un solo asso, di qualunque seme.

1. Calcolare la probabilità che estratte a caso ed assieme tre carte da un mazzo di 40, fra di esse vi sia un solo asso, di qualunque seme. Esercizi difficili sul calcolo delle probabilità. Calcolare la probabilità che estratte a caso ed assieme tre carte da un mazzo di, fra di esse vi sia un solo asso, di qualunque seme. Le parole a caso

Dettagli

Obiettivo Principale: Aiutare gli studenti a capire cos è la programmazione

Obiettivo Principale: Aiutare gli studenti a capire cos è la programmazione 4 LEZIONE: Programmazione su Carta a Quadretti Tempo della lezione: 45-60 Minuti. Tempo di preparazione: 10 Minuti Obiettivo Principale: Aiutare gli studenti a capire cos è la programmazione SOMMARIO:

Dettagli

NUOVA PROCEDURA COPIA ED INCOLLA PER L INSERIMENTO DELLE CLASSIFICHE NEL SISTEMA INFORMATICO KSPORT.

NUOVA PROCEDURA COPIA ED INCOLLA PER L INSERIMENTO DELLE CLASSIFICHE NEL SISTEMA INFORMATICO KSPORT. NUOVA PROCEDURA COPIA ED INCOLLA PER L INSERIMENTO DELLE CLASSIFICHE NEL SISTEMA INFORMATICO KSPORT. Con l utilizzo delle procedure di iscrizione on line la società organizzatrice ha a disposizione tutti

Dettagli

Dispense di Informatica per l ITG Valadier

Dispense di Informatica per l ITG Valadier La notazione binaria Dispense di Informatica per l ITG Valadier Le informazioni dentro il computer All interno di un calcolatore tutte le informazioni sono memorizzate sottoforma di lunghe sequenze di

Dettagli

Corso di Informatica Generale (C. L. Economia e Commercio) Ing. Valerio Lacagnina Rappresentazione in virgola mobile

Corso di Informatica Generale (C. L. Economia e Commercio) Ing. Valerio Lacagnina Rappresentazione in virgola mobile Problemi connessi all utilizzo di un numero di bit limitato Abbiamo visto quali sono i vantaggi dell utilizzo della rappresentazione in complemento alla base: corrispondenza biunivoca fra rappresentazione

Dettagli

ESERCIZI DI ALGEBRA LINEARE E GEOMETRIA

ESERCIZI DI ALGEBRA LINEARE E GEOMETRIA ESERCIZI DI ALGEBRA LINEARE E GEOMETRIA Francesco Bottacin Padova, 24 febbraio 2012 Capitolo 1 Algebra Lineare 1.1 Spazi e sottospazi vettoriali Esercizio 1.1. Sia U il sottospazio di R 4 generato dai

Dettagli

1. I database. La schermata di avvio di Access

1. I database. La schermata di avvio di Access 7 Microsoft Access 1. I database Con il termine database (o base di dati) si intende una raccolta organizzata di dati, strutturati in maniera tale che, effettuandovi operazioni di vario tipo (inserimento

Dettagli

Corso Eclipse. Prerequisiti. 1 Introduzione

Corso Eclipse. Prerequisiti. 1 Introduzione Corso Eclipse 1 Introduzione 1 Prerequisiti Uso elementare del pc Esecuzione ricerche su Internet Esecuzione download Conoscenza elementare della programmazione 2 1 Cos è Eclipse Eclipse è un IDE (Integrated

Dettagli

LABORATORIO DI PROGRAMMAZIONE 2012 2013 EDIZIONE 1, TURNO B

LABORATORIO DI PROGRAMMAZIONE 2012 2013 EDIZIONE 1, TURNO B LABORATORIO DI PROGRAMMAZIONE 2012 2013 EDIZIONE 1, TURNO B 23.XI.2012 VINCENZO MARRA Indice Esercizio 1 1 Menu 1 Tempo: 35 min. 2 Commento 1 2 Esercizio 2 2 Ordinamento e ricerca binaria con la classe

Dettagli

I SISTEMI DI NUMERAZIONE

I SISTEMI DI NUMERAZIONE ISTITUTO DI ISTRUZIONE SUPERIORE G. M. ANGIOY CARBONIA I SISTEMI DI NUMERAZIONE Prof. G. Ciaschetti Fin dall antichità, l uomo ha avuto il bisogno di rappresentare le quantità in modo simbolico. Sono nati

Dettagli

ESEMPIO 1: eseguire il complemento a 10 di 765

ESEMPIO 1: eseguire il complemento a 10 di 765 COMPLEMENTO A 10 DI UN NUMERO DECIMALE Sia dato un numero N 10 in base 10 di n cifre. Il complemento a 10 di tale numero (N ) si ottiene sottraendo il numero stesso a 10 n. ESEMPIO 1: eseguire il complemento

Dettagli

Guida alla composizione di modelli OpenOffice

Guida alla composizione di modelli OpenOffice Tekne Informatica & Comunicazione Guida alla composizione di modelli OpenOffice guida rapida per creare e modificare modelli OpenOffice per XDent 01 aprile 2011 Sommario Premessa... 2 Ottenere ed Installare

Dettagli

Il Pattern PROXY. Ex presentazione realizzata dallo studente Paolo Melchiori (matricola 65734) nell a.a. 2007-2008

Il Pattern PROXY. Ex presentazione realizzata dallo studente Paolo Melchiori (matricola 65734) nell a.a. 2007-2008 UNIVERSITÀ DEGLI STUDI DI BRESCIA FACOLTÀ DI INGEGNERIA CORSO DI LAUREA SPECIALISTICA IN INGEGNERIA INFORMATICA DIPARTIMENTO DI ELETTRONICA PER L'AUTOMAZIONE Il Pattern PROXY Ex presentazione realizzata

Dettagli

Gestione delle eccezioni in Java

Gestione delle eccezioni in Java Gestione delle eccezioni in Java - Introduzione al concetto di eccezioni E possibile definire un eccezione come un situazione imprevista che il flusso di un applicazione può incontrare. È possibile gestire

Dettagli

Serie numeriche e serie di potenze

Serie numeriche e serie di potenze Serie numeriche e serie di potenze Sommare un numero finito di numeri reali è senza dubbio un operazione che non può riservare molte sorprese Cosa succede però se ne sommiamo un numero infinito? Prima

Dettagli

Tutorial di FPM c. Poderico Luigi

Tutorial di FPM c. Poderico Luigi Poderico Luigi Introduzione Per rendere più agevole l utilizzo di FPM c, specialmente per chi lo usa per la prima volta, proponiamo di seguito un esempio d utilizzo del programma. Partendo dalla formulazione

Dettagli

21-01 Controlli al volo

21-01 Controlli al volo 01. Matrici di controlli Per iniziare, una matrice di pulsanti Dichiarare una matrice di Button come segue: Button [, ] matrix; matrix = new Button [8, 8]; 21-01 Controlli al volo 21-01 Controlli al volo

Dettagli

Struttura di un programma Java

Struttura di un programma Java Struttura di un programma Java Un programma in Java è un insieme di dichiarazioni di classi. Una classe non può contenere direttamente delle istruzioni, ma può contenere la dichiarazione di metodi, che

Dettagli

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

Concetti Base Eccezioni Eccezioni e Metodi Gerarchia di Eccezioni. Java: Eccezioni. Damiano Macedonio Dipartimento di Informatica, Università degli Studi di Verona Corso di Programmazione per Bioformatica lezione del 30 maggio 2014 Introduzione Un programma diviso in sezioni distinte Un approccio alla

Dettagli

Gestione delle Eccezioni

Gestione delle Eccezioni Gestione delle Eccezioni Condizioni di Errore Una condizione di errore in un programma può avere molte cause Errori di programmazione Divisione per zero, cast non permesso, accesso oltre i limiti di un

Dettagli

WORD 97 SCRIVERE UNA TESI DI LAUREA

WORD 97 SCRIVERE UNA TESI DI LAUREA WORD 97 SCRIVERE UNA TESI DI LAUREA PASSO 1 Per prima cosa pensiamo al formato generale della pagina: i margini richiesti da una tesi sono quasi sempre più ampi di quelli di un testo normale. Apriamo ora

Dettagli

Agile. mercoledì, 1 luglio 2015, 3:05 p. Prof. Tramontano docente Federico II ingegneria del software. Sviluppo Agile: metaprocesso

Agile. mercoledì, 1 luglio 2015, 3:05 p. Prof. Tramontano docente Federico II ingegneria del software. Sviluppo Agile: metaprocesso Agile mercoledì, 1 luglio 2015, 3:05 p. Prof. Tramontano docente Federico II ingegneria del software Sviluppo Agile: metaprocesso Molti progetti software falliscono Sì parte dagli anni 2000 Millennium

Dettagli

Corso html 5. Di Roberto Abutzu. `***********` Ottava parte: I link, seconda parte. `**********` I link, seconda parte.

Corso html 5. Di Roberto Abutzu. `***********` Ottava parte: I link, seconda parte. `**********` I link, seconda parte. Corso html 5. Di Roberto Abutzu. `***********` Ottava parte: I link, seconda parte. `**********` I link, seconda parte. Continuiamo la parte che completerà la trattazione dei link, andando ad operare direttamente

Dettagli

COME NON PERDERE TEMPO NEL NETWORK MARKETING!

COME NON PERDERE TEMPO NEL NETWORK MARKETING! COME NON PERDERE TEMPO NEL NETWORK MARKETING Grazie per aver scaricato questo EBOOK Mi chiamo Fabio Marchione e faccio network marketing dal 2012, sono innamorato e affascinato da questo sistema di business

Dettagli

Dimensione di uno Spazio vettoriale

Dimensione di uno Spazio vettoriale Capitolo 4 Dimensione di uno Spazio vettoriale 4.1 Introduzione Dedichiamo questo capitolo ad un concetto fondamentale in algebra lineare: la dimensione di uno spazio vettoriale. Daremo una definizione

Dettagli

1 Breve introduzione ad AMPL

1 Breve introduzione ad AMPL 1 Breve introduzione ad AMPL Il primo passo per risolvere un problema reale attraverso strumenti matematici consiste nel passare dalla descrizione a parole del problema al modello matematico dello stesso.

Dettagli

L algoritmo di ricerca binaria. Daniele Varin LS Ing. Informatica Corso di Informatica teorica Docente: prof. Paolo Sipala

L algoritmo di ricerca binaria. Daniele Varin LS Ing. Informatica Corso di Informatica teorica Docente: prof. Paolo Sipala L algoritmo di ricerca binaria Daniele Varin LS Ing. Informatica Corso di Informatica teorica Docente: prof. Paolo Sipala L algoritmo di ricerca binaria (o dicotomica) In informatica,, la ricerca dicotomica

Dettagli

Algebra Booleana ed Espressioni Booleane

Algebra Booleana ed Espressioni Booleane Algebra Booleana ed Espressioni Booleane Che cosa è un Algebra? Dato un insieme E di elementi (qualsiasi, non necessariamente numerico) ed una o più operazioni definite sugli elementi appartenenti a tale

Dettagli

Unità 1. I Numeri Relativi

Unità 1. I Numeri Relativi Unità 1 I Numeri Relativi Allinizio della prima abbiamo introdotto i 0numeri 1 naturali: 2 3 4 5 6... E quattro operazioni basilari per operare con essi + : - : Ci siamo però accorti che la somma e la

Dettagli

Organizzazione della lezione. Lezione 18 Remote Method Invocation - 6. (con callback) L accesso al registry per il rebind()

Organizzazione della lezione. Lezione 18 Remote Method Invocation - 6. (con callback) L accesso al registry per il rebind() Organizzazione della lezione Lezione 18 Remote Method Invocation - 6 Vittorio Scarano Corso di Programmazione Distribuita (2003-2004) Laurea di I livello in Informatica Università degli Studi di Salerno

Dettagli

Programmazione Java Avanzata Concetti su Java

Programmazione Java Avanzata Concetti su Java Programmazione Java Avanzata Concetti su Java Ing. Giuseppe D'Aquì Testi di Riferimento Java ( R. Liguori, P. Liguori), O'Reilly Hops Tecniche Nuove (2008) Java Virtual Machine Il codice scritto in Java

Dettagli

Breve riepilogo della puntata precedente:

Breve riepilogo della puntata precedente: Breve riepilogo della puntata precedente: 1. In C, il passaggio dei parametri alle funzioni avviene sempre per copia, ovvero il valore del parametro viene copiato all'interno della variabile che rappresenta

Dettagli

Progetto costo I. O. I.A. A 5 9 4 B 8 15 9 C 4 3 3 D 9 7 1

Progetto costo I. O. I.A. A 5 9 4 B 8 15 9 C 4 3 3 D 9 7 1 Tecniche di Valutazione Economica Processo di aiuto alla decisione lezione 13.04.2005 Modello di valutazione Dobbiamo riuscire a mettere insieme valutazioni che sono espresse con dimensioni diverse. Abbiamo

Dettagli

IMPARARE A GESTIRE LE COPPIE. Quando ci viene servita una coppia di carte uguali dal dealer. è sempre un bel momento, ma non sempre si è in grado di

IMPARARE A GESTIRE LE COPPIE. Quando ci viene servita una coppia di carte uguali dal dealer. è sempre un bel momento, ma non sempre si è in grado di IMPARARE A GESTIRE LE COPPIE Quando ci viene servita una coppia di carte uguali dal dealer è sempre un bel momento, ma non sempre si è in grado di dare il giusto valore alle carte in nostro possesso, tendendo

Dettagli

Semantica operazionale dei linguaggi di Programmazione

Semantica operazionale dei linguaggi di Programmazione Semantica operazionale dei linguaggi di Programmazione Oggetti sintattici e oggetti semantici Rosario Culmone, Luca Tesei Lucidi tratti dalla dispensa Elementi di Semantica Operazionale R. Barbuti, P.

Dettagli

Crescita della produttività e delle economie

Crescita della produttività e delle economie Lezione 21 1 Crescita della produttività e delle economie Il più spettacolare effetto della sviluppo economico è stata la crescita della produttività, ossia la quantità di prodotto per unità di lavoro.

Dettagli

Introduzione. Java. Composizione. Esempio -- composizione. G. Prencipe prencipe@di.unipi.it. È qualcosa che abbiamo già visto varie volte

Introduzione. Java. Composizione. Esempio -- composizione. G. Prencipe prencipe@di.unipi.it. È qualcosa che abbiamo già visto varie volte Java riutilizzo delle classi G. Prencipe prencipe@di.unipi.it Introduzione Una delle caratteristiche fondamentali in Java è il riutilizzo del codice Ci sono due modi per ottenerlo Creare oggetti di classi

Dettagli

1 di 17 14-01-2009 18:14

1 di 17 14-01-2009 18:14 14 gen 2009 Stampa articolo 48 Commenti [Modifica] Corso interattivo di programmazione per iphone: I Lezione Corso Inglese Online Facile, Rapido e Divertente Corso a distanza. Provalo Gratis! ABAEnglish.com

Dettagli

Introduzione al Linguaggio C

Introduzione al Linguaggio C Introduzione al Linguaggio C File I/O Daniele Pighin April 2009 Daniele Pighin Introduzione al Linguaggio C 1/15 Outline File e dati Accesso ai file File I/O Daniele Pighin Introduzione al Linguaggio C

Dettagli

GUIDA ALLA PROGRAMMAZIONE GRAFICA IN C

GUIDA ALLA PROGRAMMAZIONE GRAFICA IN C GUIDA ALLA PROGRAMMAZIONE GRAFICA IN C.:luxx:. PREMESSE In questa guida non verranno trattati i costrutti di flusso, le funzioni, o comunque le caratteristiche del linguaggio, che si danno come presupposte.

Dettagli

Non ho idea se è la prima volta che vedi un mio prodotto oppure se in passato le nostre strade si sono già incrociate, poco importa

Non ho idea se è la prima volta che vedi un mio prodotto oppure se in passato le nostre strade si sono già incrociate, poco importa Benvenuto/a o bentornato/a Non ho idea se è la prima volta che vedi un mio prodotto oppure se in passato le nostre strade si sono già incrociate, poco importa Non pensare di trovare 250 pagine da leggere,

Dettagli

Probabilità discreta

Probabilità discreta Probabilità discreta Daniele A. Gewurz 1 Che probabilità c è che succeda...? Una delle applicazioni della combinatoria è nel calcolo di probabilità discrete. Quando abbiamo a che fare con un fenomeno che

Dettagli

Modulo 4: Ereditarietà, interfacce e clonazione

Modulo 4: Ereditarietà, interfacce e clonazione Modulo 4: Ereditarietà, interfacce e clonazione Argomenti Trattati: Classi, Superclassi e Sottoclassi Ereditarietà Ereditarietà ed Attributi Privati Override super Ereditarietà e Costruttori Polimorfismo

Dettagli

Altri metodi di indicizzazione

Altri metodi di indicizzazione Organizzazione a indici su più livelli Altri metodi di indicizzazione Al crescere della dimensione del file l organizzazione sequenziale a indice diventa inefficiente: in lettura a causa del crescere del

Dettagli

SO Office Solutions SOLUZIONI E MACCHINE PER UFFICIO

SO Office Solutions SOLUZIONI E MACCHINE PER UFFICIO SO Office Solutions Con la Office Solutions da oggi. La realizzazione di qualsiasi progetto parte da un attenta analisi svolta con il Cliente per studiare insieme le esigenze al fine di individuare le

Dettagli

Esercizi di Excel. Parte terza

Esercizi di Excel. Parte terza Esercizi di Excel Parte terza Questa settimana verranno presentati alcuni esercizi sull'uso delle funzioni e della formattazione condizionale. In caso di domande, richieste od altro ancora non esitate

Dettagli

Funzioni in C. Violetta Lonati

Funzioni in C. Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica Funzioni - in breve: Funzioni Definizione di funzioni

Dettagli

SMS IN. Rules SMS IN. Rules. Geodrop. Geodrop

SMS IN. Rules SMS IN. Rules. Geodrop. Geodrop SMS IN Rules SMS IN Rules } Geodrop Geodrop SMS In 2.3 Regole per la manipolazione dei messaggi Guida alla scrittura di condizioni complesse Guida alle condizioni complesse v1.0-it, 7 Dicembre 2012 Indice

Dettagli

Lezioni di Matematica 1 - I modulo

Lezioni di Matematica 1 - I modulo Lezioni di Matematica 1 - I modulo Luciano Battaia 16 ottobre 2008 Luciano Battaia - http://www.batmath.it Matematica 1 - I modulo. Lezione del 16/10/2008 1 / 13 L introduzione dei numeri reali si può

Dettagli

Laboratorio di Informatica

Laboratorio di Informatica per chimica industriale e chimica applicata e ambientale LEZIONE 2 Rappresentazione delle informazioni: numeri e caratteri 1 Codice La relazione che associa ad ogni successione ben formata di simboli di

Dettagli

CORSO DI PROGRAMMAZIONE

CORSO DI PROGRAMMAZIONE ISTITUTO TECNICO INDUSTRIALE G. M. ANGIOY SASSARI CORSO DI PROGRAMMAZIONE OBJECT ORIENTED PROGRAMMING: I METODI DISPENSA 15.02 15-02_OOP_Metodi_[15] Questa dispensa è rilasciata sotto la licenza Creative

Dettagli

14 - Packages. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

14 - Packages. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo 14 - Packages Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it Corso di

Dettagli

Il Piano Finanziario Parte 2: Equilibrio e Investimento

Il Piano Finanziario Parte 2: Equilibrio e Investimento Il Piano Finanziario Parte 2: Equilibrio e Investimento Non aspettare, il tempo non potrà mai essere " quello giusto". Inizia da dove ti trovi, e lavora con qualsiasi strumento di cui disponi, troverai

Dettagli

Politecnico di Milano. Facoltà di Ingegneria Industriale. Corso di Analisi e Geometria 2. Sezione D-G. (Docente: Federico Lastaria).

Politecnico di Milano. Facoltà di Ingegneria Industriale. Corso di Analisi e Geometria 2. Sezione D-G. (Docente: Federico Lastaria). Politecnico di Milano. Facoltà di Ingegneria Industriale. Corso di Analisi e Geometria 2. Sezione D-G. (Docente: Federico Lastaria). Aprile 20 Indice Serie numeriche. Serie convergenti, divergenti, indeterminate.....................

Dettagli

Capitolo 4 Probabilità

Capitolo 4 Probabilità Levine, Krehbiel, Berenson Statistica II ed. 2006 Apogeo Capitolo 4 Probabilità Insegnamento: Statistica Corso di Laurea Triennale in Economia Facoltà di Economia, Università di Ferrara Docenti: Dott.

Dettagli

Corso di Informatica Generale (C. L. Economia e Commercio) Ing. Valerio Lacagnina Fondamenti di calcolo booleano

Corso di Informatica Generale (C. L. Economia e Commercio) Ing. Valerio Lacagnina Fondamenti di calcolo booleano Breve introduzione storica Nel 1854, il prof. Boole pubblica un trattato ormai famosissimo: Le leggi del pensiero. Obiettivo finale del trattato è di far nascere la matematica dell intelletto umano, un

Dettagli

Ricerche, ordinamenti e fusioni. 5.1 Introduzione. 5.2 Ricerca completa

Ricerche, ordinamenti e fusioni. 5.1 Introduzione. 5.2 Ricerca completa Ricerche, ordinamenti e fusioni 5.1 Introduzione Questo capitolo ci permette di fare pratica di programmazione utilizzando gli strumenti del linguaggio introdotti finora. A una prima lettura possono essere

Dettagli

LA TRASMISSIONE DELLE INFORMAZIONI QUARTA PARTE 1

LA TRASMISSIONE DELLE INFORMAZIONI QUARTA PARTE 1 LA TRASMISSIONE DELLE INFORMAZIONI QUARTA PARTE 1 I CODICI 1 IL CODICE BCD 1 Somma in BCD 2 Sottrazione BCD 5 IL CODICE ECCESSO 3 20 La trasmissione delle informazioni Quarta Parte I codici Il codice BCD

Dettagli

Domande e Risposte ALLEGATI CLIENTI E FORNITORI. DATALOG Soluzioni Integrate

Domande e Risposte ALLEGATI CLIENTI E FORNITORI. DATALOG Soluzioni Integrate KING Domande e Risposte ALLEGATI CLIENTI E FORNITORI DATALOG Soluzioni Integrate - 2 - Domande e Risposte Allegati Clienti e Fornitori Sommario Premessa.... 3 Introduzione... 4 Elenco delle domande...

Dettagli

Metodologie di programmazione in Fortran 90

Metodologie di programmazione in Fortran 90 Metodologie di programmazione in Fortran 90 Ing. Luca De Santis DIS - Dipartimento di informatica e sistemistica Anno accademico 2007/2008 Fortran 90: Metodologie di programmazione DIS - Dipartimento di

Dettagli

Logica e geometria con il linguaggio Logo

Logica e geometria con il linguaggio Logo Logica e geometria con il linguaggio Logo Classe: III, IV e V primaria Argomento: geometria e logica Autori: Guido Gottardi e Alberto Battaini Introduzione: senza la pretesa di redigere un trattato sul

Dettagli

risulta (x) = 1 se x < 0.

risulta (x) = 1 se x < 0. Questo file si pone come obiettivo quello di mostrarvi come lo studio di una funzione reale di una variabile reale, nella cui espressione compare un qualche valore assoluto, possa essere svolto senza necessariamente

Dettagli

Supermarket Progetto di Programmazione Febbraio 2010

Supermarket Progetto di Programmazione Febbraio 2010 Supermarket Progetto di Programmazione Febbraio 2010 1 Supermercato Dovete realizzare un insieme di classi e interfacce che riguardano la gestione di un supermercato. nella Sezione 2 verranno descritte

Dettagli

Aritmetica: operazioni ed espressioni

Aritmetica: operazioni ed espressioni / A SCUOLA DI MATEMATICA Lezioni di matematica a cura di Eugenio Amitrano Argomento n. : operazioni ed espressioni Ricostruzione di un abaco dell epoca romana - Museo RGZ di Magonza (Germania) Libero da

Dettagli

Introduzione. Margine di ampiezza... 2 Margine di fase... 5 Osservazione... 6 Margini di stabilità e diagrammi di Bode... 6

Introduzione. Margine di ampiezza... 2 Margine di fase... 5 Osservazione... 6 Margini di stabilità e diagrammi di Bode... 6 ppunti di Controlli utomatici Capitolo 7 parte II Margini di stabilità Introduzione... Margine di ampiezza... Margine di fase... 5 Osservazione... 6 Margini di stabilità e diagrammi di ode... 6 Introduzione

Dettagli

2 Progetto e realizzazione di funzioni ricorsive

2 Progetto e realizzazione di funzioni ricorsive 2 Progetto e realizzazione di funzioni ricorsive Il procedimento costruttivo dato dal teorema di ricorsione suggerisce due fatti importanti. Una buona definizione ricorsiva deve essere tale da garantire

Dettagli

Punto Vendita. OBS Open Business Solutions

Punto Vendita. OBS Open Business Solutions L area Punto Vendita, rivolta alle aziende commerciali al dettaglio, consente la gestione delle operazioni di vendita al banco e più precisamente l immissione, la manutenzione, la stampa, l archiviazione

Dettagli

L economia: i mercati e lo Stato

L economia: i mercati e lo Stato Economia: una lezione per le scuole elementari * L economia: i mercati e lo Stato * L autore ringrazia le cavie, gli alunni della classe V B delle scuole Don Milanidi Bologna e le insegnati 1 Un breve

Dettagli

Una minaccia dovuta all uso dell SNMP su WLAN

Una minaccia dovuta all uso dell SNMP su WLAN Una minaccia dovuta all uso dell SNMP su WLAN Gianluigi Me, gianluigi@wi-fiforum.com Traduzione a cura di Paolo Spagnoletti Introduzione Gli attacchi al protocollo WEP compromettono la confidenzialità

Dettagli

JAVASCRIPT. Tale file è associato alla pagina web mediante il tag <script> inserito nella sezione <head> con la seguente sintassi:

JAVASCRIPT. Tale file è associato alla pagina web mediante il tag <script> inserito nella sezione <head> con la seguente sintassi: JAVASCRIPT Introduzione Con l HTML siamo in grado di realizzare pagine web statiche. Con il linguaggio Javascript, invece, possiamo interagire modificando il contenuto della pagina. Il linguaggio javascript

Dettagli

INTERPUMP GROUP SPA-VIA E. FERMI 25 42040 S.ILARIO (RE) http: //www.interpumpgroup.it

INTERPUMP GROUP SPA-VIA E. FERMI 25 42040 S.ILARIO (RE) http: //www.interpumpgroup.it PROCEDURA E-COMMERCE BUSINESS TO BUSINESS Guida alla Compilazione di un ordine INTERPUMP GROUP SPA-VIA E. FERMI 25 42040 S.ILARIO (RE) http: //www.interpumpgroup.it INDICE 1. Autenticazione del nome utente

Dettagli

Uso di base delle funzioni in Microsoft Excel

Uso di base delle funzioni in Microsoft Excel Uso di base delle funzioni in Microsoft Excel Le funzioni Una funzione è un operatore che applicato a uno o più argomenti (valori, siano essi numeri con virgola, numeri interi, stringhe di caratteri) restituisce

Dettagli

Programmare in Java. Olga Scotti

Programmare in Java. Olga Scotti Programmare in Java Olga Scotti Linguaggi di programmazione linguaggio macchina assembler linguaggi ad alto livello Linguaggi ad alto livello istruzioni comprensibili linguaggio simile a quello naturale

Dettagli

Informatica 3. Informatica 3. LEZIONE 6: Il controllo dell esecuzione. Lezione 6 - Modulo 1. Errori durante l esecuzione. Il controllo dell esecuzione

Informatica 3. Informatica 3. LEZIONE 6: Il controllo dell esecuzione. Lezione 6 - Modulo 1. Errori durante l esecuzione. Il controllo dell esecuzione Informatica 3 Informatica 3 LEZIONE 6: Il controllo dell esecuzione Modulo 1: La gestione delle eccezioni Modulo 2: Programmazione concorrente Lezione 6 - Modulo 1 La gestione delle eccezioni Politecnico

Dettagli

ESB perché? Dare una svolta all'azienda grazie all'integrazione Dati.

ESB perché? Dare una svolta all'azienda grazie all'integrazione Dati. 1 ESB perché? Dare una svolta all'azienda grazie all'integrazione Dati. 2 Indice generale Abstract...3 Integrare: perché?...3 Le soluzioni attuali...4 Cos'è un ESB...5 GreenVulcano ESB...6 3 Abstract L'integrazione

Dettagli

TEMPO X PRODURRE ARTICOLO QUANTITÀ LAVORAZIONE MACCHINA 1 PEZZO Taglio Seghetto 30 minuti. Tornitura Tornio 20 minuti

TEMPO X PRODURRE ARTICOLO QUANTITÀ LAVORAZIONE MACCHINA 1 PEZZO Taglio Seghetto 30 minuti. Tornitura Tornio 20 minuti PIANIFICAZIONE DELLA PRODUZIONE CON ACCESS E PROJECT 2007 In questo articolo esamineremo come una applicazione Access ed una applicazione Project 2007 possono interagire per creare un piano di produzione

Dettagli