Nome insegnamento: INGEGNERIA DEL SOFTWARE Articolazione in moduli: NO Settore Scientifico Disciplinare: ING-INF/05 Docente responsabile: ANGELO FURFARO Crediti formativi universitari: 9 Numero ore lezioni: 57 Numero ore riservate attività didattiche assistite: 84 Numero ore esercitazioni: 27 Numero ore attività di laboratorio: 0 Tipologia di attività formativa (TAF): caratterizzante Lingua di insegnamento: Italiano Anno di corso e Periodo didattico di erogazione: II ANNO, II SEMESTRE Insegnamento/i Propedeutico/i: PROGRAMMAZIONE ORIENTATA AGLI OGGETTI Risultati d’apprendimento previsti e competenze da acquisire: Il corso è incentrato sulle problematiche di modellazione, analisi, progetto, implementazione e collaudo di sistemi software orientati agli oggetti, in ambiente centralizzato e distribuito. Per gli aspetti di modellazione si fa riferimento prevalentemente alla notazione UML. Qualche cenno è dato, comunque, ai linguaggi di specifica formale e ai problemi di verifica. Java è utilizzato come linguaggio di implementazione. Come ausilio alle attività di sviluppo si propongono i pattern di progetto sequenziali, concorrenti, basati su componenti e per applicazioni su rete. Il corso discute, infine, aspetti di gestione e controllo dei progetti. A fine corso l’allievo dovrebbe aver acquisito competenze relative a: − abilità nell'utilizzo di diagrammi UML per rendere “visibile” un progetto software − abilità nel formalizzare le specifiche di un problema − abilità nel passaggio da un modello di specifica ad un modello concettuale di classi − abilità a raffinare un modello di analisi in un modello di progetto − capacità di trasformare di un modello di progetto in codice Java (o altro linguaggio ad oggetti) − capacità nella definizione ed organizzazione dei test sia di unità che di sottosistemi integrati − capacità di individuare ed utilizzare pattern di progetto in uno sviluppo software − abilità a sviluppare sistemi software in ambiente centralizzato e distribuito − capacità di analisi di questioni di pianificazione e controllo delle attività di un progetto software. Argomenti delle lezioni: Concetti Introduttivi Processo di produzione del software. Parametri di qualità. Fasi del ciclo di vita. Processo a cascata. Limitazioni. Introduzione ai processi iterativi e incrementali. Specifica, analisi e progettazione Analisi e progetto di sistemi software ad oggetti. Il linguaggio di modellazione UML. Aspetti strutturali. Diagramma delle classi. Classi e oggetti. Stereotipi. Classi astratte e interfacce. Relazioni tra classi. Ruoli e molteplicità. Oggetti associativi. Aggregazione e composizione. Generalizzazione. Implementazione di interfacce. Invio di messaggi. Diagrammi di collaborazione tra oggetti. Diagrammi di sequenza. Messaggi sincroni e asincroni. Notifica di eventi e callback. Gestione del tempo e timer. Aspetti comportamentali. Diagrammi di stato. Stati, eventi, transizioni e azioni. Statechart. Decomposizione and/or degli stati. Semantica delle transizioni di stato. Diagrammi di attività. Diagrammi di casi d’uso. Utilizzo di casi d’uso per pianificare i test e come ausilio nella fase di identificazione delle classi di un progetto. Attribuzione delle responsabilità e diagrammi di interazione. Oggetti attivi e thread. Componenti e loro rappresentazione. Architetture a componenti. Diagrammi di deployment. Strumenti di sviluppo integrato (es. Eclipse, NetBeans) a supporto delle attività di progettazione e implementazione. Progetto rigoroso di classi, convalida e fase di testing Sostituibilità dei tipi in una gerarchia di inheritance. Design-by-contract. Invariante di classe. Pre/post condizioni sui metodi. Formule di correttezza di Hoare. Vincoli/benefici sul cliente e sull’implementatore di una classe. Cenni ai linguaggi OCL (Object Constraint Language) e JML (Java Modeling Language). Gerarchie di classi e subcontracting. Richiami di logica (proposizionale e del primo ordine). Il linguaggio Z per la specifica modulare e rigorosa di sistemi software. Problemi di verifica. Fase di testing. Testing di unità. Junit. Design Pattern Progettare per il cambiamento. Principi open/closed, low coupling, high cohesion. Schemi risolutivi di sottoproblemi ricorrenti. Catalogo completo dei pattern GoF modellati in UML e implementati in Java. Architetture software basate su pattern. Pattern per sistemi concorrenti e distribuiti. Sviluppo sistematico di software basato su pattern. Progettazione, viste architetturali, strati middleware Progettazione e viste architetturali. Architetture per applicazioni su rete. Client/server, peer-to-peer, publish/subscribe, agenti mobili. Strati middleware e tecnologie Java. Java Socket e Java RMI. Componenti e applicazioni web/enterprise basate su J2EE. Struttura multi-strato di un’applicazione J2EE. Servlet, Java Server Pages, componenti EJB e sistema di persistenza. Cenni ai web service. Processi di sviluppo e gestione di progetti Processi evolutivi. Modello a spirale. Il processo unificato (UP). Pianificazione e controllo delle risorse. Diagrammi di scomposizione delle attività. Diagrammi di Gantt, PERT, CPM. Gestione dei rischi. Controllo di qualità di un processo di sviluppo. Casi di studio Progettazione e messa a punto di sistemi software in ambiente centralizzato e distribuito. Argomenti delle esercitazioni: Uso di strumenti software di supporto alla progettazione con UML. Sistemi di gestione delle versioni. Strumenti di debbuging/testing. Sviluppo di progetti didattici basati su UML, sui design pattern, su schemi architetturali distribuiti, su componenti. Modalità di erogazione della didattica: Lezioni frontali in aula, con metodologie tradizionali e con l’uso di trasparenze e proiettore collegato al PC. Metodi di valutazione: L’esame consiste nella verifica di progetti didattici assegnati durante le lezioni, nello sviluppo completo di un progetto finale, e in una prova orale obbligatoria. Criteri di valutazione dell’apprendimento: Raggiungimento dei risultati d’apprendimento previsti e maturazione delle competenze da acquisire. Criteri di misurazione dell’apprendimento: Voto finale Criteri di attribuzione del voto finale: Qualità del progetto realizzato e della prova orale sostenuta. Testi di riferimento e materiale didattico utilizzato e consigliato: Materiali didattici: C. Ghezzi, M. Jazaheri, D. Mandrioli. Ingegneria del Software, Seconda Edizione, Pearson Education Italia S.r.l., 2004. M. Fowler. UML Distilled: guida rapida al linguaggio di modellazione standard. Quarta edizione, Addison-Wesley. E. Gamma, R. Helm, R. Johnson, J. Vlissides, Design Patterns: Elementi per il riuso di software a oggetti, Addison-Wesley, Pearson Education Italia S.r.l., 2002. Testi di consultazione: M. Grand, Patterns in Java: A catalog of reusable design patterns illustrated by UML, Vol. 1, Wiley, 2002. I. Sommerville, Software Engineering, 9th Edition, Pearson B. Meyer, Object Oriented Software Construction, 2nd Edition, Prentice-Hall, 2000. Binato, A. Fuggetta, L. Sfardini, Ingegneria del Software: creatività e metodo, PearsonEducation Italia, 2006. L. Baresi, L. Lavazza, M. Pianciamore, Dall’idea al codice con UML 2, Pearson-Education Italia, 2006. P. Kuchana, Software architecture design patterns in Java, Auerbach Publications, CRC Press, 2004. L. Nigro. Appunti dalle lezioni di Ingegneria del Software. Orario e aule lezioni: Calendario prove valutazione: http://www.dimes.unical.it/index.php/didattica