Проектирование больших систем на С++ — различия между версиями

Материал из Кафедра математической кибернетики
Перейти к: навигация, поиск
Строка 68: Строка 68:
 
* [https://mks2.cs.msu.ru/root/pbs_task_2_2025 Задание 2]
 
* [https://mks2.cs.msu.ru/root/pbs_task_2_2025 Задание 2]
  
'''Занятие 8.''' Паттерны проектирования Decorator, Observer, Factory Method, Visitor.
+
'''Занятие 8.''' Паттерны проектирования Observer, Factory Method, Abstract Factory, Visitor, Adapter.
 
* [https://disk.yandex.ru/i/2t-AOTkblnoIUA Лекция 8]
 
* [https://disk.yandex.ru/i/2t-AOTkblnoIUA Лекция 8]
 +
 +
'''Занятие 9.''' Паттерны проектирования Facade, Proxy, Builder, Composite, Template Method, Chain of Responsibility
 
* TODO: добавить примеры использования паттернов в реальных проектах с открытым исходным кодом. Реструктурировать презентации: сначала порождающие паттерны, потом структурные и поведенческие. Добавить больше паттернов: Abstract Factory, Builder, Prototype; Adapter, Composite, Facade, Flyweight, Proxy; Chain of responsibility, Interpreter, Mediator, Memento, State, Template Method.
 
* TODO: добавить примеры использования паттернов в реальных проектах с открытым исходным кодом. Реструктурировать презентации: сначала порождающие паттерны, потом структурные и поведенческие. Добавить больше паттернов: Abstract Factory, Builder, Prototype; Adapter, Composite, Facade, Flyweight, Proxy; Chain of responsibility, Interpreter, Mediator, Memento, State, Template Method.
  
'''Занятие 9.''' Идиома TypeErasure. Решение проблем перегрузки универсальных ссылок. Диспетчеризация дескрипторов. Правило SFINAE.
+
'''Занятие 9 (2024).''' Идиома TypeErasure. Решение проблем перегрузки универсальных ссылок. Диспетчеризация дескрипторов. Правило SFINAE.
 
* [https://disk.yandex.ru/i/6Ggf49W6ABX9Ag Лекция 9 (deprecated)]
 
* [https://disk.yandex.ru/i/6Ggf49W6ABX9Ag Лекция 9 (deprecated)]
  
'''Занятие 10.''' Обработка исключений. Гарантии безопасности исключений. Неопределенное поведение.
+
'''Занятие 10 (2024).''' Обработка исключений. Гарантии безопасности исключений. Неопределенное поведение.
 
* [https://disk.yandex.ru/i/A0z1X7NJZLPNFQ Лекция 10 (deprecated)]
 
* [https://disk.yandex.ru/i/A0z1X7NJZLPNFQ Лекция 10 (deprecated)]
  
'''Занятие 11.''' Тестирование кода, unit-тестирование, устранение зависимостей. Google C++ Testing Framework.  
+
'''Занятие 11 (2024).''' Тестирование кода, unit-тестирование, устранение зависимостей. Google C++ Testing Framework.  
 
* [https://disk.yandex.ru/i/VX2GqMOB9t76wA Лекция 11 (deprecated)]
 
* [https://disk.yandex.ru/i/VX2GqMOB9t76wA Лекция 11 (deprecated)]
 
* [http://google.github.io/googletest/ Документация по googletest]
 
* [http://google.github.io/googletest/ Документация по googletest]
  
'''Занятие 12.''' Отладка и дебаг кода. Оптимизация программ на C++. Строки.
+
'''Занятие 12 (2024).''' Отладка и дебаг кода. Оптимизация программ на C++. Строки.
 
* [https://disk.yandex.ru/i/gzYOfpC0JfJPJw Лекция 12 (deprecated)]
 
* [https://disk.yandex.ru/i/gzYOfpC0JfJPJw Лекция 12 (deprecated)]
  
'''Занятие 13.''' Оптимизация алгоритмов, функций, памяти. Плотная упаковка полей. Бинарная сериализация данных. Protobuf.
+
'''Занятие 13 (2024).''' Оптимизация алгоритмов, функций, памяти. Плотная упаковка полей. Бинарная сериализация данных. Protobuf.
 
* [https://disk.yandex.ru/i/A39zehIlyOn3qg Лекция 13 (deprecated)]
 
* [https://disk.yandex.ru/i/A39zehIlyOn3qg Лекция 13 (deprecated)]
  
'''Занятие 14.''' Новые стандарты языка C++20 и C++23. Корутины, концепты, ranges library.
+
'''Занятие 14 (2024).''' Новые стандарты языка C++20 и C++23. Корутины, концепты, ranges library.
 
* [https://disk.yandex.ru/d/8efRlJsZ9ZFA2g Презентации докладов (deprecated)]
 
* [https://disk.yandex.ru/d/8efRlJsZ9ZFA2g Презентации докладов (deprecated)]
  

Версия 07:15, 19 октября 2025


Занятия проводятся по вторникам шестой парой (в 18:00) ДИСТАНЦИОННО, ссылка на видеоконференцию публикуется в чате в Telegram

Курс по магистерской программе Дискретные управляющие системы и их приложения. Занятия проводит Владимир Владимирович Жуков.

В курсе рассматриваются темы, востребованные в промышленном программировании на языке C++. Разбираются вопросы, связанные с метапрограммированием, умными указателями, исключениями, паттернами проектирования, тестированием, отладкой кода и др. Отдельно разбираются возможности современного языка С++, введенные в стандартах C++11/14/17/20: вывод типов, семантика перемещения, rvalue-ссылки, поддержка многопоточности, лямбда-выражения и др.

В задачи курса входят актуализация студентами знаний языка С++ и ознакомление с современными принципами проектирования больших систем с использованием языка C++.

На занятиях предполагается разбор примеров использования конструкций языка и применения рассматриваемых методов проектирования, а также проведение промежуточных небольших тестов-контрольных.

Программа курса (pdf)

Занятия в 2025 г.

  • Таблица результатов
  • Чат в Telegram
  • Первое занятие состоится 2 сентября в 18:00 в ауд. 504.
  • Следующие задания проводятся дистанционно.
  • Досрочный экзамен: DD.12.2024 HH:MM (ауд. N1)
  • Основной экзамен: DD.01.2025 HH:MM (ауд. N2)

Экзамен

Экзамен по курсу письменный. Максимальная сумма баллов за экзаменационную работу – 54.

  • Оценка отлично: не менее 40 баллов
  • Оценка хорошо: не менее 30 и не более 39 баллов
  • Оценка удовлетворительно: не менее 20 и не более 29 баллов

Пример экзаменационного варианта (pdf)

Содержание курса

Занятие 1. Введение. Организационные вопросы. Вводный тест. Стиль кодирования.

Занятие 2. Категории выражений в C++. Вывод типов параметров шаблонов и auto. Некоторые особенности C++11 (универсальная инициализация, константные выражения, шаблоны с переменным числом аргументов и др.).

Занятие 3. Функциональное программирование в C++. Хеш-таблицы. Новые возможности C++17 (инициализация в условных выражениях, std::optional, std::string_view).

Занятие 4. Семантика перемещения в C++.

  • Лекция 4
  • Запись лекции
  • TODO на 2026 год: устранить повторения информации в лекциях 2-4. Скукота получается, если одно и то же повторяется. Как будто лекции Машечкина какие-то.

Занятие 5. Операторы new и delete. Умные указатели. Управление владением памяти.

Занятие 6. Идиомы в C++. Идиома CRTP. Шаблон std::enable_shared_from_this. Умный указатель boost::intrusive_ptr. Идиома PImpl. Идиома Type Erasure.

Занятие 7. Паттерны проектирования в C++. Паттерны проектирования Bridge, Command, Singleton, Strategy, Decorator.

Занятие 8. Паттерны проектирования Observer, Factory Method, Abstract Factory, Visitor, Adapter.

Занятие 9. Паттерны проектирования Facade, Proxy, Builder, Composite, Template Method, Chain of Responsibility

  • TODO: добавить примеры использования паттернов в реальных проектах с открытым исходным кодом. Реструктурировать презентации: сначала порождающие паттерны, потом структурные и поведенческие. Добавить больше паттернов: Abstract Factory, Builder, Prototype; Adapter, Composite, Facade, Flyweight, Proxy; Chain of responsibility, Interpreter, Mediator, Memento, State, Template Method.

Занятие 9 (2024). Идиома TypeErasure. Решение проблем перегрузки универсальных ссылок. Диспетчеризация дескрипторов. Правило SFINAE.

Занятие 10 (2024). Обработка исключений. Гарантии безопасности исключений. Неопределенное поведение.

Занятие 11 (2024). Тестирование кода, unit-тестирование, устранение зависимостей. Google C++ Testing Framework.

Занятие 12 (2024). Отладка и дебаг кода. Оптимизация программ на C++. Строки.

Занятие 13 (2024). Оптимизация алгоритмов, функций, памяти. Плотная упаковка полей. Бинарная сериализация данных. Protobuf.

Занятие 14 (2024). Новые стандарты языка C++20 и C++23. Корутины, концепты, ranges library.

Литература

Основная

  • С. Мейерс, Эффективный и современный С++: 42 рекомендации по использованию C++11 и C++14, изд. Вильямс, М.: 2017 г.
  • Ф. Пикус, Идиомы и паттерны проектирования в современном C++. ДМК Пресс, 2019 г.
  • CppCoreGuidelines (ред. Б. Страуструп, Г. Саттер) https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines
  • Курт Гантерот: Оптимизация программ на C++. Проверенные методы повышения производительности. М.:Диалектика, 2017 г.

Дополнительная

  • Klaus Iglberger. C++ Software Design: Design Principles and Patterns for High-Quality Software. O'Reilly Media; 1st edition. 2022.
  • Anthony Williams. C++ Concurrency in Action: Practical Multithreading.
  • А. Александреску, Современное проектирование на C++, изд. Вильямс, М.: 2017 г.
  • Э.Гамма, Р.Хелм, Р.Джонсон, Дж. Влиссидес, Приемы объектно-ориентированного проектирования.
  • Г. Саттер, А. Александреску, Стандарты программирования на С++. 101 правило и рекомендация.
  • Б. Страуструп, Язык программирования С++, 4-е издание.
  • Б. Страуструп, Программирование. Принципы и практика использования C++.
  • Вандевурд Д., Джосаттис Н. Шаблоны C++. Справочник разработчика.
  • Курс Основы C++ от Академии Яндекса.
  • Документация по Google Test.
  • Документация protobuf.
  • Yandex C++ Style Guide.
  • Google C++ Style Guide.