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


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

В Visual Studio Ultimate для описания типов данных и их связей отдельно от реализации можно использовать UML-схему классов.Схема позволяет сконцентрироваться на логических аспектах классов, а не их реализации.

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

ПримечаниеПримечание

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

Содержание раздела

Использование UML-схем классов

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

Использование классов, интерфейсов и перечислений

Атрибуты и операции

Создание и использование ассоциаций

Наследование

Типы шаблонов

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

Создание кода из UML-схем классов

Использование UML-схем классов

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

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

    Например, тип "Заказ еды" может реализовываться в бизнес-слое в коде .NET, в интерфейсах между компонентами в XML, в базе данных в SQL и в пользовательском интерфейсе в HTML.Несмотря на то что подробности этих реализаций различаются, отношение между типом "Заказ еды" и другими типами, такими как "Меню" и "Оплата", сохраняется.UML-схема классов позволяет обсуждать эти отношения отдельно от реализаций.

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

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

Dd409416.collapse_all(ru-ru,VS.110).gifОтношение к другим схемам

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

Если создана

используйте UML-схему классов, чтобы описать следующее.

Схема деятельности

тип данных, передаваемых через узел объекта.

типы закреплений ввода и вывода и узлы параметров действий.

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

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

типы параметров и возвращаемые значения сообщений.

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

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

схема компонентов

интерфейсы компонента с перечислением их операций.

Полный компонент также можно описать как класс.

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

Схема вариантов использования

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

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

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

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

ПримечаниеПримечание

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

Создание UML-схемы классов

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

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

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

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

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

Создание UML-схемы классов

  1. Чтобы создать тип, выберите Класс, Интерфейс или Перечисление на панели элементов, затем щелкните пустую область схемы.

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

  2. Чтобы добавить атрибуты или операции в типы, или литералы в перечисление, щелкните заголовок Атрибуты, Операции или Литералы в типе и нажмите ВВОД.

    Можно создать сигнатуру, например f(x:Boolean):Integer.Допонительные сведения см. разделе Атрибуты и операции.

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

  3. Чтобы развернуть или свернуть тип, щелкните значок шеврона в верхней левой части типа.Также можно развернуть и свернуть разделы Атрибуты и Операции в классе или интерфейсе.

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

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

  6. Каждая схема — это представление на модели, которое совместно используется другими схемами того же проекта.Чтобы просмотреть дерево полной модели, выберите Вид, Другие окна, Обозреватель моделей UML.

Использование классов, интерфейсов и перечислений

Существует три стандартных вида классификаторов, которые доступны на панели элементов.В этом документе их называют типы.

Класс, перечисление и интерфейс

  • В большинстве случаев для представления данных или типов объекта можно использовать Классы (1).

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

  • Используйте Перечисление (3), чтобы представить тип, имеющий ограниченное число значений литералов, например Stop и Go.

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

    • При желании каждому значению литерала также можно присвоить численное значение.Откройте контекстное меню для литерала в перечислении, выберите Свойства и введите число в поле Значение в окне Свойства.

Дайте каждому типу уникальное имя.

Dd409416.collapse_all(ru-ru,VS.110).gifПолучение типов из других схем

На UML-схеме классов можно отображать типы из другой схемы.

Тип из другой схемы

Как получать типы из другой схемы

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

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

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

Например, можно показать связи между элементами "Заказ еды" и "Меню" ресторана на одной схеме, а связи между элементами "Заказ еды" и "Оплата" — на другой.

Схема компонентов

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

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

На схеме последовательностей из линий жизни можно создавать классы и интерфейсы, а затем перетаскивать класс из Проводника по моделям UML на UML-схему классов.Каждая линия жизни на схеме последовательностей представляет экземпляр объекта, компонента или субъекта.

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

Код программы

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

Типы, что вы перетащили, появятся на схеме.Зависимые типы также будут добавлены в модель.Если тип UML был создан таким образом, можно дважды щелкнуть по нему, чтобы открыть исходный код.Дополнительные сведения см. в разделе Практическое руководство. Создание UML-схем классов из кода.

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

Атрибуты и операции

Атрибут (4) — это именованное значение, которое может быть присвоено каждому экземпляру типа.Осуществление доступа к атрибуту не меняет состояние экземпляра.

Операция (5) — это метод или функция, которая может выполняться экземплярами типа.Она может возвращать значение.Если ее свойство isQuery имеет значение true, операция не может изменить состояние экземпляра.

Чтобы добавить атрибут или операцию в тип, откройте контекстное меню типа, выберите Добавить и щелкните Атрибут или Операция.

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

Чтобы просмотреть свойства параметров операции, щелкните **[…]**в свойстве Параметры.Отобразится новое диалоговое окно свойств.

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

Dd409416.collapse_all(ru-ru,VS.110).gifТипы атрибутов и операций

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

  • (нет) — можно не задавать тип в сигнатуре, опустив предшествующее двоеточие (:).

  • Стандартными типами-примитивами являются следующие: Boolean, Integer и String.

  • Тип, определенный в модели.

  • Параметризованное значение типа шаблонов, записанное как Template<Parameter>.См. Типы шаблонов.

Также можно записать имя типа, который еще не был определен в модели.Имя отобразится в разделе Незаданные типы в проводнике по моделям UML.

ПримечаниеПримечание

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

Dd409416.collapse_all(ru-ru,VS.110).gifНесколько типов

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

Допустимы следующие значения.

Кратность

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

[1]

Одно значение заданного типа.Задано по умолчанию.

[0..1]

Null или значение заданного типа.

[*]

Коллекция, в состав которой может входить неограниченное число экземпляров заданного типа.

[1..*]

Коллекция хотя бы одного экземпляра заданного типа.

[n..m]

Коллекция, в которую входит от n до m экземпляров заданного типа.

Если кратность превышает 1, можно задать следующие свойства.

  • IsOrdered — если значение true, коллекция имеет определенный порядок.

  • IsUnique — если значение true, в коллекции отсутствуют повторяющиеся значения.

Dd409416.collapse_all(ru-ru,VS.110).gifВидимость

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

Имя

Краткая форма

Значение

Открытый

+

Возможен доступ изо всех других типов.

Закрытый

-

Доступ открыт только для внутреннего определения этого типа.

Пакет

~

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

Защищенный

#

Доступ открыт только данному типу и всем типам, которые его наследуют.См. Наследование.

Dd409416.collapse_all(ru-ru,VS.110).gifЗадание сигнатуры атрибута или операции

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

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

Создайте сигнатуру в следующей форме.

visibility attribute-name : Type

- или -

visibility operation-name (parameter1 : Type1, ...) : Type

Например:

+ AddItem (item : MenuItem, quantity : Integer) : Boolean

Используйте краткую форму значения свойства visibility.Значение по умолчанию — + (открытый).

Каждый тип может представлять собой типы, определенные в модели, стандартные типы (такие как Integer или String) или имя нового типа, который еще не был определен.

ПримечаниеПримечание

Если в списке параметров создается имя без типа, оно представляет собой имя параметра, а не типа.В этом примере MenuItem и Integer являются именами двух параметров с незаданным типами.

AddItem(MenuItem, Integer) /* parameter names, not types! */

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

+ AddItems (items : MenuItem [1..*])
+ MenuContent : MenuItem [*]

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

Однако свойства Является статическим и Является абстрактным можно задать только в окне Свойства.

Dd409416.collapse_all(ru-ru,VS.110).gifПолная сигнатура

При редактировании сигнатуры атрибута или операции в конце строки и после каждого параметра могут отображаться дополнительные свойства.Они отображаются заключенными в фигурные скобки {…}.Эти свойства можно редактировать и добавлять.Например:

+ AddItems (items: MenuItem [1..*] {unique, ordered})
+ GetItems (filter: String) : MenuItem [*] {ordered, query}

Список содержит следующие свойства.

В сигнатуре

Свойство

Значение

unique

Является уникальным

В коллекции нет повторяющихся значений.Применимо к типам с кратностью больше 1.

ordered

Является упорядоченным

Коллекция — это последовательность.Если значение false, не существует определенного первого элемента.Применимо к типам с кратностью больше 1.

query

Является запросом

Операция не меняет состояние экземпляра.Применимо только к операциям.

/

Является производным

Атрибут вычисляется из значений других атрибутов или ассоциаций.

"/" отображается перед именем атрибута.Например:

/TotalPrice: Integer

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

Создание и использование ассоциаций

Используйте ассоциацию, чтобы представить любые виды отношений между двумя элементами, независимо от того, как эта связь реализуется в программе.Например, можно использовать ассоциацию, чтобы представить указатель в C#, отношение в базе данных или перекрестную ссылку одной части XML-файла на другую.Может представлять связь между объектами в реальном мире, например землей и солнцем.Ассоциация не показывает, как представлена ссылка, а только свидетельствует о наличии сведений.

Dd409416.collapse_all(ru-ru,VS.110).gifСвойства ассоциации

После создания ассоциации необходимо задать ее свойства.Откройте контекстное меню для ассоциации и выберите Свойства.

Помимо свойств ассоциации в целом каждая роль, т. е. каждое окончание ассоциации, обладает собственными свойствами.Чтобы просмотреть их, расширьте свойства Первая роль и Вторая роль.

Некоторые свойства каждой роли напрямую видны на схеме.К ним относится следующее.

  • Имя роли.Отображается на соответствующем окончании ассоциации на схеме.Его можно увидеть на схеме или в окне Свойства.

  • Кратность, значение по умолчанию — 1.Это значение также отображается на схеме рядом с соответствующим окончанием ассоциации.

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

  • Является перемещаемым.Если имеет значение true только для одной роли, в направлении перехода отображается стрелка.С помощью этого свойства можно показать возможности перехода по ссылкам и связи в базе данных в программе.

Полный список этих и других свойств см. в разделе Свойства ассоциаций на UML-схемах классов.

Dd409416.collapse_all(ru-ru,VS.110).gifВозможность перехода

Когда изображается ассоциация, на одном конце у нее стрелка, обозначающая, что ассоциация дает возможность перехода в этом направлении.Это удобно, если схема классов представляет классы ПО, а ассоциации представляют указатели или ссылки.Но если схема классов представляет сущности и отношения или бизнес-концепции, возможность перехода показывать не обязательно.В таком случае можно изображать ассоциации без стрелок.Это можно сделать, задав для свойства Является перемещаемым на обоих концах ассоциации значение "true".Чтобы облегчить эту задачу, можно загрузить пример кода UML Domain Modeling.

Dd409416.collapse_all(ru-ru,VS.110).gifАтрибуты и ассоциации

Ассоциация — это графический способ представления атрибута.Например, вместо того чтобы создавать класс "Ресторан" с атрибутом типа "Меню", можно создать ассоциацию из элементов "Ресторан" и "Меню".

Каждое имя атрибута становится именем роли.Оно отображается на противоположном типу-владельцу окончании ассоциации.Например, обратите внимание на myMenu на этой иллюстрации.

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

Эквивалентная ассоциация и атрибуты

Наследование

Используйте инструмент Наследование для создания следующих отношений.

  • Отношение обобщения между специализированным типом и общим типом.

    - или -

  • Отношение реализации между классом и реализуемым им интерфейсом.

Невозможно создавать циклы в отношениях наследования.

Dd409416.collapse_all(ru-ru,VS.110).gifОбобщение

Обобщение означает, что специализирующий или производный тип наследует атрибуты, операции и ассоциации общего или базового типа.

Общий тип отображается на окончании отношения с наконечником стрелки.

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

Переопределение определения операции в специализирующем типе

  1. Щелкните отношение обобщения.

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

  2. Щелкните тег действия и выберите Переопределить операции.

    Появляется диалоговое окно Переопределить операции.

  3. Выделите операции, которые нужно отобразить в специализирующем типе и нажмите кнопку ОК.

Выделенные операции теперь отображаются в специализирующем типе.

Dd409416.collapse_all(ru-ru,VS.110).gifРеализация

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

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

После создания отношения реализации можно преобразовать его в обозначение без описания операций.Щелкните отношение правой кнопкой мыши и выберите Показывать без описания операций.

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

Реализация, показанная с помощью соединителя и без описания операций

Типы шаблонов

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

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

Класс шаблона с двумя параметрами

Создание типа шаблонов

  1. Создайте класс или интерфейс.Это ваш тип шаблонов.Присвойте ему соответствующее имя, например Dictionary.

  2. Откройте контекстное меню для нового типа и выберите Свойства.

  3. В окне Свойства щелкните […] в поле Параметры шаблона.

    Откроется диалоговое окно Редактор коллекции параметров шаблонов.

  4. Выберите Добавить.

  5. В свойстве "Имя" задайте имя параметра для типа шаблонов, например Key.

  6. Задайте значение в поле Вид параметра.Class — значение по умолчанию.

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

  8. Добавьте необходимое количество параметров и нажмите кнопку OK.

  9. Добавьте атрибуты и операции в тип шаблонов так же, как при работе с другими классами.

    В определении атрибутов и операций можно использовать параметры с видом Класс, Интерфейс или Перечисление.Например, используя классы параметров Key и Value, можно определить эту операцию в Dictionary.

    Get(k : Key) : Value

    Параметр с видом Integer можно использовать в качестве границы кратности.Например, максимально допустимое значение параметра Integer можно использовать для определения кратности атрибута в виде [0..max].

Созданные типы шаблонов можно использовать для определения привязок шаблонов.

Класс, привязанный из шаблона словаря

Использование типа шаблонов

  1. Создайте новый тип, например AddressTable.

  2. Откройте контекстное меню для нового типа и выберите Свойства.

  3. В свойстве Привязка шаблона выберите тип шаблона, например Dictionary, из раскрывающегося списка.

  4. Разверните свойство Привязка шаблона.

    Отображается строка для каждого параметра типа шаблонов.

  5. Задайте подходящее значение для каждого параметра.Например, задайте для параметра Key класс Name.

Пакеты

На UML-схеме классов можно просматривать пакеты.Пакет — это контейнер для других элементов модели.Внутри пакета можно создать любой элемент.На схеме элементы внутри пакета перемещаются по схеме, если перемещается пакет.

Чтобы скрыть или отобразить содержимое пакета, можно использовать элемент управления "развернуть/свернуть".

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

Создание кода из UML-схем классов

Что бы приступить к реализации классов на uml-схеме классов, можно сгенерировать код C# или настроить шаблоны для генерации кода.Генерирование кода с использованием предоставленных C# шаблонов:

  • Откройте контекстное меню для диаграммы или элемента, выберите Генерировать код, а затем установите необходимые свойства.

    Дополнительные сведения о том, как задавать эти свойства и настраивать предоставленные шаблоны см. в разделе Практическое руководство. Создание кода из UML-схем классов.

См. также

Ссылки

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

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

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

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

Моделирование требований пользователей

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

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

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