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

Материал из Кафедра математической кибернетики
Перейти к: навигация, поиск
Строка 1: Строка 1:
 
{{DISPLAYTITLE:Проектирование больших систем на С++}}
 
{{DISPLAYTITLE:Проектирование больших систем на С++}}
 
Курс по магистерской программе Дискретные управляющие системы и их приложения. Занятия проводит [[Участник:KonovodovV|Коноводов В.А.]]
 
Курс по магистерской программе Дискретные управляющие системы и их приложения. Занятия проводит [[Участник:KonovodovV|Коноводов В.А.]]
 
Занятия в осеннем семестре 2019 г. завершены.
 
  
 
В курсе рассматриваются темы, востребованные в промышленном программировании на языке C++. Разбираются вопросы, связанные с обобщенным программированием, интеллектуальными указателями, исключениями, паттернами проектирования, тестированием и отладкой кода, и др. Отдельно разбираются возможности современного языка С++, введенные в стандартах C++11/14/17: вывод типов, семантика перемещения, rvalue-ссылки, поддержка многопоточности, лямбда-выражения и др.  
 
В курсе рассматриваются темы, востребованные в промышленном программировании на языке C++. Разбираются вопросы, связанные с обобщенным программированием, интеллектуальными указателями, исключениями, паттернами проектирования, тестированием и отладкой кода, и др. Отдельно разбираются возможности современного языка С++, введенные в стандартах C++11/14/17: вывод типов, семантика перемещения, rvalue-ссылки, поддержка многопоточности, лямбда-выражения и др.  
Строка 10: Строка 8:
  
 
[[Media: Pbscpp_content2019.pdf|Программа курса 2019(pdf)]]
 
[[Media: Pbscpp_content2019.pdf|Программа курса 2019(pdf)]]
 
==Задания по курсу==
 
Суммарная оценка за задания по курсу выставляется из 50 баллов.
 
Для студентов 421 группы задание 1 оценивается как дополнительное, вес задания 0.5.
 
 
===Задание 1===
 
Задание обязательно для всех, кроме студентов 421ой группы.
 
Срок сдачи задания: 5 ноября 2019 г. 23:59.
 
* [[Media:Pbscpp_problem1_2019.pdf|Условие]].
 
* [https://github.com/konovodov/cmc_msu_cpp_course/tree/master/problem1 Ссылка на код].
 
 
===Задание 2===
 
Задание обязательно для всех.
 
 
Срок сдачи задания для всех, кроме студентов 421ой группы: 7 декабря 2019 г. 23:59.
 
 
Студенты 421ой группы сдают это задание в рамках практикума.
 
* [[Media:Pbscpp_problem2_2019.pdf|Условие]].
 
 
== Содержание курса ==
 
'''Занятие 1.''' Вводный тест. Особенности языка C++11. Вывод типов. Ключевые слова decltype и auto. Ключевые слова override и final. Удаленные функции.
 
* [[Media: Lecture_pbscpp_1.pdf|Лекция 1]].
 
'''Занятие 2.''' Разбор задач из теста. Особенности языка C++11/14/17: псевдонимы, constexpr, структурное связывание, variadic templates, lambda-функции.
 
* [[Media: Lecture_pbscpp_2.pdf|Лекция 2]].
 
* [[Media: pbscpp_task1.pdf|Задача]]. (больше не принимается)
 
'''Занятие 3.''' Особенности lambda-функций. Неупорядоченные контейнеры hashmap/hashset. Функторы и связыватели. std::bind, std::invoke, std::apply.
 
* [[Media: Lecture_pbscpp_3.pdf|Лекция 3]].
 
* [[Media: pbscpp_task2.pdf|Задача]].(больше не принимается)
 
'''Занятие 4.''' Ссылки и копии. Алиасинг. Невладеющий std::string_view. Типы ссылок. Move-семантика. RVO.
 
* [[Media: Lecture_pbscpp_4.pdf|Лекция 4]].
 
'''Занятие 5.''' Проблемы перегрузки с универсальными ссылками. Операторы new и delete. Умные указатели. std::shared_ptr, std::unique_ptr.
 
* [[Media: Lecture_pbscpp_5.pdf|Лекция 5]].
 
* [[Media: pbscpp_task3.pdf|Задача]]. (больше не принимается)
 
'''Занятие 6.''' Указатель std::weak_ptr. Рекурсивный шаблон CRTP. Идиома PImpl.
 
* [[Media: Lecture_pbscpp_6.pdf|Лекция 6]].
 
'''Занятие 7.''' Паттерны проектирования Bridge, Command, Strategy, Singleton.
 
* [[Media: Lecture_pbscpp_7.pdf|Лекция 7]].
 
'''Занятие 8.''' Паттерны проектирования Decorator, Observer, Factory.
 
* [[Media: Lecture_pbscpp_8.pdf|Лекция 8]].
 
* [[Media: Lecture_8_test_task1.pdf|Условие задачи из теста]].
 
'''Занятие 9.''' Паттерн проектирования Visitor. Идиома Type Erasure. Диспетчеризация дескрипторов.
 
* [[Media: Lecture_pbscpp_9.pdf|Лекция 9]].
 
'''Занятие 10.''' Правило SFINAE, примеры. Способы тестирования кода. Unit-тестирование и устранение зависимостей.
 
* [[Media: Lecture_pbscpp_10.pdf|Лекция 10]].
 
'''Занятие 11.''' Mock-объекты в тестировании. Поиск проблем с помощью gdb, strace. Обработка ошибок и исключений.
 
* [[Media: Lecture_pbscpp_11.pdf|Лекция 11]].
 
* [https://github.com/konovodov/cmc_msu_cpp_course/tree/master/testing Ссылка на код про тесты с занятия].
 
* [[Media: pbscpp_task5.pdf|Задачи]].(больше не принимаются)
 
'''Занятие 12.''' Исключения в стандартной библиотеке, std::exception_ptr, идиома ValueOrError. Итераторы и iterator_traits в C++17.
 
* [[Media: Lecture_pbscpp_12.pdf|Лекция 12]].
 
* [[Media: pbscpp_tas6.pdf|Задача]]. (больше не принимается)
 
'''Занятие 13.''' Оптимизация программ на C++. Оптимизации строк, идиома COW. Оптимизация алгоритмов.
 
* [[Media: Lecture_pbscpp_13.pdf|Лекция 13]].
 
'''Занятие 14.''' Оптимизация программ на С++: функции, инструкции, размещение в динамической памяти. Дополнения: строковые литералы, идиома X macro.
 
* [[Media: Lecture_pbscpp_14.pdf|Лекция 14]].
 
* [[Media: pbscpp_task7.pdf|Задачи]]. (больше не принимаются)
 
 
== Критерии оценок ==
 
'''Таблица результатов 2019'''  [https://clck.ru/JCKum ссылка]
 
 
Экзамен по курсу письменный. Максимальная сумма баллов – 50. Баллы, полученные за выполнение домашних заданий (максимум – 50), дополнительных задач и тестов на занятиях, суммируются с баллами, полученными за экзамен.
 
 
* Оценка отлично: не менее 80 баллов
 
* Оценка хорошо: не менее 70 и не более 79 баллов
 
* Оценка удовлетворительно: не менее 55 и не более 69 баллов
 
 
[[Media: Pbscpp_exam_review2019.pdf|Примерный вариант экзаменационной работы (pdf)]]
 
  
 
== Литература ==
 
== Литература ==

Версия 15:52, 24 июня 2020

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

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

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

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

Литература

  • С. Мейерс, Эффективный и современный С++: 42 рекомендации по использованию C++11 и C++14, изд. Вильямс, М.: 2017 г.
  • Ф. Пикус, Идиомы и паттерны проектирования в современном C++. ДМК Пресс, 2019 г.
  • CppCoreGuidelines (ред. Б. Страуструп, Г. Саттер) https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines
  • Курт Гантерот: Оптимизация программ на C++. Проверенные методы повышения производительности.
  • Anthony Williams. C++ Concurrency in Action: Practical Multithreading.
  • А. Александреску, Современное проектирование на C++, изд. Вильямс, М.: 2017 г.
  • Э.Гамма, Р.Хелм, Р.Джонсон, Дж. Влиссидес, Приемы объектно-ориентированного проектирования.
  • Г. Саттер, А. Александреску, Стандарты программирования на С++. 101 правило и рекомендация.
  • Б. Страуструп, Язык программирования С++, 4-е издание.
  • Б. Страуструп, Программирование. Принципы и практика использования C++.
  • Вандевурд Д., Джосаттис Н. Шаблоны C++. Справочник разработчика.