Диаграмма классов UML: как построить
Структура класса, видимость атрибутов, шесть типов связей — ассоциация, агрегация, композиция, наследование, реализация, зависимость. С примером и кодом.
Диаграмма классов — главная структурная диаграмма UML. По ней видно, из каких сущностей состоит система и как они связаны. Хорошая диаграмма классов почти дословно переводится в код.
Как изображается класс
┌─────────────────────────┐
│ Студент │ ← имя класса
├─────────────────────────┤
│ - id: int │ ← атрибуты
│ - фио: string │
│ # группа: Группа │
├─────────────────────────┤
│ + получитьСредний(): float │ ← методы
│ + добавитьОценку(о: Оценка): void │
└─────────────────────────┘
Видимость: + public - private # protected ~ package
Абстрактный класс пишут курсивом, интерфейс помечают стереотипом «interface» или кружком. Статические члены подчёркивают.
Шесть типов связей
| Связь | Обозначение | Смысл | В коде |
|---|---|---|---|
| Ассоциация | Сплошная линия | Объекты знают друг о друге | Поле-ссылка |
| Агрегация | Линия с пустым ромбом | Часть-целое, части живут отдельно | Поле, переданное извне |
| Композиция | Линия с закрашенным ромбом | Часть-целое, части умирают с целым | Поле, созданное внутри |
| Наследование | Линия с пустым треугольником | Является разновидностью | extends |
| Реализация | Пунктир с пустым треугольником | Реализует контракт | implements |
| Зависимость | Пунктир со стрелкой | Использует временно | Параметр метода, локальная переменная |
Кратность
1 ровно один 0..1 ноль или один * любое количество 1..* один или больше 2..5 от двух до пяти Студент 1 ──────── * Оценка читается: у одного студента много оценок, у оценки один студент
От диаграммы к коду
// Композиция: заказ создаёт свои позиции и владеет ими
class Order {
private List<OrderItem> items = new(); // ◆──
public void AddItem(Product p, int qty) =>
items.Add(new OrderItem(p, qty));
}
// Агрегация: клиент передан снаружи и живёт независимо
class Order {
private Customer customer; // ◇──
public Order(Customer c) => customer = c;
}
// Наследование и реализация
abstract class Document { public abstract void Print(); }
interface ISignable { void Sign(string who); }
class Contract : Document, ISignable { … }
Порядок построения для курсовой
- Выписать существительные из описания предметной области — кандидаты в классы.
- Отсеять те, что являются атрибутами (телефон, дата) или действиями.
- Для каждого класса определить атрибуты и их типы.
- Определить методы: что объект умеет делать сам.
- Провести связи и проставить кратности.
- Проверить, что диаграмма согласуется с кодом: имена классов и полей совпадают.
Частые вопросы
Нужно ли показывать геттеры и сеттеры?
Нет, они загромождают диаграмму. Достаточно указать атрибуты с видимостью private — наличие аксессоров подразумевается.
Сколько классов должно быть?
Для курсовой обычно 7-15. Меньше — работа выглядит слишком простой, больше — диаграмма становится нечитаемой, тогда её разбивают на пакеты.