Перейти к основному содержимому

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

Основные элементы

Пространства имён (Namespace)

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

Пример:

Класс

Класс — это базовый строительный блок объектно-ориентированной модели, определяющий структуру и поведение сущности. В UML он представляется прямоугольником, разделённым на три секции:

  • Имя класса — уникальное имя, описывающее сущность (например, User)
  • Наименование сущности — человеко-читаемое имя, используемое в интерфейсе
  • Атрибуты (свойства) — характеристики объекта
  • Методы (операции) — функции или действия, которые объект может выполнять

Пример:

Модификаторы доступа

  • -private (закрытый)
  • +public (открытый, можно опускать)
  • #protected (защищённый)

Атрибуты свойств

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

  • label — отображаемое имя
  • readonly — только для чтения
  • required — обязательное для заполнения

Пример:

string Title [label="Наименование", required]
string Name [readonly]

Типы и форматы данных

Базовые типы

Тип данныхОписаниеNullable-форма
intЦелое числоint?
float, double, decimalЧисло с плавающей точкойfloat?, double?, decimal?
stringСтрокане требуется
boolЛогическое значениеbool?

Примечание: Тип string допускает null по умолчанию, поэтому ? указывать не нужно.

Примеры:

int Age [label="Возраст", required]         // Обязательное целое число, по умолчанию = 0
bool Check // по умолчанию = false
bool? Confirm [label="Подтверждаю", required] // по умолчанию = null, необходимо выбрать true | false
int? Rating [label="Рейтинг"] // Необязательное целое число
string Comment [label="Комментарий"] // Необязательная строка (по умолчанию = null)

Рекомендации по числовым типам:

  • float — для приближённых значений (например, координаты, температура)
  • double — для повышенной точности без строгих требований
  • decimal — для денежных и финансовых расчётов

Ограничения значений

Для строк (string):

  • [minLength=10] — минимальная длина
  • [maxLength=255] — максимальная длина
string Name [label="Имя", minLength=3, maxLength=255, required]

Для целых чисел (int):

  • [min=1] — минимальное значение
  • [max=100] — максимальное значение
int Age [label="Возраст", min=1, max=150, required]

Специализированные типы данных

Массивы

Тип данныхОписаниеNullable-форма
string_arrМассив строкне требуется
int_arrМассив чиселне требуется

Файлы и изображения (ссылки на filestorage)

Тип данныхОписаниеNullable-форма
fileСсылка на файлне требуется
imageСсылка на изображениене требуется
avatarСсылка на аватарне требуется

Форматированный текст

Тип данныхОписаниеNullable-форма
markdownТекст в формате markdownне требуется
htmlТекст в формате htmlне требуется

Даты и время

Тип данныхОписаниеNullable-форма
dateДатаdate?
datetimeДата и времяdatetime?
timeВремяtime?
yearГодyear?

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

ТипНазначениеNullable-форма
enum ~Type~Перечислениеenum ~Type?~

Ссылки на объекты

ТипНазначениеNullable-форма
ref ~Type~Ссылка на другую сущностьне требуется

Коллекции

ТипНазначение
collection ~Type~Коллекция объектов указанного типа

Комплексные типы

ТипНазначениеNullable-форма
LocationГеографические координатыне предусмотрена
AddressПочтовый адресне предусмотрена
DatePeriodПериод между датамине предусмотрена
DateTimePeriodПериод между датами с указанием временине предусмотрена
ConfigurablePropertyНастраиваемое полене предусмотрена

На текущий момент в Visary 9.0.0 комплексные типы должны создаваться по умолчанию.

Связи между классами

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

Типы связей

ТипОбозначениеНазначение
АссоциацияclassA --> classBОбщее отношение между классами
АгрегацияclassC o-- classDЧасть может существовать отдельно
КомпозицияclassE *-- classFЧасть не существует без целого
НаследованиеclassG <|-- classHНаследование поведения
РеализацияclassM <|.. classNКласс реализует интерфейс

Кратность связей

Определяет, сколько экземпляров одного класса может быть связано с другим:

КратностьОписание
"1" -- "1"Один к одному
"1" -- "n"Один ко многим
"n" -- "n"Многие ко многим

Ассоциации (UI)

OneToManyAssociation

Отображение коллекции зависимых объектов на стороне основного объекта в пользовательском интерфейсе (UI).

OneToOneAssociation

Отображение зависимого объекта (OneToOne) на стороне основного объекта в пользовательском интерфейсе (UI).

ManyToManyAssociation

Отображение коллекции связанных объектов (ManyToMany) на стороне объектов в пользовательском интерфейсе (UI).

Специализации (стереотипы UML)

Позволяют уточнить тип или поведение элементов модели.

Стандартные стереотипы

СтереотипНазначение
<<interface>>Интерфейс
<<enumeration>>Перечисление
<<abstract>>Абстрактный класс
<<tree_node>>Иерархическая сущность
<<map>>Объект, отображаемый на карте
<<categorized>>Объект, связанный с иерархической категорией
<<complex>>Комплексный тип

enumeration

Пример перечисления Status:

abstract

Пример абстрактного класса Document:

map

Сущность со стереотипом map должна реализовывать интерфейс IGeoObject:

Пример:

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

tree_node

Указание стереотипа tree_node означает, что класс наследует абстрактный класс TreeNode.

Пример:

categorized

Сущность со стереотипом categorized должна реализовывать интерфейс ICategorized:

Пример:

complex

Рекомендации по именованию

При наименовании классов, перечислений и других элементов модели придерживайтесь следующих правил:

  1. Используйте CamelCase:

    • Примеры: MyEntity, DemoObject, InvoiceItem
  2. Аббревиатуры также оформляйте в CamelCase:

    • Вместо RGPObject — пишите RgpObject
  3. Избегайте служебных или зарезервированных слов:

    • Не используйте имена вроде: System, Service, Class, Interface
  4. Не используйте обобщённые имена без контекста:

    • Не рекомендуется: Request, Response, Task, Object
    • Допустимо: RgpRequest, RgpResponse, RgpTask, RgpObject