Диаграмма классов 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 { … }

Порядок построения для курсовой

  1. Выписать существительные из описания предметной области — кандидаты в классы.
  2. Отсеять те, что являются атрибутами (телефон, дата) или действиями.
  3. Для каждого класса определить атрибуты и их типы.
  4. Определить методы: что объект умеет делать сам.
  5. Провести связи и проставить кратности.
  6. Проверить, что диаграмма согласуется с кодом: имена классов и полей совпадают.
Если в вашей работе есть база данных, диаграмма классов и ER-диаграмма должны соотноситься: таблицы обычно соответствуют классам-сущностям. Расхождение между ними — гарантированный вопрос комиссии.

Частые вопросы

Нужно ли показывать геттеры и сеттеры?

Нет, они загромождают диаграмму. Достаточно указать атрибуты с видимостью private — наличие аксессоров подразумевается.

Сколько классов должно быть?

Для курсовой обычно 7-15. Меньше — работа выглядит слишком простой, больше — диаграмма становится нечитаемой, тогда её разбивают на пакеты.

Читайте также

Сделаем работу по этой теме

Опишите задачу — ответим в течение 15 минут в личных сообщениях ВКонтакте, назовём срок и цену. Предоплаты за оценку нет.

  • Оценка заявки бесплатно
  • Правки по замечаниям преподавателя
  • Работы по всем техническим и IT-дисциплинам

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