The course addresses principles and patterns for designing flexible and modular software subsystems. We first introduce basic design principles, and review the programming techniques in C, C++, Python and Java suitable for promoting these principles in real code. Then we introduce the notion of a design pattern as well known and tested solution to a recurring problem in a particular problem domain. Most of the course studies important design patterns together with the corresponding implementation details pertinent to C, C++, Python and Java. It is assumed that the basic pieces of knowledge from the domain of object oriented programming have been acquired on the introductory courses.
Unfortunately, the English version of the course does not offer lectures. However, you can study the course material from the reference text by Gamma, Helm, Johnson and Vlissides, and come to discuss the problems with lecturers after the regular lectures in room D330. The course covers the following sections from the text: 1, 2 (facultative), 3 except Builder, 4 except Facade and Flyweight, 5 except Chain of responsibility, Interpreter, Mediator, Memento. We suggest you to start with easy templates (Template method, Strategy, Observer, Decorator), and leave the difficult ones for the end (Visitor, Bridge, Composite).
The course includes three mandatory lab exercises (see below). The exam shall consist of problems in which you will have to demonstrate understanding of dynamic polymorphism and design solutions according to one or more of the presented principles and patterns.