INGEGNERIA DEL SOFTWARE M - Z

Anno accademico 2023/2024 - Docente: EMILIANO ALESSIO TRAMONTANA

Risultati di apprendimento attesi

Obiettivi formativi generali in termini di risultati di apprendimento attesi.

1. Conoscenza e capacità di comprensione (knowledge and understanding): lo studente conoscerà in modo approfondito i meccanismi di programmazione ad oggetti, le caratteristiche di modularità del software, la gestione dello sviluppo del software.

2. Capacità di applicare conoscenza e comprensione (applying knowledge and understanding): lo studente saprà progettare, documentare e implementare sistemi software ad oggetti, saprà distinguere i ruoli dei partecipanti allo sviluppo del software, saprà implementare test per verificare la correttezza del software.

3. Autonomia di giudizio (making judgements): lo studente acquisirà la capacità di analizzare la modularità dei sistemi software.

4. Abilità comunicative (communication skills): lo studente imparerà a descrivere in linguaggio tecnico le componenti software.

5. Capacità di apprendimento (learning skills): lo studente potrà affrontare e risolvere problemi di progettazione e implementazione in ambiti realistici, studiando, valutando e utilizzando, sulla base dei fondamenti di questo corso, tecnologie innovative.

Modalità di svolgimento dell'insegnamento

Lezioni frontali.

Qualora l'insegnamento venisse impartito in modalità mista o a distanza potranno essere introdotte le necessarie variazioni rispetto a quanto dichiarato in precedenza, al fine di rispettare il programma previsto e riportato nel syllabus.

Prerequisiti richiesti

Basi di programmazione di algoritmi in C o C++ o Java.

Frequenza lezioni

La frequenza delle lezioni è indispensabile per la comprensione degli argomenti trattati. 

Contenuti del corso

Processi di sviluppo del software: cascata, evolutivi e agili (spirale, XP, Scrum), tempistica delle attività svolte. Gestione dei requisiti del software: raccolta ed analisi. Notazione UML: diagrammi di casi d’uso, attività, stati, classi, sequenza e collaborazione. Cenni su repository di codice Git.

Progettazione ad oggetti, ereditarietà e polimorfismo. Qualità del software. Design Pattern illustrati tramite obiettivi, contesto, problema, esempi, soluzione con diagrammi e codice: Singleton, Factory Method, Prototype, Template Method, Adapter, Bridge, Composite, Decorator, Facade, Chain of Responsibility, Mediator, Observer, State, Command.

Tecniche di Refactoring.

Stream in Java e parallelismo.

Metriche sul software, ed evoluzione del software.

Tecniche di test per convalidare il software.

Testi di riferimento

  1. I. Sommerville. Ingegneria del Software. Pearson Addison-Wesley.
  2. E. Gamma, R. Helm, R. Johnson, J. Vlissiders. Design Patterns – Elements of Reusable Object-Oriented Software. Pearson Addison-Wesley.
  3. M. Fowler. UML Distilled. Pearson. 2010
  4. R.-G. Urma, M. Fusco, A. Mycroft. Java 8 in Action: Lambdas, streams, and functional-style programming. Manning. 2015
  5. K. Beck. Extreme Programming Explained: Embrace Change. Addison-Wesley. 1999
  6. M. Fowler. Refactoring: Improving the Design of Existing Code. Addison-Wesley.
  7. K. Beck. Implementation Patterns. Addison-Wesley.

Programmazione del corso

 ArgomentiRiferimenti testi
1Obiettivi dell’ingegneria del software. Caratteristiche del software: complessità, modificabilità, correttezza, specifiche, test[1]
2Caratteristiche del software: astrazioni (classi). Principio di singola responsabilità per classi e metodi.[1, 2]
3Qualità del codice e anti-pattern (God class, Spaghetti Code). Progettazione ed implementazione di test.[1, 2]
4Tecniche di Refactoring: estrai metodo, sostituisci temp con query, dividi variabile temp.[6]
5Design pattern Singleton. Creazione di istanze di classi. Metodi statici. Visibilità di classi, attributi e metodi. Concetti di information hiding, coesione, coupling. Concetti e meccanismi di ereditarietà e polimorfismo.[1, 2]
6Design Pattern Factory Method (con varianti riflessiva, object pool, dependency injection).[2]
7Identificazione e progettazione classi, uso di interfacce, ereditarietà e polimorfismo. Compatibilità di tipi. Dispatch di chiamate di metodo. Override e overload.[1, 2]
8La notazione UML per i diagrammi delle classi, di sequenza, di collaborazione.[3]
9Design pattern Adapter (versione Object e Class), e Façade.[2]
10Diagrammi UML degli stati. Design pattern State[2, 3]
11Design pattern Observer e Publish-Subscribe.[2]
12Riconoscimento di design pattern dal codice e dai diagrammi UML delle classi[2]
13Design pattern MVC, Mediator, e Decorator. [2]
14Processi di sviluppo agili: introduzione alle pratiche del processo extreme programming (XP).[5]
15Processo XP: pratiche di pianificazione (story card e CRC), pair programming, design semplice, refactoring, piccole release, standard di codifica, cliente in sede, test. Cenni di processo Scrum.[5]
16Fasi per lo sviluppo del software: raccolta e analisi requisiti, progettazione, codifica, convalida, evoluzione.[1]
17Processi di sviluppo del software: cascata, evolutivi e a spirale.[1]
18Requisiti del software: raccolta, tipi di requisiti, linee guida per la scrittura dei requisiti.[1]
19Progettazione ed implementazione con Java Stream e parallelismo. Filter, map, reduce. Tipi Predicate, Function, Supplier, Optional.[4]
20Esempi di programmazione con Stream Java, e concorrenza con stream[4]
21Design pattern Composite, Chain of Responsibility. Conseguenze sul codice dell'adozione di vari design pattern[2]
22Design pattern Bridge. La notazione UML dei diagrammi dei casi d’uso, e delle attività.[2, 3]
23Evoluzione del software, categorie di cambiamenti e gestione dei cambiamenti. Leggi di Lehman.[1]
24Metriche sul software: complessità ciclomatica, linee di codice. Metriche per sistemi ad oggetti: suite di Chidamber e Kemerer. Fase di test. Test di componenti, metriche di copertura del codice. Test regressivi.[1]

Verifica dell'apprendimento

Modalità di verifica dell'apprendimento

La valutazione consiste di una prova scritta e un colloquio orale. La prova scritta si svolge alle ore 9:00 del giorno dell'appello, salvo comunicazioni diverse. La prova scritta dura un'ora e consiste di vari quesiti a risposte multiple e due domande aperte che prevedono l'implementazione di codice e il disegno di diagrammi. Il superamento della prova scritta permette di presentarsi alla parte 'orale dell'esame, nei giorni successivi allo scritto, che verranno comunicati. 

Una ottima valutazione dello scritto sarà attribuita quando il numero di risposte corrette per i quesiti a risposte multiple è vicino al numero di domande totali e quando le risposte alle domande aperte sono corrette e precise.

L'esame sarà valutato in modo ottimo se si mostrerà di aver acquisito profonda conoscenza dei concetti del corso e precisione nella loro esposizione. Un voto intermedio sarà dato nel caso in cui l'esame mostra una comprensione parziale degli argomenti. Uno voto appena sufficiente sarà dato quando pur conoscendo parzialmente gli argomenti, questi vengono esposti in modo superficiale.

Opzionale lo svolgimento e la presentazione di un progetto.

La verifica dell’apprendimento potrà essere effettuata anche per via telematica, qualora le condizioni lo dovessero richiedere.

Esempi di domande e/o esercizi frequenti

Disegnare il diagramma UML delle classi di un design pattern

Descrivere gli obiettivi di un design pattern

Dire quali sono le conseguenze (sul codice) di un design pattern 

Descrivere il funzionamento di un design pattern

Implementare una classe di un design pattern

Implementare una selezione dati e una trasformazione dati tramite Stream Java

Descrivere il metodo filter (map, reduce) e mostrarne la sintassi d'uso e un esempio

Descrivere il tipo Predicate (Function, Supplier)