# Основы &UML;

## О языке &UML;

Данный раздел предоставит вам небольшой обзор основ &UML;. Он не является учебником по &UML;, и если вы хотите узнать побольше об &UML; или в целом о планировании разработки программного обеспечения, обратитесь к одной из многих книг по данной теме. В Интернете есть много учебных пособий, можете начать с них.

Унифицированный язык моделирования (&UML;) является языком диаграмм или обозначений для спецификации, визуализации и документации модели объектно-ориентированных программных систем. &UML; не является методом разработки, то есть он не определяет последовательность действий при разработке программного обеспечения. Он помогает описать свою идею и взаимодействовать с другими разработчиками системы. &UML; управляется Object Management Group (OMG) и является промышленным стандартом, описывающим модели программного обеспечения.

&UML; создан для применения в разработке объектно-ориентированного программного обеспечения и с некоторыми ограничениями может применяться для других парадигм программирования.

&UML; состоит из множества модельных элементов, которые представляют различные компоненты разрабатываемой системы. Элементы &UML; используются для создания диаграмм, которые описывают определённую часть системы или точку зрения на неё. &umbrello; поддерживает следующие типы диаграмм:

- Диаграммы вариантов использования отображают действующих лиц (людей или других пользователей системы), варианты использования (сценарии использования системы) и их взаимодействие.

- Диаграммы классов отображают классы и взаимодействие между ними.

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

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

- Диаграммы состояний отображают состояния, изменения состояний и события в объектах или компонентах системы.

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

- Диаграммы компонентов показывают компоненты верхнего уровня (такие как KParts или Java Beans).

- Диаграммы развёртывания показывают экземпляры компонентов и их взаимоотношения.

- Диаграммы отношений сущностей отображают данные и отношения и ограничения, существующие между этими данными.

## Элементы &UML;

### Диаграмма вариантов использования

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

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

Пример диаграммы вариантов использования. Диаграмма вариантов использования

Диаграмма вариантов использования

#### Вариант использования

Вариант использования описывает, с точки зрения действующего лица, группу действий в системе, которые приводят к конкретному результату.

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

При работе с вариантами использования важно помнить несколько простых правил:

- Каждый вариант использования относится как минимум к одному действующему лицу

- Каждый вариант использования имеет инициатора

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

Варианты использования также могут взаимодействовать с другими вариантами использования. Три наиболее часто встречающихся типа взаимодействия между вариантами использования приведены ниже:

- <<включение>> указывает, что вариант использования встраивается в другой вариант использования;

- <<добавление>> указывает, что в определённых ситуациях или в некоторой точке (называемой точкой расширения) вариант использования будет расширен другим;

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

#### Действующее лицо

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

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

#### Описание варианта использования

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

### Диаграмма классов

Диаграммы классов отображают различные классы, из которых состоит система, и их взаимодействие между собой. Диаграммы классов являются статичными диаграммами, потому что они отображают классы вместе с их методами и атрибутами, так же как и статические взаимодействия между ними: какие классы знают о каких классах или какие классы являются частью других классов, но не отображают обмен сообщениями между классами.

Пример диаграммы классов. Диаграмма классов

Диаграмма классов

#### Класс

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

В &UML; классы представлены прямоугольниками с именем класса, которые также могут отображать атрибуты и операции класса в двух других отделениях внутри прямоугольника.

Класс в &UML; Визуальное представление класса в &UML;

Визуальное представление класса в &UML;

##### Атрибуты

В &UML; атрибуты отображаются с как минимум их названием, но также могут быть показаны тип, начальное значение и другие свойства. Атрибуты также могут отображаться с указанием их области видимости:

- `+` отмечает открытые (public) атрибуты;

- `#` отмечает защищённые (protected) атрибуты;

- `-` отмечает закрытые (private) атрибуты.

##### Методы

Методы (операции) также отображаются с как минимум их названием, но также могут быть показаны параметры и возвращаемый тип. Подобно атрибутам, методы имеют область видимости:

- `+` отмечает открытые (public) операции;

- `#` отмечает защищённые (protected) операции;

- `-` отмечает закрытые (private) операции.

##### Шаблоны

Классы могут иметь шаблоны, значение которых используется для неуказанного класса или типа. Тип шаблона указывается при инициализации класса (то есть при создании объекта). Шаблоны используются в современном C++ и будут введены в Java 1.5, где будут обозначаться как Generics.

#### Ассоциации классов

Классы могут взаимодействовать друг с другом различными способами:

##### Обобщение

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

В &UML; ассоциация обобщения между двумя классами помещает их в иерархию, представляющую концепцию наследования производного класса от базового. В &UML; обобщения отображаются в виде линии, соединяющей два класса, со стрелкой у базового класса. Обобщение Визуальное представление обобщения в &UML;

Визуальное представление обобщения в &UML;

##### Ассоциации

Ассоциации отображают взаимодействия между классами и определяют общую семантику и структуру многих типов связей между объектами.

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

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

В &UML; ассоциации отображаются в виде линии, соединяющей взаимодействующие классы, и могут показывать роль и количество объектов с каждой стороны. Множественность отображается в виде диапазона [мин..макс] неотрицательных значений, звёздочка (`*`) в качестве максимального значения обозначает бесконечность. &UML;-ассоциации Визуальное представление ассоциации в &UML;

Визуальное представление ассоциации в &UML;

##### Агрегация

Агрегации являются специальным типом ассоциаций, в котором два участвующих класса не равнозначны по статусу, но создают взаимодействие типа часть-целое. Агрегация описывает, как класс, играющий роль целого, создаётся из других классов, играющих роль частей. Для агрегаций класс, выступающий в роли целого, всегда имеет множественность, равную единице.

В &UML; агрегации отображаются в виде линии с ромбом на стороне целого, соединяющей взаимодействующие классы. Агрегация Визуальное представление агрегации в &UML;

Визуальное представление агрегации в &UML;

##### Композиция

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

В &UML; композиции отображаются в виде линии с закрашенным ромбом на стороне целого, соединяющей взаимодействующие классы.

Композиция Визуальное представление композиции в &UML;

#### Другие элементы диаграммы классов

Помимо классов, диаграммы классов могут содержать и некоторые другие элементы.

##### Интерфейсы

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

##### Типы данных

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

##### Перечисления

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

##### Пакеты

Пакеты представляют собой пространства имён в языке программирования. В диаграмме они используются для представления частей системы, которые содержат более одного класса (число классов может превышать несколько сотен).

### Диаграммы последовательностей

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

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

Диаграмма последовательностей
Диаграмма последовательностей

Диаграмма последовательностей

Сообщения могут быть либо синхронными, когда управление передаётся вызываемому объекту вплоть до момента окончания его работы, либо асинхронными, когда управление сразу же возвращается вызывающему объекту. Синхронные сообщения обозначаются вертикальным прямоугольником на стороне вызываемого объекта для отображения передачи управления в программе.

### Диаграммы кооперации

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

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

Кооперация
Диаграмма кооперации

Диаграмма кооперации

### Диаграмма состояний

Диаграммы состояний показывают различные состояния объекта в течение его времени жизни и причины, вызывающие их смену.

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

- Готовность

- Ожидание

- Обработка

- Остановка

а события, которые могут привести к смене объектом своего состояния, это:

- Объект создан

- Объект принял ожидаемое сообщение

- Клиент запросил соединение по сети

- Клиент прервал запрос

- Запрос выполнен

- Объект получил завершающее сообщение

- и так далее

Диаграмма состояний Диаграмма состояний

Диаграмма состояний

#### Состояние

Состояния являются ключевыми элементами диаграмм состояний. Состояния принадлежат ровно одному классу и представляют собой совокупность значений, которые могут принимать атрибуты класса. В &UML; состояние описывает внутреннее состояние объекта одного определённого класса.

Следует отметить, что не стоит отображать на диаграмме состояний все состояния — отображайте только важные состояния, которые значительно влияют на работу объекта.

Существуют два особых типа состояний: «начало» и «конец». И вот почему: нет такого события, которое заставит объект возвратиться в состояние «начало», если он из него вышел; нет такого события, которое заставит объект выйти из состояния «конец», если он в него вошёл.

### Диаграмма деятельности

Диаграммы деятельности описывают последовательность действий в системе с помощью видов деятельности. Диаграммы деятельности являются специальной формой диаграмм состояний, только в основном содержат виды деятельности.

Пример диаграммы деятельности Диаграмма деятельности

Диаграмма деятельности

Диаграммы деятельности подобны процедурным диаграммам потока, с той разницей, что все виды деятельности напрямую присоединены к объектам.

Диаграммы деятельности всегда ассоциируются с классами, методами или вариантами действий.

Диаграммы деятельности поддерживают как последовательные, так и параллельные действия. Параллельное выполнение представляется с помощью значков Fork/Wait. Для действий, выполняющихся параллельно, порядок, в котором они выполняются, не имеет значения (они могут выполняться одновременно или друг за другом).

#### Действие

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

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

### Вспомогательные элементы

Существует несколько вспомогательных элементов в &UML;, которые не имеют реального семантического значения для модели, но помогают внести ясность в диаграмму. Перечислим их:

- Текстовые строки

- Текстовые примечания и ссылки

- Блоки

Текстовые строки удобно использовать для добавления краткой текстовой информации в диаграмму, это свободно прикрепляемый текст, который не оказывает никакого влияния на модель.

Текстовые примечания следует использовать для добавления более детальной информации об объекте или о специфической ситуации. Текстовые примечания могут быть прикреплены к элементам &UML;.

Блоки являются свободно размещаемыми прямоугольниками, которые могут быть использованы для группирования элементов диаграмм с целью улучшения читаемости. Они не несут никакой смысловой нагрузки для модели.

### Диаграммы компонентов

Диаграммы компонентов отображают компоненты программного обеспечения (компонентные технологии, такие как KParts, CORBA или Java Beans, или просто разделы системы, явно отличающиеся друг от друга) и сущности, из которых они возникли, например файлы с исходным кодом, библиотеки или таблицы баз данных.

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

### Диаграммы развёртывания

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

### Диаграммы отношений сущностей

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

Пример диаграммы отношений сущностей. Диаграмма отношений сущностей

Диаграмма отношений сущностей

#### Сущность

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

Примечание: для отображения диаграмм отношений сущностей не существует стандартных нотаций. В различной литературе по этой теме используются различные нотации. Концепции и нотации для используемых в Umbrello расширенных диаграмм отношений сущностей взяты из следующей книги: Elmasri R. and Navathe S. (2004). Fundamentals of Database Systems 4th edn. Addison Wesley

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

Сущность в диаграмме отношений сущностей Визуальное представление сущности в диаграмме отношений сущностей

Визуальное представление сущности в диаграмме отношений сущностей

##### Атрибуты сущности

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

##### Ограничения

Ограничения на диаграммах отношений сущностей указывают относящиеся к данным ограничения в информационной схеме.

В Umbrello поддерживается четыре типа ограничений:

- Первичный ключ: набор атрибутов, объявленный как первичный ключ, является уникальным для сущности. В сущности может присутствовать только один первичный ключ, и ни один из составляющих его атрибутов не может иметь значение NULL.

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

- Внешний ключ: внешний ключ — это ссылочное ограничение между двумя таблицами. Внешний ключ идентифицирует столбец или набор столбцов в одной (ссылающейся) таблице, который ссылается на столбец или набор столбцов в другой (упомянутой в ссылке) таблице. Столбцы в упомянутой в ссылке таблице должны формировать первичный ключ или уникальный ключ.

- Проверочное ограничение: проверочное ограничение (также называется ограничением проверки таблицы) — это условие, которое определяет действительные данные при добавлении или обновлении записи в таблице реляционной базы данных. Проверочное ограничение применяется к каждой строке таблицы. Ограничение должно быть предикатом. Оно может относиться к одному или нескольким столбцам таблицы.

  Пример: цена >= 0

### Концепции расширенных диаграмм отношений сущностей

#### Специализация

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

В Umbrello возможно указать специализацию двух видов: «Разделение» и «Перекрытие».

##### Специализация «Разделение»

Специализация «Разделение» указывает, что подклассы специализации должны быть разделёнными. Это означает, что сущность может быть членом не более чем одной производной сущности специализации

Сущности, задействованные в специализации «Разделение» Визуальное представление специализации «Разделение» в расширенной диаграмме отношений сущностей

Визуальное представление специализации «Разделение» в расширенной диаграмме отношений сущностей

##### Специализация «Перекрытие»

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

Сущности, задействованные в специализации «Перекрытие» Визуальное представление специализации «Перекрытие» в расширенной диаграмме отношений сущностей

Визуальное представление специализации «Перекрытие» в расширенной диаграмме отношений сущностей

##### Категория

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

Сущности, задействованные в отношении «Категория» Визуальное представление категории в расширенной диаграмме отношений сущностей

Визуальное представление категории в расширенной диаграмме отношений сущностей