Диаграмма классов UML (Unified Modeling Language — унифицированный язык моделирования) — статическая структурная схема, описывающая классы программной системы, их атрибуты, методы и отношения между ними. Строится до написания кода и служит архитектурным чертежом будущей системы.
Без предварительного проектирования объектно-ориентированный код быстро превращается в «спагетти»: зависимости размножаются хаотично, изменение одного класса ломает несколько других. Диаграмма классов позволяет выявить эти проблемы на этапе проектирования — до того, как они уйдут в продакшн.
Учитесь бесплатно за счёт государства
Экономия до 100 000 ₽ на любой программе
В статье разберём все элементы нотации — от трёхсекционного прямоугольника до кратности, — рассмотрим шесть типов связей, построим рабочий пример диаграммы классов UML для интернет-магазина и дадим советы по выбору инструментов.
Диаграмма классов — один из тринадцати типов диаграмм стандарта UML и единственный, охватывающий статическую структуру сразу: что существует в системе, какими данными обладает и как связано с остальными элементами.
Применяют её в двух основных контекстах. Первый — концептуальное моделирование предметной области: аналитик описывает сущности реального мира (Клиент, Заказ, Товар) без привязки к языку программирования. Второй — проектирование объектно-ориентированных систем: архитектор расставляет классы, интерфейсы и иерархии наследования до того, как разработчики начнут писать код на Java, C# или C++.
Если задача — описать только структуру базы данных, подойдёт ER-диаграмма (Entity-Relationship Diagram, диаграмма «сущность — связь»). Как только появляются операции над данными — диаграмма классов предпочтительнее: она фиксирует методы и поддерживает полный набор объектно-ориентированных отношений.
Диаграмма классов отвечает на вопрос «что есть в системе». Динамику — в каком порядке объекты обмениваются сообщениями — показывают диаграммы последовательности и кооперации. Статика и динамика вместе дают полную архитектурную картину.
Диаграмма строится из трёх видов строительных блоков: классов, атрибутов и методов. Каждый класс — прямоугольник с тремя горизонтальными секциями. Классы соединяются шестью типами отношений — о них подробнее в следующем разделе.
Класс изображается прямоугольником с тремя секциями:

Стандарт UML выделяет четыре разновидности. Обычный класс — базовый вариант, от которого создают объекты. Абстрактный — имя записывается курсивом; объекты от него не создаются, он служит базой для подклассов. Статический (utility-класс) — все члены принадлежат классу, а не объектам; имена членов подчёркиваются. Интерфейс — обозначается стереотипом «interface» над именем в двойных угловых скобках; содержит только сигнатуры методов без реализации.
Полная запись атрибута в нотации UML:
видимость имя : тип [кратность] = значение_по_умолчанию
Пример: — balance : Integer [1] = 0
Обязательные части — видимость и имя. Тип, кратность и значение по умолчанию добавляют по необходимости.
UML различает шесть видов атрибутов: простой (одно значение), составной (несколько компонентов, например адрес), однозначный (ровно одно значение), многозначный (коллекция значений), хранимый (сохраняется явно) и производный (вычисляется из других атрибутов — перед именем ставится /).
Синтаксис метода:
видимость имя(параметры) : тип_возврата
Пример: + calculateTotal(taxRate : Float) : Double
Методы именуются глаголом в стиле camelCase (строчная буква в начале, каждое последующее слово — с заглавной). На ранних этапах проектирования стандартные геттеры и сеттеры не детализируют — диаграмма должна передавать смысл архитектуры, а не дублировать будущий код.
Квантор видимости (модификатор доступа) определяет, из какого кода можно обратиться к атрибуту или методу. Он реализует принцип инкапсуляции — один из основополагающих принципов объектно-ориентированного программирования.
Стандарт UML определяет четыре уровня: + (public) — доступен из любого класса; − (private) — только внутри самого класса; # (protected) — внутри класса и всех его наследников; **~ (package)** — для классов того же пакета, аналог internal в C#. В отличие от Java и C#, UML не задаёт значение видимости по умолчанию — квантор указывают явно для каждого атрибута и метода.

Квантор видимости и проектирование на основе диаграмм — ежедневный инструментарий системного аналитика. Освоить UML-нотацию с нуля можно бесплатно в рамках нацпроекта «Кадры»: программа «Системный аналитик: с нуля до проектирования систем» (72 часа, онлайн) открыта для записи — подробности в каталоге программ.
Отношения — смысловое ядро диаграммы. Они показывают, как классы зависят друг от друга. Три из шести типов образуют иерархию по степени «сцепленности»: Ассоциация включает Агрегацию, а Агрегация — частный случай более сильной Композиции.
| Тип |
Символ |
Жизненный цикл части |
Пример |
|---|---|---|---|
| Ассоциация | → сплошная стрелка | Независимый | Студент → Курс |
| Агрегация | ◇→ незакрашенный ромб | Независимый | Отдел ◇→ Преподаватель |
| Композиция | ◆→ закрашенный ромб | Зависит от целого | Дом ◆→ Комната |
| Наследование | ——▷ незакрашенный треугольник | — | Собака ——▷ Животное |
| Реализация | — — ▷ пунктир + треугольник | — | PayPal — — ▷ Payment |
| Зависимость | — — → пунктирная стрелка | — | Report — — → Formatter |
Ассоциация — наиболее общий тип связи: один класс использует другой. Изображается сплошной стрелкой от класса-пользователя к классу, предоставляющему функциональность. Стрелку принято именовать глаголом: «создаёт», «управляет», «содержит». Кратность указывается рядом с концами стрелки.
Двунаправленная ассоциация — антипаттерн: она нарушает принцип единственной ответственности и порождает «спагетти»-зависимости. Если связь можно сделать однонаправленной — делают.
Зависимость — более слабое отношение, изображается пунктирной стрелкой. Если класс A зависит от класса B — изменение B может потребовать изменения A, но постоянной ссылки нет: например, метод принимает B как параметр или создаёт его локально.
Ключевой критерий разграничения — жизненный цикл части относительно целого.
Агрегация (◇ — незакрашенный ромб на стороне целого): часть существует независимо. Закрыли отдел — преподаватели продолжают работать в других подразделениях. Сняли колесо с автомобиля — колесо никуда не исчезло.
Композиция (◆ — закрашенный ромб): части неотделимы от целого и уничтожаются вместе с ним. Снесли дом — комнат больше нет. Закрыли окно в графическом интерфейсе — кнопки внутри него исчезли вместе с ним.
| Критерий |
Агрегация |
Композиция |
|---|---|---|
| Символ | ◇ незакрашенный ромб | ◆ закрашенный ромб |
| Жизненный цикл части | Независимый | Зависит от целого |
| Уничтожение целого | Часть выживает | Часть уничтожается |
| Пример целое → часть | Отдел → Преподаватель | Дом → Комната |
| Характер владения | «Мягкое» (временное) | «Жёсткое» (полное) |
Наследование — отношение «является» (is-a): подкласс наследует атрибуты и методы суперкласса и может расширять или переопределять их. Изображается сплошной линией с незакрашенным треугольником, направленным к суперклассу: Dog ——▷ Animal. Глубокие цепочки наследования (более трёх уровней) ухудшают читаемость — в таких случаях предпочтительна композиция.
Реализация — отношение между конкретным классом и интерфейсом. Изображается пунктирной линией с треугольником, направленным к интерфейсу. Аналог ключевого слова implements в Java и : IInterface в C#. Конкретный класс обязуется реализовать все сигнатуры, объявленные в интерфейсе.
Кратность (в ряде источников — множественность) показывает, сколько объектов одного класса может участвовать в отношении с объектом другого класса. Записывается рядом с концами стрелки связи.
| Запись |
Расшифровка |
Пример применения |
|---|---|---|
| [1] | Ровно один | Заказ принадлежит ровно одному покупателю |
| [0..1] | Ноль или один | Пользователь может не иметь аватара |
| [0..*] | Ноль или любое количество | Клиент — ноль или более заказов |
| [1..*] | Один или более | Заказ — хотя бы одна позиция |
| [m..n] | От m до n включительно | Команда — от 2 до 10 участников |
Для статических классов кратность не указывается — объекты от них не создаются. В реализациях на Java и C# многозначные атрибуты часто передают через типизированные коллекции List<T> или Map<K, V>, что делает явное указание кратности в атрибуте избыточным.
Чтобы закрепить нотацию, построим пример диаграммы классов для упрощённого интернет-магазина. Система включает шесть классов: Customer, Order, OrderItem, Product, Payment, а также два подкласса платёжных методов — CreditCardPayment и PaypalPayment.

Начнём с атрибутов и методов. Customer хранит — name : String и — email : String; метод + placeOrder() : Order. Order содержит — orderId : Integer и — status : String; метод + calculateTotal() : Double. Product хранит — productId : Integer, — name : String, — price : Double.
Расставим отношения:
Ниже — код в формате PlantUML — текстового инструмента для генерации UML-схем с экспортом в PNG и SVG:
@startuml
class Customer {
— name : String
— email : String
+ placeOrder() : Order
Хотите сменить профессию или повысить квалификацию?
Федеральный проект «Активные меры содействия занятости» даёт возможность пройти обучение бесплатно за счёт государства
}
class Order {
— orderId : Integer
— status : String
+ calculateTotal() : Double
}
class OrderItem {
— quantity : Integer
— unitPrice : Double
}
class Product {
— productId : Integer
— name : String
— price : Double
}
abstract class Payment {
— amount : Double
+ process() : Boolean
}
class CreditCardPayment {
— cardNumber : String
+ process() : Boolean
}
class PaypalPayment {
— paypalEmail : String
+ process() : Boolean
}
Customer «1» —> «0..*» Order : places
Order «1» *— «1..*» OrderItem : contains
OrderItem —> «1» Product
Order —> «1» Payment
CreditCardPayment —|> Payment
PaypalPayment —|> Payment
@enduml
Скопируйте код на plantuml.com или вставьте в расширение для VS Code — схема отрисуется автоматически.
Для создания диаграмм классов доступны инструменты двух типов.
Текстовые («диаграмма как код»): PlantUML и Mermaid (встроена в Markdown, совместима с GitHub и GitLab). Текстовое описание хранится в репозитории рядом с кодом и обновляется в том же наборе изменений, что и сама программа.
Визуальные: draw.io — бесплатный онлайн-редактор без регистрации, работает прямо в браузере. Visual Paradigm — коммерческий инструмент с поддержкой генерации диаграммы по текстовому описанию системы через встроенный искусственный интеллект.
Пять практик, которые улучшат диаграмму:
Диаграмма классов UML — статическая структурная диаграмма стандарта UML, описывающая классы системы, их атрибуты, методы и шесть типов отношений. Применяется при проектировании программного обеспечения до написания кода, анализе предметной области и обратном инжиниринге существующих систем.
Ключевое различие — жизненный цикл части. Агрегация (◇): часть существует независимо — закрыли отдел, преподаватели остались. Композиция (◆): части уничтожаются вместе с целым — снесли дом, комнат больше нет. Визуально: незакрашенный ромб против закрашенного на стороне класса-целого.
Квантор видимости определяет доступность атрибута или метода: + (public — любой класс), − (private — только внутри), # (protected — класс и наследники), ~ (package — в пределах пакета). В UML нет значения по умолчанию — указывается явно для каждого элемента.
Наследование — сплошная линия с незакрашенным треугольником, направленным к суперклассу. Подкласс наследует атрибуты и методы родителя. Пример: Dog ——▷ Animal. При глубоких цепочках наследования читаемость снижается — рекомендуется предпочитать композицию.
Абстрактный класс (имя курсивом): может содержать реализованные методы; объекты не создаются; служит базой для подклассов. Интерфейс (стереотип «interface»): только сигнатуры без реализации; конкретный класс связан с ним через отношение Реализации — пунктирная линия с треугольником.
[0..] — «ноль или любое количество объектов», указывается у конца стрелки отношения. Например, Customer «1» → «0..» Order: один клиент может не иметь заказов или иметь их любое количество. Символ * означает отсутствие верхней границы.
ER-диаграмма описывает только структуру данных — сущности и поля. Диаграмма классов UML дополнительно фиксирует методы (операции) и поддерживает наследование, агрегацию, зависимость. Она удобна для объектно-ориентированных систем, где важно не только что хранится, но и как обрабатывается.
Текстовые инструменты: PlantUML (хранение в Git) и Mermaid (встраивается в Markdown). Визуальный редактор: draw.io — бесплатно, без регистрации, прямо в браузере. Visual Paradigm предлагает генерацию диаграммы по текстовому описанию системы.
Подайте заявку —
забронируйте место в группе
45 000 мест на 2026 год. Бесплатное обучение по федеральному проекту «Активные меры содействия занятости»