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 parts of the text: chapter 1, chapter 2 (facultative), chapter 3 (except Builder), chapter 4 (except Facade and Flyweight), chapter 5 (except Chain of responsibility, Interpreter, Mediator and Memento). We suggest you to start with easy templates (Template method, Strategy, Observer, Decorator), and leave the difficult ones for the later study (Visitor, Bridge, Composite).
The course includes three mandatory lab exercises (see below). The exercises are to be solved at home. We shall arrange an examination of your solutions as soon as you inform us that you are ready. You need to achieve a score of at least 50\%, to be able to access the written exam (which will be held alongside our regular exam). The written exam shall consist of problems in which you will have to demonstrate understanding of dynamic polymorphism and capability to design solutions according to relevant design principles and patterns.