ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Построение диаграмм классовДля реализации объектов используют специальные типы – классы. Класс – это структурный тип данных, который включает описание полей данных, а также процедур и функций, работающих с этими полями данных. Одним из наиболее значимых достоинств ООП является то, что большинство классов для реализации объектов не приходится разрабатывать «с нуля». Обычно классы строят на базе уже существующих, используя механизмы, реализующие определенное отношение существующего и строящего классов между собой: наследование, композицию, наполнение, полиморфное наследование. Наследованием называют отношение между классами, при котором один класс строится на базе второго посредством добавления полей и определения новых методов. При этом исходный класс, на базе которого выполняется построение, называют родительским или базовым, а строящейся класс – потомком или производным классом. При наследовании поля и методы родительского класса повторно не определяют, предусмотренный механизм наследования позволяет использовать эти компоненты класса, специально этого не оговаривая. Отношения между различными классами проекта принято иллюстрировать диаграммой отношений классов или просто диаграммой классов. Если на диаграмме отношений классов показано только отношение наследования, то такую диаграмму называют иерархией классов. На диаграмме классов наследование изображают линией со стрелкой, направленной к классу-родителю (см. рисунок 7). Рисунок 7 - Примеры иерархий классов: с одним потомком (а, в) и с двумя потомками (б) Кроме отношения между классами на диаграмме классов целесообразно бывает указать поля и методы каждого или только строящегося класса, так как это позволяет уточнить структуру разрабатываемых классов. Поля и методы перечисляют в специальных секциях уточненного обозначения класса (см. рисунок 8). Рисунок 8 -Условное обозначение класса с указанием полей и методов Композицией называют такое отношение между классами, когда один является частью второго. Физически, композиция реализуется включением в класс фиксированного количества полей, являющихся объектами другого класса. Такие поля обычно называют объектными. На диаграмме классов композицию изображают линией с ромбом на конце, подходящем к более сложному классу (см. рисунок 9). Рисунок 9 - Примеры диаграмм классов, изображающих композицию: с одним объектным полем (а) и несколькими объектными полями различных типов (б) Наполнением называют такое отношение между классами, при котором точное количество объектов одного класса, включаемых в другой класс, не ограничено и может меняться от 0 до достаточно больших значений. Физически наполнение реализуется с использованием указателей на объекты. В отличие от объектного поля, которое включает в класс точно указанное количество объектов (1 или более – при использовании массива объектов или нескольких объектных полей) конкретного класса, использование указателей позволяет включить 0 или более объектов, если они собраны в массив или списковую (линейную или нелинейную) структуру. На диаграмме классов наполнение изображают аналогично композиции, но ромб не закрашивают, показывая более слабую связь объектов классов (см. рисунок 10). Рисунок 10 - Пример диаграммы классов с наполнением Для определения отношения имеющегося и строящегося классов необходимо выполнить анализ структуры объектов предметной области, полученных в результате объектной декомпозиции. Если объекты предметной области слишком сложны, чтобы ставить им в соответствие некий простой класс, то процесс декомпозиции можно продолжить, выделяя внутри сложных объектов более простые. При этом возможны следующие варианты. 1. Внутри объекта можно выделить объект близкого назначения, но с более простой структурой и/или поведением – класс для реализации данного объекта следует строить на базе более простого, используя наследование. Если при этом объекты строящего класса отличаются от объектов базового класса некоторыми аспектами поведения, то следует изменить поведение объектов строящего класса при наследовании, используя полиморфное наследование с переопределение методов. 2. Внутри объекта можно выделить определенное количество объектов более простой структуры со своим поведением – класс конструируется объединением объектов других классов с добавлением полей и методов строящегося класса – композиция классов. 3. Внутри объекта можно выделить заранее не предсказуемое количество объектов более простой структуры со своим поведением – класс конструируется с возможностью динамического подключения объектов других классов (наполнение) и добавлением полей и методов строящегося класса. Рассмотрим два примера. Пример 4. Разработать класс для реализации объекта «Текст», который должен: · для каждого слова некоторой последовательности слов хранить его атрибуты (тип шрифта и размер букв); · определять количество слов в тексте; · добавлять слова после слов с указанными номерами; · удалять заданные слова из теста; · менять местами слова с заданными номерами; · заменять одно заданное слово на другое во всем тексте; · позволять переопределять атрибуты слова с заданным номером. Итак, реализуемый объект должен оперировать с некоторыми внутренними объектами «Словами», для которых можно определить собственное состояние и поведение. Естественно создать специальный класс TWord для реализации «Слов». Класс TText для реализации «Текста» может быть построен как с использованием композиции, так и с использованием наполнения. В первом случае он должен включать массив объектов класса TWord. Максимальное количество элементов массива должно быть определено заранее и, следовательно, ограничено (см. рисунок 11, а). При выполнении операций удаления и вставки придется сдвигать и раздвигать элементы массива. Во втором случае класс TText должен включать список объектов класса TWord (см. рисунок 11, б). Ограничения предыдущей реализации будут сняты, но реализация со списком имеет несколько большую трудоемкость, и, кроме того, при обращении к слову по номеру придется каждый раз последовательно отсчитывать нужный элемент. Выбор конкретного варианта реализации зависит от условий решаемой задачи. Рисунок 11 - Диаграммы классов для реализации объекта Текст: с композицией (а) и с наполнением (б) Пример 5. Разработать классы для реализации объектов Табулятор, Определитель корней и Определитель экстремумов из примера 3. Объекты Табулятор, Определитель корней и Определитель экстремумов отвечают за реализацию методов решения некоторых частных задач при исследовании функций. Они имеют много общего. Попробуем определить это общее. Любой объект, получив управление должен ввести диапазон изменения аргумента [a, b], решить подзадачу, вывести результаты, а затем вернуть управление меню операций. Общее поведение и поля объектов опишем в классе TMetod. Основной метод этого класса Run должен реализовывать общее поведение и обеспечивать возможность изменения элементов этого поведения (решения конкретных подзадач) для объектов классов, которые будут от него наследоваться. Решение конкретной подзадачи реализуем как внутренний метод Task, вызываемый из метода Run. Этот внутренний метод для класса TMetod определять не будем (абстрактный метод). Классы для реализации разрабатываемых объектов наследуем от TMetod, переопределяя метод Task и добавляя недостающие поля (см. рисунок 12). Рисунок 12 - Иерархия классов для реализации объектов Табулятор, Определитель корней и Определитель экстремумов При разработке программ с использованием объектного подхода часто строят диаграммы классов, на которых показывают также отношение ассоциации, которое отражает взаимодействие объектов классов между собой в процессе работы программы. Поскольку наполнение и композиция также предполагают взаимодействие, ассоциацию используют либо на ранних этапах разработки, либо, если отношение классов не подходит под определение композиции или агрегации. Ассоциация может иметь имя, каждый элемент ассоциации может иметь имя и указание множественности (см. рисунок 13). Рисунок 13 - Обозначение ассоциации: а – с указанием имени ассоциации и ее направления; б – с указанием имен ролей; в – с указанием множественности Пример 6. Разработать программу «Записная книжка», которая должна осуществлять: создание новой книжки (файла), добавление записей (фамилии, имени и телефона), поиск записей по фамилии и/или имени. По сути дела данная программа должна обеспечивать удобный интерфейс для хранения и поиска информации в некотором файле. Разработку начинаем с уточнения интерфейса. Главное меню программы в соответствии с условием задачи должно вызывать основные функции для работы с «Записной книжкой» (см. рисунок 14). Рисунок 14 - Окно главного меню Граф состояний интерфейса, отражающий процесс работы пользователя с программой, приведен на рисунок 15. Рисунок 15 - Граф состояний интерфейса: 1-4 – выбор пунктов «Открытие файла», «Добавление записей», «Поиск записей» и «Выход» соответственно; 5 – выбор пунктов «Выход» на формах «Открытие файла», «Добавление записей», «Поиск записей» При выполнении пункта «Создать или открыть книжку» на экране должно появиться окно ввода имени файла (см. рисунок 16), причем до ввода имени файла выбор прочих пунктов меню, кроме «Завершения работы», должен быть блокирован. После ввода имени файла, которое должно быть проверено с точки зрения синтаксиса имен файлов, программа будет пытаться открыть файл. Если файл с указанным именем не будет обнаружен, то программа создаст файл с таким именем. Рисунок 16 - Окно ввода имени файла При выборе пункта «Добавление записей» на экране должна появляться форма ввода записей (см. рисунок 17), которая содержит поля ввода и локальное меню. Добавление записей происходит при выборе пункта «Добавить» локального меню. После внесения всех записей пользователь должен выбрать пункт «Выход», и вновь вернуться в главное меню. Рисунок 17 - Форма ввода записей При выборе пункта «Поиск записей» на экране должна появляться форма поиска записей (см. рисунок 18, а), которая содержит поле ввода фамилии, имени, поле вывода телефона и локальное меню из 3-х пунктов. Рисунок 18 - Форма поиска записей (а) и сообщение об отсутствии данных (б) Поиск должен осуществляться по вводу фамилии и/или имени. Начало поиска по выбору пункта «Поиск». Если запись не найдена, то программа должна выдавать сообщение об отсутствии данных (см. рисунок 18, б). Если записей несколько, то доступ к следующим записям осуществляется по выбору пункта «Следующий» (см. граф состояний на рисунок 19). После завершения поиска мы вновь должны вернуться в главное меню. Рисунок 19 - Граф состояний интерфейса пункта «Поиск записей»: 1 – выбор пункта «Поиск»; 2 – выбор пункта «Следующий»; 3 – выбор пункта «Выход»; 4 – подтверждение получения сообщения об отсутствии данных. Выход из системы должен выполняться при выборе соответствующего пункта меню или при нажатии клавиши Esc. Будем считать, что каждому элементу интерфейса соответствует интерфейсный объект, полученная при этом диаграмма интерфейсных объектов – результат объектной декомпозиции интерфейсной части предметной области программы, приведена на рисунке 20. Рисунок 20 - Диаграмма объектов – результат декомпозиции программы На рисунке 21 показана диаграмма классов, реализующих соответствующие объекты. Темным показаны универсальные классы, которые были разработаны отдельно, помещены в библиотеку и могут быть использованы в других разработках. Рисунок 21 - Диаграмма классов программы Не нашли, что искали? Воспользуйтесь поиском:
|