The course, part of the ideal path starting with the "Programming" course and prosecuting with the "Software Engineering" one, aims to present some abstractions and concepts useful for the design, development and maintenance of programs large size. The focus is on the object-oriented paradigm, with particular emphasis on the process of specification, modeling of data types, and design.
Expected learning outcomes
The students must be able to apply the concepts, techniques and tools shown in the lectures to the design and development of programs of considerable size, involving a non negligible number of suitably organized data types. The student must fully understand and be able to discuss, with clear and appropriate language, his solutions and their possible criticalities, comparing them to other available solutions.
Lesson period: First semester
(In case of multiple editions, please check the period, as it may vary)
The course is centered around the design, implementation and analysis of programs according to the object oriented paradigm. To this end, the course includes both a more abstract and principled treatment of the topic, and a more practical and concrete presentation, carried out through examples based on the Java programming language.
Regarding the principles, the following are introduced and discussed:
* the use of abstractions of various levels (such as methods, abstract data types, external iteration, extension and delegation),
* some conceptual tools for reasoning about such abstractions (such as the representation invariant, abstraction function, pre/post-conditions, side effects, induction on data types ),
* some criteria for assessing the quality of the object oriented code project (such as encapsulation, data hiding, maintainability, reuse and extensibility),
* some verification techniques (such as unit tests) and debugging techniques.
Regarding the Java language, the following aspects of the language are presented:
* flow control constructs (sequence, iteration and selection),
* basic data types,
* functions (static methods),
* classes (concrete, abstract and internal),
* interfaces (with default methods),
* heredity and polymorphism,
* generic types (use and introduction to design and implementation, type and wildcard constraints).
Prerequisites for admission
Here is some preliminary knowledge that it is good to have acquired in a solid way before attending the lessons:
* basic demonstration techniques,
* elementary aspects of formal languages.
Course textbooks are:
* Barbara H. Liskov, John Vogel Guttag (2000) Program Development in Java: Abstraction, Specification, and Object-Oriented Design Addison-Wesley Professional,
There are no ongoing tests. The final test consists is focuses on the design and development of a software according to assigned specifications; the written test can be followed by an individual oral interview. The candidate must demonstrate:
* knowledge of definitions and fundamental notions regarding the aspects of object orientation and programming,
* the ability to apply this knowledge to a simple concrete case through the development of code fragments.