- •Введение
- •1 Цели и задачи курсового проектирования
- •2 Организация курсового проектирования
- •3 Задание на курсовое проектирование
- •4 Структура пояснительной записки
- •4.1 Типовая структура
- •4.2 Титульный лист
- •4.3 Лист задания
- •4.4 Раздел «Введение»
- •4.5 Раздел «Постановка задачи»
- •4.6 Раздел «Выбор метода решения»
- •5 Метод
- •5.1 Объектно-ориентированный анализ
- •5.2 Объектно-ориентированное проектирование
- •5.2.1 Диаграммы классов
- •5.2.2 Диаграммы объектов
- •5.2.3 Диаграммы состояний и переходов
- •5.2.4 Диаграммы взаимодействия
- •5.3 Объектно-ориентированное программирование
- •5.3.1 Диаграммы модулей
- •5.3.2 Диаграммы процессов
- •5.3.3 Протоколы классов
- •Часть 1. Работа с оо словарем ПрО.
- •Часть 2. Работа с crc-карточками.
- •Часть 3. Работа с диаграммой классов.
- •Часть 4. Определение модификаторов доступа, типов данных и начальных значений.
- •Часть 5. Реализация методов.
- •Часть 6. Распределение классов по модулям.
- •Часть 7. Реализация многопоточности.
- •5.3.4 Реализация модуля главной программы
- •6 Указания по оформлению материалов курсового проекта
- •6.1 Требования к оформлению пояснительной записки
- •6.2 Требования к оформлению программного продукта
- •Перечень ссылок
- •Приложение а Тематика курсовых проектов
- •Приложение б Пример оформления титульного листа
- •Приложение в Пример оформления листа задания на курсовое проектирование
- •Приложение г Пример оформления листа «Реферат»
- •Приложение д Пример оформления листа «Содержание»
- •Приложение е Пример оформления листа «Перечень обозначений, символов, единиц, сокращений и терминов»
- •Приложение ж Пример оформления Технического задания
- •Приложение з Пример оформления листинга программы Приложение г Листинги программных модулей
- •Приложение и Пример оформления экранных форм
5 Метод
В данном разделе методических указаний подробно, в соответствии с основными этапами выполнения курсового проектирования, излагается теоретический материал, а также доступно, на примерах, объясняется ОО методология разработки ПО. Все примеры данного раздела относятся к предметной области «Моделирование работы микроволновой печи», описание которой взято из [1] и приведено ниже.
Пример. Описание предметной области.
Имеется единственная кнопка управления, доступная для пользователя печи. Если дверца печи закрыта и пользователь нажмет кнопку, печь будет готовить пищу, при этом силовой элемент будет находиться под напряжением в течение одной минуты. Если пользователь нажмет кнопку во время работы печи, то время ее работы увеличиться на одну минуту. Нажатие кнопки при открытой двери не имеет никакого эффекта.
Внутри печи имеется электрическая лампочка. Во время работы печи она должна быть включена, чтобы можно было посмотреть через стекло дверцы печи и увидеть, например, что блюдо сгорело. Всякий раз, когда дверца открыта, электрическая лампочка должна гореть для того, чтобы пользователь мог видеть пищу или вымыть печь. Таким образом, лампочка горит либо при открытой двери, либо при закрытой двери и включенном силовом элементе. Если пользователь закрывает дверь, электрическая лампочка гаснет. Это нормально, если блюдо поместили в печь, но еще не нажали на кнопку.
Пользователь может приостановить процесс приготовления пищи открыванием дверцы. В этом случае время сбрасывается.
Если время истекло, то выключается как силовой элемент, так и лампочка. Тогда подается звуковой сигнал, сообщающий, что пища готова.
В реальных вариантах заданий на курсовое проектирование приводятся параметры законов распределения возникновения некоторых событий, а также требуется собрать статистику работы системы в течение некоторого времени. Исходные данные могут быть, как заданы числовыми константами и жестко прописаны в программном коде, так и быть неопределенными до момента запуска программы, в таком случае необходима организация ввода из консоли или файла. Для полноты описания добавим вышеприведенный пример некоторым дополнением.
Промежутки времени между двумя последовательными воздействиями пользователя на печь распределены нормально с математическим ожиданием 60 секунд и дисперсией 30 секунд.
Пользователь с одинаковой вероятностью может, как нажать на кнопку, так и открыть, или закрыть дверь.
Необходимо провести моделирование работы системы в течение 10 минут и собрать следующую статистику:
общее время работы силового элемента печи;
количество приготовленных блюд;
количество прерываний приготовления блюд.
На каждом шаге моделирования необходимо выводить состояние системы и происходящие события. Собранную статистику необходимо вывести на экран и в файл.
5.1 Объектно-ориентированный анализ
Объектно-ориентированный анализ системы можно провести двумя традиционными методами: методом Аббота и CRC-карточек, а также методом построения диаграмм вариантов использования.
Use-Case Diagrams. Диаграммы вариантов использования являются действенным методом анализа, относящимся к методологии UML. Варианты использования – это описание последовательности действий, которые может осуществлять система в ответ на внешние воздействия [3].
Диаграмма вариантов использования состоит из актеров, для которых система производит действие и собственно действия Use Case, которое описывает то, что актер хочет получить от системы. Актер обозначается значком человечка, а Use Case – овалом. Дополнительно в диаграммы могут быть добавлены комментарии.
Между актерами и вариантами использования могут быть различные виды взаимодействия. Основные виды взаимодействия следующие.
Простая ассоциация – отражается линией между актером и вариантом использования (без стрелки). Отражает связь актера и варианта использования.
Направленная ассоциация – то же что и простая ассоциация, но показывает, что вариант использования инициализируется актером. Обозначается стрелкой.
Наследование – показывает, что потомок наследует атрибуты и поведение своего прямого предка. Может применяться как для актеров, так для вариантов использования.
Расширение (extend) – показывает, что вариант использования расширяет базовую последовательность действий и вставляет собственную последовательность. При этом в отличие от типа отношений "включение" расширенная последовательность может осуществляться в зависимости от определенных условий.
Включение – показывает, что вариант использования включается в базовую последовательность и выполняется всегда.
Пример. Построение диаграммы вариантов использования.
На рис. 5.1 показана диаграмма вариантов использования для вышеописанной ПрО. Системой на данной диаграмме изображена микроволновая печь, а актером – человек, ее пользователь. Пользователь использует четыре варианта использования (направленная ассоциация): «Включить печь», «Выключить печь», «Приготовление пищи», «Вымыть печь». Варианты «Открыть дверь» и «Закрыть дверь» включаются в варианты «Вымыть печь» и «Приготовление пищи», кроме того в последний включаются также «Поставить блюдо», «Нажать кнопку» и «Забрать блюдо». Варианты использования, инициированные самой печью, расширяют варианты использования доступные актеру.
Рисунок
5.1 – Диаграмма вариантов использования
для предметной области «Моделирование
работы микроволновой печи»
Стоит отметить, что в системах имитационного моделирования, пользователя чаще всего имитирует некий объект, соответственно актер становится частью системы или граница системы распространяется на актера, что равнозначно.
Метод Аббота. Метод Аббота заключается в словесном анализе предметной области и получении ее словаря и объектно-ориентированного словаря. Согласно этому методу надо описать задачу на обычном языке, а потом подчеркнуть существительные и глаголы [1]. Существительные – кандидаты на роль классов, а глаголы могут стать именами методов.
Подход Аббота полезен, так как он прост и заставляет разработчика заниматься словарем предметной области. Однако он весьма приблизителен и непригоден для сколько-нибудь сложных проблем. Человеческий язык - ужасно неточное средство выражения, потому список объектов и операций зависит от умения разработчика записывать свои мысли.
Пример. ОО анализ предметной области методом Аббота.
Таблица 5.0.1 – Словарь предметной области
Существительное |
Глагол |
Прочее |
Кнопка Управление Пользователь Печь Дверца Время Работа Минута Нажатие Эффект Лампочка Стекло Блюдо Раз Пища Элемент Процесс Открывание Сигнал Количество Прерывание |
Имеется Нажимать Увеличивать Посмотреть Увидеть Сгорело Гореть Вымыть Помещать Приостановить Сбрасывать Истекать Выключать Подавать Сообщать |
Единственная Доступная Закрыта Одна Открыта Никакой Внутри Включена Всякий Электрическая Силовой Звуковой Готова |
При переходе от словаря ПрО (табл. 5.1) к ОО словарю (табл. 5.2) некоторые классы, свойства и методы можно ввести в независимости от наличия соответствующих существительных и глаголов. Так в нижеприведенной таблице выделен базовый класс электроприбора ElectricalAppliance, бытового прибора HouseholdAppliance и класс генератора случайных чисел Random.
Таблица 5.0.2 – ОО словарь предметной области
Класс/Сущность |
Свойство/Состояние |
Метод/Функция/Поведение |
Генератор случайных чисел (Random) |
|
Получить число по равномерному закону (Uniform) Получить число по нормальному закону (Normal) |
Продолжение таблицы 5.0.3
Класс/Сущность |
Свойство/Состояние |
Метод/Функция/Поведение |
Человек (Man) |
Время до воздействия (timeToAction) |
Имитировать работу (Imitate) |
Электроприбор (ElectricalAppliance) |
Состояние (state) |
Включить (On) Выключить (Off) Получить состояние (GetState) Имитировать работу (Imitate) |
Кнопка (Button) |
|
Нажать (Push) |
Спикер (Speaker) |
Время сигнала (beepTime) |
Сигнализировать (Beep) |
Силовой элемент (PowerElement) |
Время работы (workTime) |
Получить время работы (GetWorkTime) |
Лампа (Lamp) |
|
|
Таймер (Timer) |
Время (time) |
|
Дверь (Door) |
Состояние (state) |
Открыть (Open) Закрыть (Close) Получить состояние (GetState) |
Бытовой прибор (HouseholdAppliance) |
|
Имитировать работу (Imitate) |
Микроволновая печь (MicrowaveOven) |
Кнопка (button) Дверь (door) Спикер (speaker) Таймер (timer) Лампа (lamp) Силовой элемент (powerElement) Количество прерываний (interruptCount) Количество приготовленных блюд (readyCount) |
Начать приготовление пищи (StartCooking) Прекратить приготовление пищи (StopCooking) Вывести статистику (GetStatistics) |
Обратите внимание на приведенное в скобках англоязычное название классов, свойств и методов. Так как данное пособие предусматривает программирование на языке C++, который не допускает применение других национальных алфавитов, то рекомендуется уже на этапе анализа переходить к англоязычной терминологии. Следует отметить и применяемую нотацию именования. Имена классов состоят из английских терминов, начинающихся с прописной буквы и написанных слитно без пробелов, например, PowerElement, а не Power_Element и не Power_element, и не powerElement. Имена методов формируются аналогично. Имена свойств начинаются не с прописной, а с обычной буквы, так как свойства – это переменные некоего типа, например, timeToAction, а не TimeToAction. Более подробно о правилах и нотациях именования можно прочесть в соответствующей литературе [12].
Класс генератора случайных чисел Random был введен из-за желания выделить код (ответственность) из класса Man для получения времени до следующего действия timeToAction в методе Imitate. Хотя из описания ПрО и следует, что генерация случайных чисел требуется только в одном участке программы, но разработчик всегда должен думать о ее дальнейшем развитии. Так если бы потребовалось ввести класс блюд и для некоторых из них требовалось неопределенное время приготовления, то код генерации случайных чисел дублировался бы в программе, что значительно усложнило бы ее отладку, развитие и поддержку.
Обратите внимание на выделение базового класса электроприбора ElectricalAppliance. В самом начале анализа он не был бы выделен, так как в описании ПрО и соответственно в словаре ПрО о нем ничего не сказано. Но о необходимости его выделения стало бы известно при анализе с помощью следующего метода анализа.
Класс бытового прибора HouseholdAppliance введен для того, чтобы показать о возможностях множественного наследования в C++, что будет показано далее. Кроме того, если в дальнейшем понадобиться ввести, например, класс электрической плиты, то в HouseholdAppliance можно будет выделить то общее, что объединяет электроплиту и микроволновую печь (например, силовой элемент).
CRC-карточки. CRC обозначает Class-Responsibilities-Collaborators (Класс/Ответственности/Участники). Это эффективный способ анализа сценариев. Карты CRC впервые предложили Бек и Каннингхэм для обучения объектно-ориентированному программированию [2].
Карта представляет собой таблицу с заголовком и двумя столбцами. На карточках разработчик пишет сверху – название класса, базового или суперкласса, производных классов, снизу в левой половине – за что он отвечает, а в правой половине – с кем он сотрудничает. Проходя по сценарию, разработчик заводит по карточке на каждый обнаруженный класс и дописывает в нее новые пункты. При этом каждый раз анализируется, что из этого получается, и "выделяется излишек ответственности" в новый класс или переносятся ответственности с одного большого класса на несколько более детальных классов, или, возможно, передается часть обязанностей другому классу.
Т.е. это вполне нормальная ситуация, когда разработчику необходимо переделывать ОО словарь и CRC-карты несколько раз, что говорит о важности этапа анализа.
Карточки можно раскладывать так, чтобы представить формы сотрудничества объектов. С точки зрения динамики сценария, их расположение может показать поток сообщений между объектами, с точки зрения статики они представляют иерархии классов.
В таблицах 5.3-5.13 приведены примеры окончательных CRC-карт, полученных после нескольких проходов по сценарию работы ПрО.
Пример. ОО анализ предметной области методом CRC-карточек.
Таблица 5.0.4 – CRC-карточка класса Man
Man |
|
Imitate |
MicrowaveOven, Random |
Таблица 5.0.5 – CRC-карточка класса Random
Random |
|
Uniform |
|
Normal |
|
Таблица 5.0.6 – CRC-карточка класса ElectricalAppliance
ElectricalAppliance |
|
Button, Speaker, PowerElement, Lamp, Timer, MicrowaveOven |
|
On |
|
Off |
|
GetState |
|
Imitate |
|
Таблица 5.0.7 – CRC-карточка класса Button
Button |
|
ElectricalAppliance |
|
Push |
|
Таблица 5.0.8 – CRC-карточка класса Speaker
Speaker |
|
ElectricalAppliance |
|
Beep |
|
Таблица 5.0.9 – CRC-карточка класса PowerElement
PowerElement |
|
ElectricalAppliance |
|
GetWorkTime |
|
Таблица 5.0.10 – CRC-карточка класса Lamp
Lamp |
|
ElectricalAppliance |
|
|
|
Таблица 5.0.11 – CRC-карточка класса Timer
Timer |
|
ElectricalAppliance |
|
|
|
Таблица 5.0.12 – CRC-карточка класса HouseholdAppliance
HouseholdAppliance |
|
Imitate |
|
Таблица 5.0.13 – CRC-карточка класса Door
Door |
|
Open |
|
Close |
|
GetState |
|
Таблица 5.0.14 – CRC-карточка класса MicrowaveOven
MicrowaveOven |
|
ElectricalAppliance, HouseholdAppliance |
|
StartCooking |
|
StopCooking |
|
GetStatistics |
|
Если бы мы только начинали проектирование, то в ОО словаре, вероятно, не было бы класса электроприбора ElectricalAppliance, но классы Button, Speaker, PowerElement, Lamp имели бы общие свойства и методы. А при проходе по сценарию из описания ПрО, мы бы выделили часть ответственности в этот базовый класс.
В пояснительной записке студенту необходимо привести диаграмму вариантов использования и окончательные варианты словаря ПрО, ОО словаря и CRC-карт с подробными комментариями, отвечающими на следующие вопросы.
Какие классы и объекты предлагается ввести, чему они соответствуют в моделируемой предметной области?
Что является "состоянием" для объектов этих классов, набором каких параметров оно задается?
Какие сообщения должны принимать и обрабатывать объекты?
Какие информационные зависимости существуют между классами, какими общими функциями они пользуются?
