Esercitazioni di Ingegneria del Software

Avviso per il progetto di Prova Finale

: I casi di test di JUnit che committate nel repository NON - e ripeto NON - devono contenere loop infiniti o input da parte dell'utente, ma devono essere eseguibili in maniera AUTOMATICA e terminare. Assicuratevene PRIMA di committare eseguendo una run completa di maven. Non rispettare questo requisito causa grossi problemi nella compilazione dei progetti su Hudson e di conseguenza anche la generazione dei report di Sonar.

JML: Astrazioni Procedurali e sui Dati

Astrazioni Procedurali (completa)
Astrazioni sui dati: Complex e Matrix

Prova Finale: Materiale Aggiuntivo

Slide di riferimento sulla serializzazione.
Configurazione di rmiregistry e di un server rmi in Eclipse.
Esempio di gestione specifica di sottotipi sfruttando il polimorfismo invece del downcasting (per esempio, eventi).

Esercitazione su programmazione di Rete

Slide su programmazione di rete
Soluzioni degli esercizi.

Esercitazione su Multithreading

Slide su thread e concorrenza in Java
Soluzioni degli esercizi.

Esercitazione su Design Pattern

Slide con esempi su design patterns
Codice che implementa l'esempio della calcolatrice usando in maniera piu' organica il pattern mvc. L'esempio mostra anche l'uso di factory methods e del singleton.

Esercitazione su UML

Descrizione esercizi
Scarica le soluzioni ai primi due esercizi in formato pdf oppure papyrus. Quest'ultimo zip contiene anche un file di profilo con due stereotipi per annotare le classi con i ruoli dei design pattern che implementano.
Esercitazione sulle collection

Esercitazione Extra su Swing

Descrizione esercizi
Scarica il codice dell'esercizio sulla calcolatrice.
Scarica il codice dell'esercizio aggiuntivo sulla selezione di un ordine di Pizza.
: Le classi modello di entrambi gli esercizi non sono state testate volutamente, e alcune funzionalita' non sono nemmeno testabili. E' un buon esercizio scrivere dei casi di test per queste classi, modificandole in modo da renderle completamente testabili. Infine, un altro buon esercizio per capire se le cose siano state fatte bene e' pensare ad una interfaccia testuale da linea di comando anziche' una UI. Riuscite ad implementarla?

Esercitazione di Prova Finale 3

Scarica la seconda parte delle slide su Swing.
Scarica una piccola demo su swing.
: Ho rimosso dalle slide gli esempi sulla parte sui Listener, visto che il codice non era chiaro e pulito. Viste le necessita' che avete espresso anche con il docente, ho preparato una esercitazione aggiuntiva (che si terra' domani lunedi' 8 Aprile) su swing che copre attraverso esempi concreti i contenuti delle slide e un minimo di aspetti di progettazione che pensavo di fare piu' avanti.

Esercitazioni di Prova Finale 1 e 2

Tutorial su Javadoc.
Scarica le slide su maven.
Scarica le slide su version control.
Scarica la prima parte delle slide su Swing.
: Scarica il codice sorgente degli esempi sulla parte di documentazione (piu' completa rispetto alla versione vista ad esercitazione). Provate a scrivere dei casi di test per il metodo getRoots(int degree) di Complex. Come fareste?

Esercitazione 4

Nella terza esercitazione abbiamo discusso di testing e di test driven development.

Scarica le slide.

Esercitazione 3

Nella terza esercitazione abbiamo visto esercizi sull'ereditarieta'. Ho aggiunto alcune considerazioni piu' precise su alcuni aspetti rispetto alle slide presentate a esercitazione.

Scarica le slide.

Esercitazione 2

Nella seconda esercitazione abbiamo visto come si gestiscono i casi eccezionali in Complex e ComplexSet. Attenzione: nelle slide che ho presentato ad esercitazione c'era un refuso sull'utilizzo delle eccezioni unchecked. In questa versione e' stato corretto: grazie.

Scarica le slide.

Un esempio divertente di uso delle eccezioni.

Esercitazione 1

Nella prima esercitazione abbiamo visto come si implementano due semplici tipi di dato astratto, Complex e ComplexSet.

Complex

Un tipo di dato astratto abbastanza semplice che rappresenta numeri complessi. La scelta per la quale la rappresentazione non e' mutabile sara' piu' chiara man mano che andremo avanti nel corso.

ComplexSet

Rappresenta un insieme (con una dimensione massima prefissata) di numeri complessi, confrontati a meno di un determinato errore. In questo caso, lo stato interno cambia attraverso l'invocazione di due metodi, add(Complex) e remove(Complex).

Scarica il codice sorgente (parzialmente completo) dell'esercitazione. Il codice contiene un po' di metodi non implementati e di cose da fare aggiuntive su cui potete esercitarvi. Alcune le discutero' all'inizio della prossima esercitazione. Il design di queste due classi non e' perfetto a causa del fatto che alcuni concetti ancora non sono stati spiegati a lezione. Pian piano aggiungero' dettagli non appena gli argomenti saranno trattati.