Вводный курс по C++ и ООП со вкраплениями нетривиальных вещей
План:
- Тема 0 - Введение
- Тема 1 - Работа с памятью
- Тема 2 - Классы и объекты. Инкапсуляция
- Тема 3 - Перегрузка операторов
- Тема 4 - Наследование
- Тема 5 - Полиморфизм. Абстрактные классы и интерфейсы
- Тема 6 - RTTI, dynamic_cast
- Тема 7 - Агрегация/Композиция vs. Наследование vs. Дружественность
- Тема 8 - Исключения
- Тема 9 - Шаблонные функции и классы. SFINAE
- Тема 10 - Библиотека STL
- Тема 11 - RAII. Умные указатели
- Тема 12 - Современные стандарты С++
- Тема 13 - Qt
- Тема 14 - Win32 API, MFC
Темы и вопросы курса поясняются на примерах классов и интерфейсов проекта TaxiService. В лекциях потихоньку будет писаться эта система (впрочем, будет обозначен только каркас).
Данный проект можно рассматривать как "учебный стенд" с одним слоем упрощенной бизнес-логики для демонстрации основ ООП. Более продвинутые техники ООП рассматриваются в других курсах и на факультативных занятиях
Предметная область (domain) - служба такси.
Кратко:
- КЛИЕНТ заказывает такси по телефону (СИСТЕМА добавляет информацию по КЛИЕНТУ, если он обращается впервые)
- ОПЕРАТОР принимает звонок и формирует ЗАКАЗ, включая в него пожелания КЛИЕНТА (в виде ответов на определенный набор вопросов), пункт отправки и пункт назначения
- СИСТЕМА анализирует данные предзаказа от ОПЕРАТОРА, находит подходящего ВОДИТЕЛЯ и МАШИНУ, окончательно формирует ЗАКАЗ и отсылает смс КЛИЕНТУ с номером заказа и информацией
- ВОДИТЕЛЬ может отменить ЗАКАЗ (если КЛИЕНТ не явился); если КЛИЕНТ дважды игнорировал заказ, он добавляется в черный список
- СИСТЕМА учитывает рейтинг ВОДИТЕЛЯ и данные об активности КЛИЕНТА
- ОПЕРАТОР и ВОДИТЕЛЬ числятся сотрудниками службы, им начисляется зарплата по разным правилам
- СИСТЕМА хранит (и может отображать) информацию о всех ВОДИТЕЛЯХ, МАШИНАХ, ЗАКАЗАХ, КЛИЕНТАХ, ОПЕРАТОРАХ
- СИСТЕМА располагает некоторой ГЕОСЛУЖБОЙ, позволяющей конвертировать адрес объекта в геокоординаты и обратно, рассчитывать расстояние между объектами города, а также оптимальный маршрут (вы думаете, что будет код этого действа? наииивные... ))).
+
Демо-проект "Консольный блекджек" с дополнительными элементами:
- с++14 (auto, unique_ptr, shared_ptr, move, lambdas)
- автодокументация кода с doxygen
- юнит-тесты google test
- интеграционные тесты google mock
- директивы препроцессора
- файлы makefile
В репозитории хранится несколько релизных версий:
Вариант "Студенческий середнячок": модульная объектно-ориентированная декомпозиция, пара интерфейсов, обработка исключений, кое-какие возможности С++ новых стандартов, добавлены простейшие юнит-тесты.
Предыдущий вариант, но с добавлением умных указателей. Обязательно ознакомиться со статьей Эрба Саттера: GOTW #91 для понимания принципов ведения и передачи умных указателей в качестве параметров.
Более-менее взрослый вариант: архитектура MVP, паттерны State и Strategy, проект достаточно тестируемый и расширяемый, добавлены интеграционные тесты, некоторые решения относительно кода были приняты после написания тестов (TDD).
UML-диаграммы рисованы в крутом и удобном онлайн-редакторе yuml.me
Книги по основам С++:
- Роберт Лафоре "Объектно-ориентированное программирования в С++"
- Стивен Прата "Язык программирования С++. Лекции и упражнения"
- Бйорн Страуструп "Язык программирования С++"
Более продвинутые:
- книги Скотта Майерса (все)
- книги Эрба Саттера (все)
- Андрей Александреску "Современное проектирование на С++. Обобщенное программирование и прикладные шаблоны программирования"