Лабораторная работа № 3-4. Разработка программ с использованием принципа единственной обязанности (SRP) Цель работы: получить навыки разработки программ с использованием принципа единственной обязанности (SRP). 3.1. Необходимые теоретические сведения Принцип единственной обязанности Принцип единственной обязанности обозначает, что каждый объект должен иметь одну ответственность и эта ответственность должна быть полностью инкапсулирована в класс. Все его поведения должны быть направлены исключительно на обеспечение этой ответственности. Автор этого принципа Р. С. Мартин [2] определяет ответственность как причину изменения и заключает, что классы должны иметь одну и только одну причину для изменений. Например, представим себе класс, который составляет и печатает отчёт. Такой класс может измениться по двум причинам: - может измениться само содержимое отчёта; - может измениться формат отчёта. Логично, что оба аспекта этих причин на самом деле являются двумя разными ответственностями. SRP говорит, что в таком случае нужно разделить класс на два новых класса, для которых будет характерна только одна ответственность. Причина, почему нужно сохранять направленность классов на единственную цель в том, что это делает классы более здоровыми. Что касается класса, приведённого выше, если произошло изменение в процессе составления отчёта - есть большая вероятность, что в негодность придёт код, отвечающий за печать. Более подробную информацию можно найти в работе [2, с. 154-158]. 3.2. Индивидуальные задания Создать консольное приложение, удовлетворяющее следующим требованиям: • • • • • • • • Использовать возможности ООП: классы, наследование, полиморфизм, инкапсуляция. Каждый класс должен иметь отражающее смысл название и информативный состав. Наследование должно применяться только тогда, когда это имеет смысл. Классы должны быть грамотно разложены по пакетам. Консольное меню должно быть минимальным. Для хранения параметров инициализации можно использовать файлы. Разработать программу решения задачи с использованием принципа единственной обязанности (SRP). Одно подгруппа решает по 2 задания из вариантов А,В и одно задания варианта С . Вариант А 1. Цветочница. Определить иерархию цветов. Создать несколько объектов-цветов. Собрать букет (используя аксессуары) с определением его стоимости. Провести сортировку цветов в букете на основе уровня свежести. Найти цветок в букете, соответствующий заданному диапазону длин стеблей. 2. Новогодний подарок. Определить иерархию конфет и прочих сладостей. Создать несколько объектов-конфет. Собрать детский подарок с определением его веса. Провести сортировку конфет в подарке на основе одного из параметров. Найти конфету в подарке, соответствующую заданному диапазону содержания сахара. 3. Домашние электроприборы. Определить иерархию электроприборов. Включить некоторые в розетку. Подсчитать потребляемую мощность. Провести сортировку приборов в квартире на основе мощности. Найти прибор в квартире, соответствующий заданному диапазону параметров. 4. Шеф-повар. Определить иерархию овощей. Сделать салат. Подсчитать калорийность. Провести сортировку овощей для салата на основе одного из параметров. Найти овощи в салате, соответствующие заданному диапазону калорийности. 5. Звукозапись. Определить иерархию музыкальных композиций. Записать на диск сборку. Подсчитать продолжительность. Провести перестановку композиций диска на основе принадлежности к стилю. Найти композицию, соответствующую заданному диапазону длины треков. 6. Камни. Определить иерархию драгоценных и полудрагоценных камней. Отобрать камни для ожерелья. Подсчитать общий вес (в каратах) и стоимость. Провести сортировку камней ожерелья на основе ценности. Найти камни в ожерелье, соответствующие заданному диапазону параметров прозрачности. 7. Мотоциклист. Определить иерархию амуниции. Экипировать мотоциклиста. Подсчитать стоимость. Провести сортировку амуниции на основе веса. Найти элементы амуниции, соответствующие заданному диапазону параметров цены. 8. Транспорт. Определить иерархию подвижного состава железнодорожного транспорта. Создать пассажирский поезд. Подсчитать общую численность пассажиров и багажа. Провести сортировку вагонов поезда на основе уровня комфортности. Найти в поезде вагоны, соответствующие заданному диапазону параметров числа пассажиров. 9. Авиакомпания. Определить иерархию самолетов. Создать авиакомпанию. Посчитать общую вместимость и грузоподъемность. Провести сортировку самолетов компании по дальности полета. Найти самолет в компании, соответствующий заданному диапазону параметров потребления горючего. 10. Таксопарк. Определить иерархию легковых автомобилей. Создать таксопарк. Подсчитать стоимость автопарка. Провести сортировку автомобилей парка по расходу топлива. Найти автомобиль в компании, соответствующий заданному диапазону параметров скорости. 11. Страхование. Определить иерархию страховых обязательств. Собрать из обязательств дериватив. Подсчитать стоимость. Провести сортировку обязательств в деривативе на основе уменьшения степени риска. Найти обязательство в деривативе, соответствующее заданному диапазону параметров. 12. Мобильная связь. Определить иерархию тарифов мобильной компании. Создать список тарифов компании. Подсчитать общую численность клиентов. Провести сортировку тарифов на основе размера абонентской платы. Найти тариф в компании, соответствующий заданному диапазону параметров. Вариант B 1. Фургон кофе. Загрузить фургон определенного объема грузом на определенную сумму из различных сортов кофе, находящихся, к тому же, в разных физических состояниях (зерно, молотый, растворимый в банках и пакетиках). Учитывать объем кофе вместе с упаковкой. Провести сортировку товаров на основе соотношения цены и веса. Найти в фургоне товар, соответствующий заданному диапазону параметров качества. 2. Игровая комната. Подготовить игровую комнату для детей разных возрастных групп. Игрушек должно быть фиксированное количество в пределах выделенной суммы денег. Должны встречаться игрушки родственных групп: маленькие, средние и большие машины, куклы, мячи, кубики. Провести сортировку игрушек в комнате по одному из параметров. Найти игрушки в комнате, соответствующие заданному диапазону параметров. 3. Налоги. Определить множество и сумму налоговых выплат физического лица за год с учетом доходов с основного и дополнительного мест работы, авторских вознаграждений, продажи имущества, получения в подарок денежных сумм и имущества, переводов из-за границы, льгот на детей и материальной помощи. Провести сортировку налогов по сумме. 4. Счета. Клиент может иметь несколько счетов в банке. Учитывать возможность блокировки/разблокировки счета. Реализовать поиск и сортировку счетов. Вычисление общей суммы по счетам. Вычисление суммы по всем счетам, имеющим положительный и отрицательный балансы отдельно. 5. Туристические путевки. Сформировать набор предложений клиенту по выбору туристической путевки различного типа (отдых, экскурсии, лечение, шопинг, круиз и т. д.) для оптимального выбора. Учитывать возможность выбора транспорта, питания и числа дней. Реализовать выбор и сортировку путевок. 6. Кредиты. Сформировать набор предложений клиенту по целевым кредитам различных банков для оптимального выбора. Учитывать возможность досрочного погашения кредита и/или увеличения кредитной линии. Реализовать выбор и поиск кредита. 7. Составить описание класса для представления времени. Предусмотреть возможности установки времени и изменения его отдельных полей (час, минута, секунда) с проверкой допустимости вводимых значений. В случае недопустимых значений полей выбрасываются исключения. Создать методы изменения времени на заданное количество часов, минут и секунд. 8. База данных heap.dat. Структура записей: номер изделия, наименование изделия, количество изделий, цена 1 изделия, стоимость. Обработка следующих запросов: - по номеру изделия выдать справку о наличии его на складе; - выдать общую стоимость всех изделий, хранящихся на складе - выдать список всех изделий c номерами в заданном интервале; - найти изделие с самой большой ценой. - выдать список изделий на складе, наименование которых начинается с заданной буквы. 9. В базе bus.dat хранятся записи, содержащие: номер маршрута, начало маршрута, конец маршрута, тип автобуса, количество автобусов на линии, номер автобазы. Обеспечить выдачу следующих справок: - определить общее число городских автобусов; - по номеру автобуса определить его маршрут; - выдать список номеров автобусов, маршруты которых проходят через заданный пункт; - выдать список маршрутов, которые обслуживает автобаза с указанным номером. 10. Клавиатурный почерк. Дан файл с данными, которые характеризуют как пользователь набирает текст. Что именно представляют из себя эти данные, необходимо придумать самостоятельно. Есть второй файл с аналогичными данными. Требуется определить, принадлежат ли данные из второго файла этому же пользователю. Другими словами, необходимо разработать теорию и программу по идентификации человека по стилю его работы на клавиатуре. 11. Расписание занятий. Дан файл со списком преподавателей, списком предметов и с данными о максимальном количество занятий в день, о количестве часов в неделю по каждому предмету. В день не может быть более одного занятия по данному предмету. Желательно занятия по данному предмету равномерно распределять на неделе. Написать программу генерации расписания занятий. Можно также учесть пожелания преподавателей. Вариант C 1. Инженерный калькулятор. Два режима ввода: встроенная клавиатура или поле ввода строки (например, 5+sqrt(sin(3*tg(4))+10^(45))). Основные требования к программе: 1) за основу взять калькулятор Windows 7 (все функции, 4 вида: инженерный, статистика, программист, обычный). При этом стараться не использовать стандартные функции (тригонометрические, возведение в степень и т.д.) 2) разбор строки с выражением, проверка на корректность, в случае ошибки, подробное описание ошибки и подсказка к устранению ошибки. Например, "Ошибка, неизвестная функция arcsn. Возможно, предполагалось arsin"; 3) нахождение определенных интегралов (не менее пяти численных методов, включая метод Монте-Карло), решение нелинейных уравнений (не менее пяти методов); 4) операции с матрицами, нахождение определителей, решение системы линейных уравнений; 5) построение графиков функций, интерполяция, сплайн, прогнозирование. 6) разрешить тонкую настройку калькулятора с выбором методов вычисления; 7) применение ООП (классы, наследование, перегрузка операторов, шаблоны) 2. Графический редактор. Требования к программе: 1) Неполный аналог графического редактора Paint в Windows 7. 2) Создание отдельного режима работы редактора для создание рисунков к геометрическим задачам (аналог программы "Живая Геометрия") 3) Нахождение численных характеристик фигур, нарисованной пользователем (например, площади). 3. Шифрование данных. Основные требования к программе: 1) Шифрование и дешифрование данных с возможностью настройки методов шифрования. Общее количество алгоритмов шифрования не менее пяти. Для реализации алгоритмов использовать собственный класс для работы с длинными числами (причем предложить два варианта такого класса в зависимости от выбора способа хранения цифр длинного числа). 2) Стеганографические алгоритмы. Скрытие данных в текстовом файле, скрытие данных в изображениях, скрытие данных в аудиофайлах. 3) Атаки на криптосистемы (в частичной или полной неизвестности). 4. Распознавание образов. Основные требования к программе: 1) Распознавание графических примитивов на изображениях (круг, квадрат, треугольник и др.) 2) Распознавание одиночных символов (буквы, цифры и др.), нарисованные пользователем. 3) Распознавание слов, состоящих из букв и цифр известного алфавита. Для тестирования алгоритмов создать класс для генерации таких слов на картинках с возможностью настройки параметров: размер букв, длина слова, шрифт, цвет, искажения и др. 4) Протестировать алгоритмы из предыдущих пунктов на реальных изображениях. Модифицировать алгоритмы для конкретных данных. 5) Распознавание лиц на фотографиях. Определение областей, в которых наиболее вероятно изображены лица. Определение данных человека по фотографии (сравнение с базой данных фото претендентов) 6) Дополнить программу некоторыми функциями программ распознавания текстов (например, FineReader). 7) По данным изображениям территорий с деревнями (вид сверху) определить количество домов. 5. Анализ алгоритмов сортировки данных. Требования к программе: 1) Реализация алгоритмов сортировки (не менее двадцати). Создание собственных классов для всех структур, применяемых в алгоритмах. Тестирование алгоритмов на различных входных данных. Построение графиков зависимостей времени от типов данных, от объема данных, от вида данных. 2) Предельные значения объема входных данных при фиксированной верхней границе времени сортировки. Многопоточное программирование. 3) Получение алгоритмы выбора наиболее подходящего алгоритма сортировки для конкретных данных. 6. Работа с текстом. Основные требования к программе: 1) Создать текстовый редактор с базовыми функциями: работа с несколькими файлами, автоматическое сохранение черновиков, поиск с настройками (замена, регистр, неточное совпадение), настройка представления текста, изменение кодировки и др. 2) Поиск по тексту реализовать по нескольким алгоритмам, создав для них собственные классы. 3) Возможность определять стиль данного текста (научный, публицистический и др.). Разделение данного текста на фрагменты различного стиля. 4) Определение автора данного текста, если дана база текстов нескольких авторов. 5) Определение уникальности (в %) данного текста в сравнении с базой текстов. Понятие уникальности определить самостоятельно (несколько вариантов). Выявить наиболее эффективное определение для данной задачи. 6) Проверка данного текста на орфографические и пунктуационные ошибки с возможностью автоматического исправления. 7) Поиск одинаковых слов в одном предложении или близких предложениях с заменой на синонимы. Возможность автоматической замены числа из цифр на число из слов. 8) Подбор рифмы для данного фрагмента стихотворения с пропущенным словом. 7. Чат. Основные требования к программе: Работа в локальной сети. Регистрация пользователей (администратор, модератор, пользователь). Возможность загрузки фото пользователя. Вывод списка онлайн-пользователей, возможность просмотра учетных данных пользователя. 5) История сообщений пользователя (хранится на клиенте). История сообщений с модератором хранится и на сервере. 6) Возможность блокировки пользователя модераторов на указанное время. 7) Настройка представления текста (шрифты, цвет и т.д.). 8) Возможность автоматического транслита (например, "привет" в "privet"). 9) Возможность обмена файлами между пользователем. 10) Шифрование данных. 11) Приватная беседа, создание комнаты для нескольких пользователей. 12) Автоматическая замена запрещенных слов на ********. 13) Автоматическая блокировка за спам (количество сообщений в единицу времени превысило лимит). 8. Моделирование биологических систем. Основные требования к программе: 1) 2) 3) 4) 1) Реализация игры "Жизнь". Классификация различных начальных состояний игры. 2) Моделирование взаимодействия популяций с различными характеристиками. Приведем пример для двух популяций: на плоскости расположены две группы точек (красные и синие). Каждая точка характеризуется несколькими числовыми показателями (возраст, сила, здоровье, смелость, скорость и др.). Группы движутся по определенным правилам, например, одна (травоядные) в сторону некоторой области на карте (место нахождение пищи). Другая (хищники) в сторону центра тяжести группы травоядных. В случае, когда две точки из разных групп сходятся достаточно близко (менее данного числа), происходит подсчет количества точке вокруг них в окружности данного радиуса. Если количество хищников превосходит количества травоядных, то точка либо отдаляется от хищников, либо происходит схватка, результат которой зависит от здоровья, смелости, возраста, силы противников и случайных факторов. Программа моделирует данное взаимодействие с целью определения различных зависимостей. Например, соотношения размеров популяции и суммарного показателя силы популяции и исхода взаимодействия. 3) Моделирование взаимодействия произвольного количества популяций. Отношения между популяциями: вражеские, дружеские, нейтральные. 4) Моделирование популяций, в каждой из которых есть лидер, от поведения которого зависит состояние популяции. Введите в рассмотрение области на карте, нахождение в которых позволяет популяции аккумулировать здоровье и силу. 5) Моделирование взаимодействия популяций по дифференциальным уравнения (модель Лотки-Вольтерра и др.). 9. Танки. Основные требования к программе: 6) Игра по сети или локально. Если локально, то с возможностью игры двух человек в команде с танками компьютера против другой команды из нескольких танков компьютера. 7) На карте периодически появляются бонусы (здоровье, снаряды, скорость и др.). Периодичность и место появление (например, чаще около противника) зависит от сложности раунда. 8) Доступна возможность создавать собственную карту для игры. 9) Танк компьютера может играть в нескольких стилях. Например, "боязливый" старается стрелять издали и собирать побольше бонусов, "контуженный" начинает разбивать стены или выдвигается в атаку при любом количестве танков противника впереди. 10) Кроме прохождения игры по сценариям доступен режим Survival. 11) В процессе игры танк зарабатывает очки, которые можно потратить на покупку новой модели танка или улучшение показателей модели текущей версии. 12) Возможность сохранения/загрузки игры. 13) Возможность запуска игры без участия танка человека и анализ процесса игры с точки зрения биологических популяций. Сбор и анализ статистики должен привести к решению задачи прогнозирования исхода игры по начальным данным. 10. Морской порт. Требуется создать компьютерную модель обслуживания потока заявок на разгрузку, поступающих от грузовых судов (сухогрузов и танкеров), прибывающих в морской порт. Грузовые суда прибывают в порт согласно расписанию, но возможны опоздания и досрочные прибытия. Расписание включает день и время прибытия, название судна, вид груза и его вес, а также планируемый срок стоянки в порту для разгрузки. Для разгрузки судов в порту используются три вида разгрузочных кранов, соответствующих трем видам грузов: сыпучим и жидким грузам, контейнерам. Число разгрузочных кранов каждого вида ограничено, так что поступающие заявки на разгрузку одного вида груза образуют очередь. Длительность разгрузки судна зависит от вида и веса его груза, а также некоторых других факторов, например, погодных условий. Любой дополнительный (сверх запланированного срока) день стояния судна в порту (из-за ожидания разгрузки в очереди или из-за задержки самой разгрузки) влечет за собой выплату штрафа (например, 2 тыс. у.е. за каждый дополнительный день простоя судна). При моделировании прибытия судов отклонение их от расписания рассматривается как случайная величина с равномерным распределением в некотором интервале (например, от -2 до 9 дней). Еще одной случайной величиной, изменяющейся в фиксированном диапазоне (например, от 0 до 12 дней), является время задержки окончания разгрузки судна по сравнению с обычным (зависящим только от вида груза и его веса). Цель моделирования работы морского порта – определение для заданного расписания прибытия судов минимально достаточного числа кранов в порту, позволяющего уменьшить штрафные суммы. Период моделирования – месяц, шаг моделирования – 1- 3 дня. В параметры моделирования следует включить расписание прибытия судов, количество кранов каждого вида, диапазоны разброса случайных величин (отклонения от расписания прибытия и отклонения от обычного времени разгрузки), а также шаг моделирования. Визуализация моделируемого процесса должна предусматривать показ очередей у разгрузочных кранов, приход судов в порт и их отход после разгрузки. Должен быть показан также список произведенных разгрузок, в котором указывается название разгруженного судна, время его прихода в порт и время ожидания в очереди на разгрузку, время начала разгрузки и ее продолжительность. По окончании моделирования должна быть выведена итоговая статистика: число разгруженных судов, средняя длина очереди на разгрузку, среднее время ожидания в очереди, максимальная и средняя задержка разгрузки, общая сумма выплаченного штрафа. 11. Класс CPluginsSettings хранит пути к директориям, в которых могут находиться подключаемые модули. Класс управления подключаемыми модулями CPluginManager связан с CPluginsSettings. Модули входят в состав динамической библиотеки, содержащей доступные извне функцию получения количества подключаемых модулей GetPluginsCount и функцию GetPlugin с параметром типа Integer, которая возвращает экземпляр модуля IPlugin. а. Работа с динамической библиотекой состоит из трех шагов: загрузка библиотеки, получение функции по ее имени, вызов функции. Добавьте в модель класс динамической библиотеки CDynamicLibrary, с операцией получения указателя на библиотечную функцию по ее имени GetFunction. б. Одними из самых популярных считаются модули, добавляющие в плеер возможность построения визуального ряда для композиций и отображения текста песен. Добавьте в модель соответствующие модули CVisualizationPlugin и CSongLyricsPlugin. в. Известно, что библиотека подключаемых модулей предоставляет неизменный набор функций, поэтому можно применить паттерн Wrapper к API библиотеки, реализуемый с помощью класса CPluginDll. Реализуйте и сравните два подхода: через уточнение класса CDynamicLibrary, и с помощью агрегации. 12. На структурной диаграмме (рис. 1) показан фрагмент структуры программы построения отчета. Программа читает записи данных recs из файла с именем iname, рассчитывает таблицу рядов показателей rows и записывает их в файл с именем oname. Имена файлов передаются программе в параметрах. Заголовок отчета hdr содержит названия отчета и показателей. Рис.1 а. Перечислите модули, показанные на представленной диаграмме. Добавьте на диаграмму недостающие один или несколько модулей построения отчета, используя критерий сокрытия информации Information Hiding. б. Преобразуйте программу в сервис с веб-интерфейсом WebUI и программным интерфейсом RESTService. Каким образом следует реализовать в сервисе построение отчета по базе данных? Построение другого отчета? Контрольные вопросы 1. Объясните назначение принципов объектно-ориентированного проектирования SOLID. 2. Перечислите принципы, входящие в SOLID. 3. Сформулируйте принцип единственной обязанности. Объясняете основную идею, лежащую в основе этого принципа, приведите пример использования.