SOFTWARE ENGINEERING A - L

Academic Year 2022/2023 - Teacher: EMILIANO ALESSIO TRAMONTANA

Expected Learning Outcomes

General goals described according to the expected learning results. 

1. Knowledge and understanding: the student will have knowledge on object-oriented mechanisms, the modularity issues, the development process. 

2. Applying knowledge and understanding: the student will be able to design, document, and implement object-oriented software systems, will be able to recognise the developer roles, and will be able to implement tests for assessing the code. 

3. Making judgements: the student will be able to analyse the modularity of software systems. 

4. Communication skills: the student will be able to describe software components using a proper technical language.

5. Learning skills: the student will be able to solve the typical problems faced during the design and implemntation, by studying, analysing and using novel object-oriented technologies, according to the general principles given. 

Course Structure

Frontal lessons.

Should remote teaching be needed, then some adjustements to the above might be introduced, while honouring the programme outlined in the syllabus.

Required Prerequisites

Fundamentals of programming in C, C++ or Java

Detailed Course Content

Software development processes, such as waterfall, evolutive and agile (spiral, XP, Scrum), activities and their timing. Requirement engineering: gathering and organising requirements. UML notation: use cases, activities, states, classes, sequences and collaboration diagrams. Brief introduction on code repositories and versioning: Git.

Object oriented design, inheritance and polymorphism. Quality issues. Design Patterns are described by means of objectives, contexts, problems solved, examples, solution with diagrams and code: Singleton, Factory Method, Prototype, Template Method, Adapter, Bridge, Composite, Decorator, Facade, Chain of Responsibility, Mediator, Observer, State, Command. 

Refactoring techniques.

Stream Java and parallelism.

Software metrics and software evolution.

Software validation by means of testing. 

Textbook Information

  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.

Course Planning

 SubjectsText References
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]

Learning Assessment

Learning Assessment Procedures

A written part having several questions, some with exercises, and an oral part.

Should conditions arise, a remote exam could be performed.