- •И. А. Андрианов, д. В. Кочкин, с. Ю. Ржеуцкая
- •Учебное пособие
- •Оглавление
- •1. Основы языка 8
- •1.2.2 Простые типы данных 13
- •6. Паттерны проектирования 159
- •7. Антипаттерны 211
- •2. Работа с памятью 73
- •3. Основы объектно-ориентированного программирования 87
- •4.Обработка исключений 114
- •5. Шаблонные функции и классы. Библиотека стандартных шаблонов 130
- •9. Методы отладки и оптимизации кода 242
- •1. Основы языка
- •1.1.2 Понятие проекта
- •1.2 Простые типы данных
- •1.2.1 Понятие типа
- •1.2.2 Простые типы данных
- •1.2.3 Внутреннее представление простых типов
- •1.2.4 Ключевое слово typedef. Тип size_t
- •1.3 Константы и переменные
- •1.3.1 Литералы
- •1. Числовые константы:
- •2. Символьные константы:
- •1.3.2 Переменные
- •1.3.3 Описание переменных
- •1.4. Выражения. Преобразование типов
- •1.4.1 Операнды и операции
- •1.4.2 Приоритет операций
- •1.4.3 Преобразование типов
- •1.5 Ветвления и циклы
- •1.5.2 Циклы
- •1.6 Массивы, строки
- •1.6.1 Основные понятия
- •1.6.2 Встроенные массивы
- •1.6.3 Cтроки. Обработка строк с завершающим нулём
- •1.7 Указатели и ссылки. Связь указателей и массивов. Библиотека cstring
- •1.7.1 Понятия указателя и ссылки
- •1.7.2 Связь между массивами и указателями
- •1.7.3 Библиотека cstring
- •1.8 Использование типов vector и string
- •1.8.1 Шаблонный класс vector
- •1.8.2 Класс string
- •1.9 Структуры и объединения. Битовые поля
- •1.10.1 Понятие функции
- •1.10.2 Описание функции и прототип функции
- •1.11 Параметры функции. Способы передачи параметров
- •1.11.1 Параметры функции и глобальные переменные
- •1.11.2 Способы передачи параметров в функцию
- •1.11.3 Передача массивов в функцию
- •1.11.4 Параметры-константы
- •1.11.5 Значения параметров по умолчанию
- •1.12.1 Указатель на функцию
- •1.12.2 Функции с переменным числом параметров
- •1.12.3 Перегрузка функций
- •1.12.4 Встроенные (inline) функции
- •1.13 Рекурсивные функции
- •1.14 Пространства имён
- •1.15 Директивы препроцессора. Макросы
- •2. Работа с памятью
- •2.1 Управление выделением и освобождением памяти
- •2.1.1 Статическое и динамическое выделение памяти
- •2.1.2 Способы динамического выделения и освобождения памяти
- •2.2 Динамические структуры данных
- •2.2.1 Основные понятия
- •2.2.2 Примеры реализации динамических структур на основе указателей
- •3. Основы объектно-ориентированного программирования
- •3.1 Основные понятия ооп
- •3.2.1 Описание класса
- •3.2.2 Область видимости элементов класса. Инкапсуляция
- •3.2.3 Первые примеры
- •3.3. Конструкторы и деструкторы.
- •3.4 Указатель this
- •3.5 Перегрузка операций
- •3.6 Дружественные функции и классы
- •3.7 Статические элементы класса
- •3.8 Наследование и полиморфизм
- •3.8.1. Основные понятия
- •3.8.2 Одиночное наследование
- •3.8.3 Множественное наследование
- •3.8.4 Конструкторы и деструкторы классов-потомков
- •3.9. Полиморфизм при наследовании классов
- •3.9.1 Механизмы раннего и позднего связывания
- •3.9.2 Абстрактные классы
- •4.Обработка исключений
- •4.1 Основные понятия
- •4.2 Перехват исключений
- •4.3 Поиск обработчика исключений. Раскрутка стека.
- •4.4 Повторное возбуждение исключений
- •4.5 "Аппаратные" и "программные" исключения
- •4.6 Стандартные классы исключений
- •4.7 Спецификация исключений, возбуждаемых функцией
- •4.8 Исключения в конструкторах при наследовании
- •4.9. Исключения в деструкторах
- •5. Шаблонные функции и классы. Библиотека стандартных шаблонов
- •5.1 Шаблонные функции
- •5.2 Шаблонные классы
- •5.3 Специализация шаблонов
- •5.4 Шаблонные параметры шаблонов
- •5.6 Использование шаблонов для вычислений на этапе компиляции
- •5.5 Разработка шаблонных классов с настраиваемой функциональностью
- •5.7 Библиотека стандартных шаблонов (stl) – основные понятия
- •5.8 Последовательные контейнеры. Итераторы
- •5.9. Адаптеры контейнеров
- •5.10 Ассоциативные контейнеры
- •5.11 Алгоритмы
- •6. Паттерны проектирования
- •6.1 Порождающие шаблоны
- •6.2 Структурные шаблоны
- •6.3 Шаблоны поведения
- •6.4 Шаблон "фабричный метод" (Factory method)
- •6.5 Шаблон "одиночка" (Singleton)
- •6.6 Шаблон "итератор" (Iterator)
- •6.7 Шаблон "наблюдатель" (Observer)
- •6.8 Шаблон "пул объектов" (Object pool)
- •6.9 Шаблон "команда" (Command)
- •6. 10 Шаблон "посетитель" (Visitor)
- •6.11 Дополнительные задания
- •6.11.1 Шаблон Iterator
- •6.11.2 Шаблон Observer
- •6.11.3 Шаблоны Command и Observer
- •6.11.5 Шаблон Visitor
- •6.11.5 Разработка класса − контейнера
- •6.11.6 Оценка производительности кода
- •7. Антипаттерны
- •7.1 Программирование методом копирования и вставки (Copy-Paste Programming)
- •7.2 Спагетти-код (Spaghetti code)
- •7.3 Магические числа (Magic numbers)
- •7.4 Бездумное комментирование
- •7.5 Жесткое кодирование (Hard code)
- •7.6 Мягкое кодирование (Soft code)
- •7.7 Золотой молоток (Golden hammer)
- •7.8 Слепая вера (Blind faith)
- •7.9 Ненужная сложность (Accidental complexity)
- •7.10 Божественный объект (God Object)
- •7.11 Лодочный якорь (Boat anchor)
- •7.12 Поток лавы (Lava flow)
- •7.13 Изобретение велосипеда (Reinventing the wheel)
- •7.14 Программирование перебором (Programming by permutation)
- •8.1 Выведение типов
- •8.2 Списки инициализации
- •8.3 Улучшение процесса инициализации объектов
- •8.4 Цикл for по коллекции
- •8.5 Лямбда-функции
- •8.6 Константа нулевого указателя nullptr
- •8.7 "Умные" указатели
- •9. Методы отладки и оптимизации кода
- •9.1 Отладка кода
- •9.1.1 Основные этапы отладки
- •9.1.2 Инструменты и приёмы отладки
- •9.2 Оптимизация кода
- •9.2.1 Рекомендации по выполнению оптимизации
- •9.2.2 Методики оптимизации кода
- •Заключение
- •Библиографический список
6.11 Дополнительные задания
При выполнении данных заданий может потребоваться также материал главы 8.
6.11.1 Шаблон Iterator
Разработать итераторы для перебора символов, слов, предложений и подстрок в заданной строке. Приблизительный интерфейс класса-контейнера представлен в следующем фрагменте кода.
1. Итератор символов последовательно перебирает все символы в тексте.
2. Итератор слов перебирает все слова. Разделителем слов будет выступать символ или последовательность символов, отличных от букв.
3. Итератор предложений. Последовательно перебирает все предложения текста. Текст может быть разделен на предложения точкой, вопросительным и восклицательным знаком.
4. Итератор подстрок. Последовательно перебирает все заданные подстроки. Подстрока передается в качестве параметра в функцию begin(), соответствующую данному итератору.
class TextContainer
{
public:
CharIterator beginChar();
CharIterator endChar();
SubStringIterator beginSubString(std::string substring);
SubStringIterator endSubString(std::string substring);
WordIterator beginWord();
WordIterator endWord();
SentenceIterator beginSentence();
SentenceIterator endSentence();
};
6.11.2 Шаблон Observer
Разработать класс TextManager, позволяющий хранить и изменять некоторый текст. Данный класс, помимо возможностей хранения и изменения текста, должен хранить список наблюдателей. При изменении текста должны оповещаться все наблюдатели, которые зарегистрированы в менеджере.
Добавить наблюдателей для выполнения следующих действий при изменении текста:
1. Расчет количества слов.
2. Расчет количества вхождений заданного слова.
3. Поиск самого длинного предложения в тексте.
Наблюдатели должны получать доступ к тексту через итераторы.
6.11.3 Шаблоны Command и Observer
1. Доработать пример шаблона Command. Добавить команды:
Swap − поменять местами элементы (int index1, int index2)
Change − изменить значение элемента по индексу (int index, int value)
Команды должны поддерживать возможность отмены.
2. Добавить возможность наблюдения за изменяемым объектом (массивом) по аналогии с шаблоном Observer. В отличие от рассмотренной реализации шаблона Observer, наблюдатели должны иметь возможность реагировать на определенные типы событий. Для этого вместо одной виртуальной функции Observer::update() нужно добавить несколько виртуальных функций для каждого типа событий.
Изменение значения элементов массива Observer::valuesChanged();
Изменение порядка следования элементов Observer::orderChanged();
Удаление элемента из массива Observer::valueErased();
Добавление элемента в массив Observer::valueAdded();
Разработать классы-слушатели, которые будут реагировать на указанные события.
6.11.5 Шаблон Visitor
Разработать класс − коллекцию для объектов определенного типа (автомобили, продукты, студенты, сотрудники и так далее). На основе шаблона Visitor разработать механизм выполнения запросов к коллекции.
Разработать минимум по одному запросу каждого типа:
1. Запросы для выбора объектов с заданными характеристиками (например, выбрать всех студентов с фамилией Иванов).
2. Запрос на изменение характеристик объектов (например, изменить номер курса для всех студентов).
3. Запрос, осуществляющий расчет по характеристикам объектов − среднее, максимальное, минимальное значение (например, рассчитать средний возраст студентов).
Запросы реализуются в виде посетителей. Класс коллекции предоставляет механизм для обхода всех объектов посетителем.
За основу можно взять рассмотренный пример шаблона Visitor.
