INGEGNERIA DEL SOFTWARE

Anno accademico 2017/2018 - 2° anno
Docente: Emiliano Alessio TRAMONTANA
Crediti: 9
SSD: INF/01 - Informatica
Organizzazione didattica: 225 ore d'impegno totale, 153 di studio individuale, 36 di lezione frontale, 36 di esercitazione
Semestre:

Obiettivi formativi

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.

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.


Prerequisiti richiesti

Basi di programmazione di algoritmi in 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). Gestione dei progetti: pianificazione. Gestione dei requisiti del software: raccolta ed analisi. Notazione UML: diagrammi di casi d’uso, attività, stati, classi, sequenza e collaborazione.

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, Adapter, Bridge, Composite, Decorator, Facade, Chain of Responsibility, Mediator, Observer, State.

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. Ian Sommerville. Ingegneria del Software. Pearson Addison-Wesley. 2007.
  2. Gamma, et al. Design Patterns – Elements of Reusable Object-Oriented Software. Pearson Addison-Wesley. 2002.
  3. Martin Fowler. UML Distilled. Pearson. 2010


Programmazione del corso

 *ArgomentiRiferimenti testi
1 Caratteristiche del software e dell’ingegneria del software.[1] 
2*Fasi per lo sviluppo del software: raccolta e analisi requisiti, progettazione, codifica, convalida, evoluzione.[1] 
3*Processi di sviluppo del software: cascata, evolutivi e agili (XP, spirale, RUP).[1] 
4*Gestione dei requisiti del software: raccolta ed analisi. Tipi di requisiti, linee guida per la scrittura dei requisiti.[1] 
5*La notazione UML: introduzione, diagrammi dei casi d’uso, diagrammi delle attività (con corsie e dati), diagrammi degli stati (stati composti concorrenti e sequenziali), diagrammi delle classi, diagrammi di sequenza, diagrammi di collaborazione.[3] 
6*Identificazione e progettazione classi, uso di interfacce, ereditarietà e polimorfismo. Creazione di istanze di classi. Visibilità di classi, attributi e metodi. Concetti di comportamento, override e overload. Information hiding, coesione, coupling.[1, 2] 
7*Progettazione del software: identificazione di sottosistemi. Stili architetturali: client-server, blackboard, pipe-filter, repository, event-driven, a macchina astratta.[1, 2] 
8*Progettazione ed implementazione con Java Stream e parallelismoNote fornite 
9*Design Pattern (illustrati tramite idee guida, diagrammi e codice). Creazionali: Singleton (e metodi statici), Factory Method (inclusa variante riflessiva)[2] 
10*Design pattern strutturali: Adapter (versione Object e Class), Façade, Composite, Decorator, e Bridge. Comportamentali: Observer, Mediator, State e Chain of Responsibility. [2] 
11 Anti-pattern: God Class, Spaghetti Code, Cut-and-Paste programmingNote fornite 
12*Evoluzione del software, categorie di cambiamenti e gestione dei cambiamenti. Leggi di Lehman.[1] 
13*Metriche sul software: complessità ciclomatica, linee di codice. Metriche per sistemi ad oggetti: suite di Chidamber e Kemerer.
14*Fase di test. Test di componenti, metriche di copertura del codice. Test regressivi.
15*Tecniche di Refactoring 
* Conoscenze minime irrinunciabili per il superamento dell'esame.

N.B. La conoscenza degli argomenti contrassegnati con l'asterisco è condizione necessaria ma non sufficiente per il superamento dell'esame. Rispondere in maniera sufficiente o anche più che sufficiente alle domande su tali argomenti non assicura, pertanto, il superamento dell'esame.

Verifica dell'apprendimento

Modalità di verifica dell'apprendimento

L'esame è strutturato in: un compito scritto consistente in varie domande a risposta multipla ed alcune domande aperte; e una prova orale.


Esempi di domande e/o esercizi frequenti

Diagrammi UML di un design pattern

Descrizione degli obiettivi di un design pattern

Descrizione del funzionamento di un design pattern

Implementazione di una classe di un design pattern

Implementazione di selezione dati e trasformazione dati tramite Stream Java