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.
Basi di programmazione di algoritmi in C++ o Java.
La frequenza delle lezioni è indispensabile per la comprensione degli argomenti trattati.
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.
www.dmi.unict.it/~tramonta/
* | Argomenti | Riferimenti 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 parallelismo | Note 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 programming | Note 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. | 1 |
14 | * | Fase di test. Test di componenti, metriche di copertura del codice. Test regressivi. | 1 |
15 | * | Tecniche di Refactoring |
L'esame è strutturato in: un compito scritto consistente in varie domande a risposta multipla ed alcune domande aperte; e una prova orale.
Durante il corso verranno svolte due prove in itinere, riservate a chi segue il corso.
Tipicamente le prove in itinere sono due, una i primi di maggio e l'altra a metà giugno, e consistono ciascuna di un compito scritto con domande a risposta multipla e domande aperte.
L'accesso alla seconda prova in itinere è subordinato al superamento della prima prova.
Il superamento di entrambe le prove in itinere permette di accedere all'orale dell'esame finale.
I risultati delle prove in itinere verranno mantenuti per l'anno accademico, lo studente potrà completare con l'esame orale, entro fine ottobre.
L'esame finale consiste di una prova scritta e di un colloquio orale.
La prova scritta consiste generalmente di varie domande a risposta multipla ed alcune domande aperte.
Le prove scritte saranno valutate con un giudizio sintetico:
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