# Основы &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 или просто разделы системы, ясно отличающиеся друг от друга) и сущности, из которых они возникли, например, файлы с исходным кодом, библиотеки или таблицы баз данных.

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

### Диаграммы выпуска

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