русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Отношения


Дата добавления: 2013-12-24; просмотров: 1500; Нарушение авторских прав


Типы классификаторов

Классификаторы

Статическое представление модели

Основные элементы статического представления – классификаторы и их отношения.

Классификатор – это дискретная концепция модели, которая обладает индивидуальностью, состоянием, поведением и находится в определенных отношениях с другими элементами модели. Существует три основных типа классификаторов: классы, интерфейсы и типы данных. Остальные типы классификаторов выражают концепции, относящиеся к поведению, окружению или структуре реализации системы. Типы классификаторов приведены в таблице № 2.

Таблица № 2

Классификатор Функция Нотация
Класс (Class) Концепция моделируемой системы
Интерфейс (Interface) Именованный набор операций, характеризующих некоторое поведение
Тип данных (Data type) Дескриптор набора примитивных значений, не обладающих индивидуальностью (например, целое число) Имя типа данных
Актант (Actor) Пользователь системы
Класс в определенном состоянии (Class-in-state) Класс, который может находиться только в данном состоянии
Роль классификатора (Classifier role) Классификатор, используемый определенным образом в кооперации Имя роли
Компонент (Component) Физическая часть системы
Узел (Node) Вычислительный ресурс
Сигнал (Signal) Асинхронное сообщение между объектами
Подсистема (Subsystem) Некий блок системы, обладающий спецификацией, программной реализацией и индивидуальностью. Является разновидностью пакета
Вариант использования (Use case) Спецификация поведения системы или ее части при взаимодействии с актантами

Класс описывает множество объектов со сходной структурой, поведением и отношениями. Нотация класса выглядит как прямоугольник с разделами для имени класса, атрибутов и операций.



Абонемент Имя класса
Серия: ТекстоваяСтрока Номер: ЦелоеЧисло УровеньСкидки: Категория Атрибуты
РассчитатьСтоимость(): Денежный Зарезервировать (Серия: ТекстоваяСтрока, КлассОбслуживания: КатегорияМеста) ЗавершитьРаботу() Операции

Рис. 4. Нотация класса

Имя класса должно быть уникальным в пределах пакета. Имя класса записывается по центру раздела имени полужирным шрифтом и должно начинаться с заглавной буквы. Рекомендуется в качестве имен классов использовать существительные, записанные без пробелов.

Атрибут класса служит для представления отдельного свойства или признака, который является общим для всех объектов данного класса. Каждому атрибуту должна соответствовать отдельная строка текста. Общий формат записи атрибута:

<видимость><имя>[кратность]:<тип><значение-по-умолчанию>

Операции – это процессы, реализуемые некоторым классом. Между операциями и методами существует очевидное соответствие. Обычно термины «операции» и «методы» используют как взаимозаменяемые, однако бывают ситуации, когда их полезно различать. Основное различие между операцией и методом состоит в том, что операция представляет собой вызов некоторой процедуры, в то время как метод является телом процедуры. Обычно эти два понятия различают, когда имеют дело с полиформизмом.

Полный синтаксис операций в языке UML выглядит следующим образом:

<видимость><имя>(<список-параметров>):<выражение_возвращающее_зна-чение_типа>{<строка_свойств>}

где:

– <видимость> может принимать одно трех значений:

«+» - общедоступная (public),

«#» – защищенная (protected),

«-» - закрытая (private);

– <имя> - строка символов;

– разделенные запятой параметры, синтаксис которых аналогичен синтаксису атрибутов:

<направление><имя>:<тип><значение-по-умолчанию>

Здесь <направление> применяется, чтобы показать характер использования параметра: для входа (in), выхода (out) или в обоих направлениях (inout). По умолчанию параметр рассматривается как входной;

– <выражение_возвращающее_значение _типа> - список разделенных запятой значений типов. Большинство разработчиков использует только один тип возвращаемого значения, но допускается использование и нескольких таких типов;

– <строка_свойств> - значения свойств, которые применяются к данной операции.

Пример записи операции для счета клиента: +показатьСостояние(дата:Дата): Деньги

У класса может быть ноль и более классов - прямых предков (суперклассов) и несколько классов - прямых потомков (подклассов). Класс наследует поведение и состояние от прямых и прочих предков и определяет при этом состояние и поведение своих прямых и косвенных потомков. Класс обладает уникальным именем в рамках своего контейнера. В качестве такого контейнера обычно выступает пакет или другой класс. У класса есть также видимость, которая определяет, как он может использоваться другими классами, находящимися вне данного контейнера. Кроме того, класс обладает множественностью, указывающей какое количество его экземпляров может существовать в системе одновременно.

Классы могут существовать на нескольких уровнях: аналитическом уровне, уровне проектирования и уровне реализации. На уровне анализа класс представляет собой логическую концепцию предметной области. На уровне проектирования – отражает основные проектные решения по локализации информации и распределению функциональности. При реализации в программном коде класс принимает форму, максимально подходящую для отображения в выбранном языке программирования.

Интерфейс служит для спецификации таких элементов модели, которые видимы извне, но их внутренняя структура остается скрытой от пользователей. Он является классификатором и характеризует только ограниченную часть поведения моделируемой сущности. В контексте языка UML интерфейс является специальным случаем класса, у которого имеются только операции и отсутствуют атрибуты. Применительно к диаграммам классов интерфейсы определяют совокупность операций, которые обеспечивают необходимый набор сервисов или функциональности для акторов. Интерфейсы не могут содержать ни атрибутов, ни состояний, ни направленных ассоциаций. Они содержат только операции без указания особенностей их реализации. Формально интерфейс эквивалентен абстрактному классу без атрибутов и методов с наличием только абстрактных операций.

Тип данных – описание простых значений, у которых нет индивидуальности (т.е. которые не могут существовать независимо), например: числа, строки и нумерованные значения (перечисления). В метамодели UML типы данных используются для объявления типов атрибутов класса. Они записываются в форме строк текста на диаграммах и не имеют отдельного значка «тип данных».

Для определения различных типов данных в языке UML используются различные конструкции: целое число (Integer), строка (String), имя (Name), булевский тип (Boolean), кратность (Multiplicity), тип видимости (VisibilityKind), выражение (Expression), выражение-процедура (ProcedureExpression) и др.

Типы данных, используемые в описании языка UML, могут отличаться от типов данных, которые определяет разработчик для своей модели на языке UML. В этом случае типы данных будут являться частным случаем или экземплярами метакласса «Типы данных», который определен в метамодели. При задании типа данных наиболее часто применяется неформальная конструкция, получившая название «перечисление».

Отношения между классификаторами включают в себя ассоциацию, обобщение, реализацию и различные виды зависимостей, в том числе поток и использование (таблица № 3).

Таблица № 3

Типы отношений

Отношение Функция Нотация
Ассоциация (Association) Описание связей между классами. Ассоциация может сопровождаться стрелкой на конце (концах), показывающей направление навигации (однонаправленная или двунаправленная ассоциация). Если ассоциация не имеет стрелок навигации, то это означает, что либо направление навигации неизвестно, либо ассоциация является двунаправленной.  
Обобщение (Generalization) Отношение между общим описанием и более специфическими его разновидностями. Используется при наследовании.  
Реализация (Realization) Отношение между спецификацией и ее реализацией.  
Зависимость (Dependency) Отношение, существующее между двумя элементами модели.  

Ассоциация представляет собой упорядоченный список из двух или более классификаторов с разрешенными повторениями. Наиболее часто встречается бинарная ассоциация, т.е. ассоциация между одной парой классификаторов.

Конкретный экземпляр ассоциации называется связью (link). Связь соединяет упорядоченный список объектов, каждый из которых относится к определенному классу. Связи представляют собой часть состояния системы. Они не существуют независимо от объектов, а, напротив, получают от них индивидуальность. Связи образуют основу, соединяющую воедино все части системы.

С концептуальной точки зрения ассоциации отличаются от классов, к которым относятся. На практике они реализуются как указатели на задействованные в ассоциации классы. Каждая связь ассоциации с классом называется полюсом ассоциации. Полюса обладают именами (именами ролей), видимостью и множественностью. В общем случае множественность (кратность) указывает нижнюю и верхнюю границы количества объектов, которые могут участвовать в ассоциации. При этом символ «*» означает неограниченную множественность, «1» – единичное значение. Диапазон значений в общем случае задается в виде «n0..n1», где n0 - нижняя граница диапазона, а n1 – верхняя граница. На практике наиболее распространенным диапазоном является «0..1» (ноль или единица).

Таким образом, полюса ассоциации имеют различное значение, даже если находятся в пределах одного класса. Это свидетельствует о том, что ассоциация не симметрична (за исключением некоторых случаев), и ее полюса не взаимозаменяемы.

Нотация для бинарной ассоциации выглядит как сплошная линия, соединяющая два класса. Имя ассоциации пишется у этой линии, а имена ролей и множественность обозначаются у ее полюсов. Для того, чтобы показать наличие навигации по ассоциации в одном направлении и ее отсутствие в обратном направлении, в проектировании используется навигационный значок (стрелка).

Данная нотация отражает ассоциативную связь между конкретной поездкой на транспорте («Поездка») и проездным билетом («Проездной билет») в условиях неограниченной множественности поездок (*) и приобретении новых проездных билетов по мере окончания срока действия предыдущих.

Рис. 5. Нотация для ассоциации

В случае, если ассоциация обладает собственными атрибутами, она является классом и носит название класс-ассоциации.

В данном случае изображен класс-ассоциация, отражающий пожертвования физического лица организации («Уровень пожертвований») Пожертвования – это отношение типа «многие-ко-многим». Человек может делать пожертвования разным организациям, а организация может принимать пожертвования от разных людей. Ежегодный и прижизненный размер пожертвований не является атрибутом ни для организации, ни для человека, так как ассоциация представляет собой отношения типа «множество-множество». Таким образом, они будут атрибутами самой ассоциации.

Рис. 6. Класс-ассоциация

Иногда из общего множества объектов, связанных с рассматриваемым объектом, нужно выбрать один. Для этого выбирается значение, с помощью которого можно различать объекты в этом множестве. Такой атрибут носит название квалификатора (qualifier). Класс вместе со значением квалификатора определяет уникальный, связанный с ним объект или (что встречается реже) подмножество объектов. Объект, выбираемый при помощи квалификатора, называется целевым объектом. Квалификатор может присутствовать только в ассоциациях, имеющих в целевом направлении неограниченную множественность («много»). Квалификатор изображается в виде маленького прямоугольника, который крепится к концу маршрута ассоциации, между конечным его сегментом и символом квалифицированного класса. При этом символ квалификатора является частью маршрута ассоциации, но не класса. Квалификатор стоит у класса, который он квалифицирует, т.е. у класса, объект которого вместе со значением квалификатора служит для выбора из множества целевых объектов на другом полюсе ассоциации.

Рис. 7. Квалифицированная ассоциация

Ассоциация, представляющая связь «часть – целое», называется агрегацией (aggregation). Схематически агрегация изображается в виде незакрашенного ромбика у класса-агрегата. Более сильная форма агрегации, при которой агрегат несет ответственность за создание и уничтожение своих частей, называется композицией (composition). Графически композиция изображается в виде закрашенного ромба у класса-агрегата.

 

Рис. 8. Агрегация (вверху) и композиция (внизу)

Обобщение (generalization) – это таксонометрический вид отношений (т.е. вид отношений в виде структурного дерева) между общим описанием и специфическим описанием, которое основывается на общем и детализирует его. Специфическое описание полностью согласуется с общим (оно имеет те же свойства, члены и отношения), но обладает также и некоторой дополнительной информацией. Общее описание называется прямым предком (parent), в транзитивном замыкании – предком (ancestor). Детализированный его вариант называется прямым потомком (child), а элемент в транзитивном замыкании – потомком (descendant).

Обобщение используется с классификаторами (классами, интерфейсами, типами данных, вариантами использования, актантами, сигналами и т.д.), пакетами, конечными автоматами и прочими элементами модели. В применении к классам для прямого предка и прямого потомка существуют и другие названия: суперкласс и подкласс.

На диаграммах обобщение изображается в виде стрелки с большим полым треугольником, идущей от прямого потомка к прямому предку. Несколько стрелок-обобщений можно объединить в одно дерево, так что стрелка будет указывать на прямого предка, а несколько ветвей – на прямых потомков.

Рис. 9. Нотация обобщения

Обобщение используется в целях:

· определения условий, при которых выполняется принцип подстановочности. Правило, следующее из этого принципа гласит, что экземпляр потомка всегда можно подставить на то место, где объявлено использование предка;

· организации полиморфных операций. Особенно удобен механизм обобщения при добавлении в существующую модель новых классов, так как при этом не нужно менять полиморфные вызовы. Когда полиморфная операция реализована не в классе-предке, а только в классах-потомках, она называется абстрактной и изображается на диаграммах курсивом;

· реализации механизма наследования. Механизм наследования позволяет «собрать» описание объектов класса из фрагментов описания этого класса и всех описаний его предков. Благодаря наследованию можно один раз дать описание класса, а затем наследовать его всеми классами-потомками, вместо того, чтобы повторять это описание в каждом их них. Наследование позволяет существенно уменьшить размер модели и снижает риск случайных несоответствий в программе после внесения в модель изменений.Таким же образом механизм наследования работает и с прочими элементами модели – состояниями, сигналами и вариантами использования.

Элемент-потомок наследует свойства своих предков. Но для классификаторов у потомка нельзя повторно объявлять тот атрибут, который уже объявлен у предка. В противном случае возникает конфликтная ситуация, и модель считается плохо согласованной. Операцию можно объявлять более чем в одном классификаторе, но при условии, что спецификации операции совместимы (одни и те же параметры, ограничения и возвращаемые значения). Метод может быть объявлен в нескольких иерархических классах. Причем метод, относящийся непосредственно к потомку, подменяет собой метод с той же сингатурой, унаследованный от предка. Если же класс наследует две различные копии метода (путем множественного наследования у разных классов), возникает конфликтная ситуация, и модель также считается плохо согласованной. Ограничения элементов также бывают индивидуальными и унаследованными от предков.

Если у классификатора несколько прямых предков, он наследует черты каждого из них. Таким образом, все его атрибуты, операции и сигналы – это объединение атрибутов, операций и сигналов его предков. Понятие множественного наследования схоже с такой концепцией UML, как множественная классификация. В отличие от многих языков моделирования, считающих, что любой объект принадлежит единственному классу, UML основывается на более общем утверждении – объект может одновременно принадлежать нескольким классам и вести себя таким образом, будто он принадлежит какому-то новому классу, унаследовавшему черты от всех прочих классов, к которым принадлежит этот объект. Множественная классификация напоминает множественное наследование с той лишь разницей, что в этом случае нет необходимости создавать новый класс.

Рис. 10. Множественное наследование

Еще одной полезной концепцией UML, несмотря на то, что она не поддерживается многими языками программирования, является динамическая классификация. Статическая классификация предполагает, что с течением времени объект не может менять свой класс. Между тем во многих случаях объект способен приобретать или терять атрибуты и ассоциации в процессе своего функционирования. Если какой-то атрибут или ассоциация утеряны, информация о них утрачивается и не восстанавливается, даже если позже объект вернется к изначальному классу. Если же объект приобретает атрибуты или ассоциации, они должны быть инициированы точно так же, как инициируются новые объекты. Динамические классы носят название типов или ролей. Один из общих приемов моделирования для реализации динамической классификации требует, чтобы у каждого объекта был один статический неизменный класс, а также от нуля и более классов-ролей, которые могут появляться и исчезать с течением жизни объекта. Неизменяемые классы описывают фундаментальные, а классы-роли - изменяемые свойства объекта.

Реализация (realization) – это отношение, существующее между элементом модели, определяющим поведение, и элементом, который предоставляет программную реализацию этого поведения (например, интерфейс и реализующий его класс).

Реализующий элемент должен, по крайней мере, поддерживать (путем наследования или напрямую) все операции, имеющиеся у реализуемого объекта. Как и обобщение, реализация служит для связи общих описаний с более детализированными. Но, в отличие от обобщения, связывающего два элемента одного семантического уровня, реализация связывает элементы, находящиеся на разных семантических уровнях.

Графически реализация изображается в виде пунктирной линии с полым треугольником на конце. Существует специальная краткая нотация, на которой изображаются интерфейсы (без содержимого) и реализующие их компоненты или классы. Интерфейс изображается в виде кружка, соединенного сплошной линией с прямоугольником классификатора.



<== предыдущая лекция | следующая лекция ==>
Основные концепции UML | Ограничения


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.01 сек.