Поделиться через


UML-схемы компонентов: правила работы

В Visual Studio Ultimate можно создать схему компонентов, чтобы показать структуру программной системы. Видеодемонстрация доступна на странице Designing the Physical Structure by using Component Diagrams.

Чтобы создать UML-схему компонентов, в меню Архитектура щелкните Создать схему.

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

Создание схем компонентов имеет несколько преимуществ.

  • Анализ основных элементов системы позволяет команде разработчиков понять принципы существующей системы и создать новую.

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

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

В этом разделе

Отношение к другим схемам

Основные этапы создания схем компонентов

Отображение внутренних частей компонента

Конструирование компонента

Примечание

Справочные сведения об элементах на схемах компонентов см. в разделе Схемы компонентов UML: справочные материалы.

Отношение к другим схемам

Можно использовать схему компонентов совместно с другими схемами.

Другая схема

Помогает обсуждать следующие аспекты конструкции и передавать сведения о них

UML-схема последовательностей

  • Взаимодействия между компонентами системы

  • Взаимодействия между частями внутри компонента.

Дополнительные сведения см. в разделе UML-схемы последовательностей: правила работы.

UML-схема классов

  • Интерфейсы компонента и классы, формирующие его части.

  • Данные, отправляемые в параметрах по интерфейсам компонентов.

Дополнительные сведения см. в разделе UML-схемы классов: правила работы.

Схемы активности

  • Внутренние обработки, выполняемые компонентом в ответ на входящие сообщения.

Дополнительные сведения см. в разделе UML-схемы деятельности: рекомендации.

Схемы слоев

  • Логические архитектурные уровни компонентов.

Дополнительные сведения см. в разделе Схемы слоев: справочные материалы.

Основные этапы создания схем компонентов

Справочные сведения об элементах на схемах компонентов см. в разделе Схемы компонентов UML: справочные материалы.

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

Примечание

Подробные инструкции по созданию схем моделирования приведены в разделе Практическое руководство. Изменение модели и схем UML.

Создание схемы компонентов

  1. В меню Архитектура выберите пункт Создать схему.

  2. В разделе Шаблоны щелкните UML-схема компонентов.

  3. Назовите схему.

  4. В области Добавить в проект моделирования выделите существующий проект моделирования в решении или выберите Создать новый проект моделирования и нажмите кнопку ОК.

    Новая схема компонентов отображается на панели элементов Схема компонентов UML. Панель элементов содержит требуемые элементы и отношения.

Создание компонентов

Компоненты с интерфейсами

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

В качестве примеров можно привести приложение, аппаратное средство, веб-службу, сборку .NET, программный класс или группу классов или любой другой отделимый сегмент программы.

Создание компонентов

  1. Щелкните Компонент на панели элементов, затем щелкните пустую область схемы.

    - или -

    Скопируйте и вставьте существующий компонент.

    1. Найдите существующий компонент на схеме или в Проводнике по моделям UML.

    2. Щелкните компонент правой кнопкой мыши и выберите Копировать.

    3. Откройте схему, на которой необходимо отобразить скопированный компонент.

    4. Щелкните правой кнопкой мыши пустую область схемы и выберите Вставить.

      Копия компонента отображается с новым именем.

  2. Щелкните имя компонента, чтобы изменить его.

  3. Щелкните шеврон (5), если нужно отобразить только заголовок компонента.

Отображение портов компонента

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

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

В качестве примеров можно назвать пользовательский интерфейс, веб-службу, интерфейс .NET или коллекцию функций на любом языке программирования.

Порт с требуемым интерфейсом (3) представляет требование компонента к группе операций или служб, которые должны быть предоставлены другими компонентами или внешними системами.

Например, веб-браузер требует веб-серверы, а надстройка приложения требует службы из приложения.

Компонент может иметь неограниченное число портов.

Добавление портов в компонент

  1. На панели элементов щелкните Предоставленный интерфейс или Требуемый интерфейс.

  2. Щелкните компонент, который необходимо добавить в интерфейс.

    На границе компонента появляется порт.

    Новый интерфейс создается как тип порта. Этот интерфейс отображается в Проводнике по моделям UML.

  3. Перетащите порт через границу компонента и разместите его, где нужно.

  4. Перетащите метку порта, чтобы скорректировать его расположение.

  5. Щелкните метку, чтобы изменить ее. Метка показывает имя интерфейса. Если изменить ее, изменится и имя интерфейса.

Ссылки между компонентами

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

Как показать, что предоставленный интерфейс может удовлетворить условия требуемого интерфейса

  1. На панели элементов щелкните Зависимость.

  2. Щелкните порт с требуемым интерфейсом одного компонента, затем щелкните порт с предоставленным интерфейсом другого компонента.

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

Добавление в компонент порта для существующего интерфейса

  • В Проводнике по моделям UML найдите интерфейс и перетащите его в компонент.

    – или –

  • Скопируйте и вставьте ссылку на интерфейс из схемы.

    1. На схеме классов или схеме компонентов щелкните интерфейс правой кнопкой мыши и выберите Копировать.

    2. На схеме компонентов щелкните компонент правой кнопкой мыши и выберите Вставить ссылку.

      В компоненте появляется предоставленный интерфейс. Рядом появляется тег действия.

      Примечание

      Если вместо команды Вставить ссылку использовать команду Вставить, создается новый интерфейс с новым именем.

    3. Если необходимо создать требуемый интерфейс, щелкните тег действия и выберите Преобразовать в требуемый интерфейс.

Отображение внутренних частей компонента

Схема компонентов, на которой показаны внутренние части

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

Схема на иллюстрации показывает, что каждый экземпляр веб-службы Dinner Now содержит один экземпляр сервера "Клиенты" и один экземпляр сервера "Кухня".

Часть — это свойство родительского компонента. Отношения между ними можно сравнить с тем, как атрибут принадлежит к обычному классу. Часть имеет собственный тип, который, как правило, также является компонентом. Метка части имеет ту же форму, что и обычный атрибут.

+ partName : TypeName

Внутри родительского компонента каждая часть показывает предоставляемые и требуемые интерфейсы, определенные для ее типа (4, 5). Операции или службы, требуемые одной частью, могут быть предоставлены другой. Можно использовать соединители Сборки части, чтобы показать, как части соединены друг с другом (6).

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

Новую часть можно создать либо с помощью нового типа, либо из существующего типа.

Добавление частей в компонент

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

    1. Щелкните Компонент на панели элементов, затем щелкните внутри родительского компонента (1).

      Новая часть (3) появляется внутри родительского компонента.

      В Проводнике по моделям UML создается новый компонент. Это тип новой части.

      - или -

      Перетащите существующий компонент из Проводника по моделям UML в родительский компонент.

      Новая часть (3) появляется внутри родительского компонента. Ее тип — это компонент, перемещенный из Проводника по моделям UML.

      - или -

      На схеме или в Проводнике по моделям UML щелкните компонент правой кнопкой мыши и выберите Копировать.

      Щелкните родительский компонент правой кнопкой мыши и выберите Вставить ссылку.

      Новая часть (3) появляется внутри родительского компонента. Ее тип — это скопированный компонент.

    2. Щелкните имя новой части, чтобы изменить его. Изменить ее тип невозможно.

    3. В новую часть можно добавить предоставленные и требуемые интерфейсы (4, 5). Выберите Предоставленный интерфейс или Требуемый интерфейс и щелкните часть.

      - или -

      Перетащите существующий интерфейс из Проводника по моделям UML в часть.

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

  2. Соедините части друг с другом.

    • Используйте инструмент Зависимость, чтобы соединить порты разных частей (6).
  3. Соедините части с портами родительского компонента.

    1. Создайте один или несколько портов (7) в родительском компоненте. Выберите Требуемый интерфейс или Предоставленный интерфейс на панели элементов и щелкните родительский компонент.

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

Отображение частей части

После разложения компонента на части каждый тип части можно дополнительно разложить на внутренние части.

Удобнее разместить каждый слой разложения на отдельной схеме компонентов. Сначала нужно найти тип части. Например, на иллюстрации одна из частей называется DNCustomerServer, а ее тип представляет собой компонент, который называется CustomerServer. Этот тип можно найти в Проводнике по моделям UML и поместить его на другую схему. Затем можно создавать внутренние части типа.

Размещение типа части на схеме

  1. Определите полное имя для типа части.

    Щелкните часть правой кнопкой мыши и выберите пункт Свойства.

    Имя типа отображается в поле Тип окна свойств.

  2. Найдите тип части в Проводнике по моделям UML.

    Щелкните Вид, выберите Другие окна и щелкните Проводник по моделям UML.

    Разверните проект и (при необходимости) любой пакет, к которому принадлежит тип.

    Тип отобразится в списке как Компонент.

    При необходимости его имя можно изменить здесь.

  3. Откройте или создайте другую схему компонентов.

  4. Перетащите тип из Проводника по моделям UML на схему.

    Представление типа отображается как компонент на схеме.

    Он имеет те же интерфейсы, которые были определены для части.

    Теперь можно добавлять части в компонент.

Конструирование компонента

Описание взаимодействия частей

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

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

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

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

  • Если слишком много функций делегировано одной части, вероятно, возникнут сложности с обновлением приложения. При равномерном распределении функций это маловероятно.

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

Схема последовательностей, на которой показаны совместно работающие части

Создание схемы последовательностей, показывающей взаимодействие частей

  1. Создайте новую схему последовательностей.

    Дополнительные сведения см. в разделе UML-схемы последовательностей: правила работы.

  2. Создайте линию жизни для внешнего компонента, пользователя, устройства или другого субъекта (1), отправляющего сообщения этому компоненту.

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

  3. Создайте линию жизни для предоставленного интерфейса (2) этого компонента, которому выбранный субъект отправляет сообщения.

  4. Создайте линию жизни для каждой части (3) компонента.

  5. Создайте линию жизни для каждого требуемого интерфейса (4) компонента.

  6. Создайте сообщения от внешнего субъекта (5). Покажите, как сообщение передается частям и как они взаимодействуют в ответ на него.

  7. При необходимости покажите сообщения, отправляемые требуемому интерфейсу (6). Не показывайте никаких подробностей в области выполнения сообщения.

Компонент — это больше, чем его части?

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

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

Описание процесса внутри каждой части

Чтобы показать, как компонент обрабатывает каждое входящее сообщение, можно использовать схемы активности. Дополнительные сведения см. в разделе UML-схемы деятельности: рекомендации.

Схема деятельности с буфером данных

Используйте "Принять действие события" (1), чтобы показать, что входящее сообщение начинает новый поток.

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

Определение данных и классов

UML-схему классов можно использовать, чтобы подробно описать содержимое следующих элементов:

  • интерфейсов компонентов;

  • данных, переданных в параметрах операций в интерфейсах;

  • данных, сохраненных в компонентах, например как показано в потоках объектов на схемах активности;

общих зависимостей между компонентами.

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

Зависимость между компонентами

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

Наиболее распространены следующие виды зависимостей.

  • Один компонент вызывает код внутри другого.

  • Один компонент создает экземпляр класса, определенного внутри другого класса.

  • Один компонент использует сведения, созданные другим.

Можно использовать имя стрелки зависимости, чтобы обозначить конкретный вид использования. Чтобы задать имя, щелкните стрелку правой кнопкой мыши, затем щелкните Свойства и задайте значение в поле Имя в окне свойств.

См. также

Ссылки

UML-схемы последовательностей: справочные материалы

Основные понятия

Практическое руководство. Изменение модели и схем UML

Схемы компонентов UML: справочные материалы

UML-схемы вариантов использования: справочные материалы

UML-схемы классов: справочные материалы

Схемы компонентов UML: справочные материалы

Другие ресурсы

Video: Designing the Physical Structure by using Component Diagrams