UML Class диаграмма на собеседовании системного аналитика

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Карьерник — Duolingo для аналитиков: 10 минут в день тренируй SQL, Python, A/B, статистику, метрики и ещё 3 темы собеса. 1500+ вопросов в Telegram-боте. Бесплатно.

Зачем спрашивают на собесе SA

Class diagram — основа объектного моделирования. SA использует её для domain model, для описания сущностей системы и их связей. На собесе SA: «нарисуй class diagram для интернет-магазина», «отличие агрегации от композиции», «зачем кратность 0..* vs 1..*».

Главная боль без понимания — SA рисует ER-диаграмму вместо class diagram, разработчик не понимает, что такое наследование без ER-семантики.

Элементы Class diagram

Класс — прямоугольник с тремя секциями:

┌──────────────────┐
│      Order       │  ← название класса
├──────────────────┤
│ - id: Long       │
│ - amount: Decimal│  ← атрибуты
│ - status: Status │
├──────────────────┤
│ + create(): void │
│ + cancel(): void │  ← методы (операции)
│ + total(): Money │
└──────────────────┘

Атрибут: видимость имя: Тип = значение_по_умолчанию [кратность].

Метод: видимость имя(parameters): Тип.

Стереотип в «»: «interface», «abstract», «entity», «service», «controller» — для уточнения роли класса.

┌──────────────────┐
│  «interface»     │
│ PaymentMethod    │
└──────────────────┘

Видимость и атрибуты

Видимость:

  • + public
  • - private
  • # protected
  • ~ package

Спецификаторы:

  • /derived — вычисляемое (не хранится).
  • static (или подчёркнутый) — статическое.
  • abstract (или курсив).
- id: Long {readOnly}
+ /total: Money         ← вычисляется (sum of items)
- _DEFAULT_TAX: Float    ← static

В большинстве собесов SA достаточно показать видимость и тип. Детальные спецификаторы — только для глубокой архитектуры.

Связи: ассоциация, агрегация, композиция

Association (ассоциация) — простая структурная связь. Линия между двумя классами.

Order ─────────── Customer

Aggregation (агрегация) — отношение «часть-целое», но часть может существовать без целого. Полая ромбическая стрелка на стороне «целого».

Order ◇──── OrderItem

Если удалить Order — OrderItem может существовать (например, в архиве, в других заказах).

Composition (композиция) — сильное отношение «часть-целое»: часть НЕ существует без целого. Закрашенный ромб.

Order ♦──── ShipmentDetails

Если удалить Order — ShipmentDetails удаляется тоже. Lifecycle жёстко привязан.

Различие практически:

  • Заказ ↔ покупатель: association (заказ ссылается на покупателя, оба независимы).
  • Заказ ↔ товары заказа (OrderItem): композиция (товары имеют смысл только внутри заказа).
  • Заказ ↔ адрес доставки: композиция (адрес для конкретной поставки) ИЛИ агрегация (если используем общий адрес из user profile) — зависит от модели.

На собесе. Различение этих трёх — частый вопрос. Будь готов привести пример с rationale.

Кратность (multiplicity)

Сколько объектов одного класса соотносится с другим.

Customer  1 ────── *  Order
                       ↑ один Customer имеет 0+ Order'ов

Стандартные значения:

  • 1 — ровно один.
  • 0..1 — ноль или один (optional).
  • * — много (0 или больше).
  • 1..* — один или больше.
  • 0..* — то же что *.
  • 2..5 — диапазон.

Пример:

Order  1 ────── 1..*  OrderItem
       1 ────── 0..1  ShippingAddress
       *  ────── 1    Customer

«Заказ имеет 1+ позиций, опционально адрес доставки, ссылается на одного покупателя; покупатель может иметь 0+ заказов».

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Наследование и реализация

Generalization (наследование). Стрелка с пустым треугольником от потомка к родителю.

        Person
        ▲   ▲
        │   │
   Customer  Employee

«Customer и Employee — это специализации Person».

Realization (реализация интерфейса). Пунктирная стрелка с пустым треугольником.

        «interface»
       PaymentMethod
              ▲
              │ (пунктир)
              │
         CardPayment

«CardPayment реализует интерфейс PaymentMethod».

Когда наследование, когда композиция? «Composition over inheritance» — современный принцип. Наследование — только когда есть истинная «is-a» связь и поведение действительно общее. Иначе — композиция.

Когда class diagram, а когда ER

Class diagram:

  • Domain model для разработки.
  • Объектная архитектура с поведением (методы).
  • Полиморфизм и наследование.
  • Описание API в OOP-стиле.

ER (Entity-Relationship):

  • Схема БД.
  • Реляционная модель с PK / FK.
  • Без методов.
  • Кратность через 1:1, 1:N, N:M (другая нотация).

Часто:

  • На уровне analysis — class diagram (objects + behavior).
  • На уровне DB design — ER.
  • Они согласуются, но не идентичны.

N:M связи:

  • В ER — отдельная associative table.
  • В class — direct N:M или через association class.

Частые ошибки

Перепутать агрегацию и композицию. Запомни: композиция — lifecycle привязан. Агрегация — слабее. Если не уверен — обычно association достаточно.

Не указать кратность. Это критично — без кратности схема двусмысленна.

Записать имя класса в множественном числе. Класс — Order, не Orders. «Класс описывает один экземпляр».

Перенаследовать вместо композиции. Жирно и хрупко. Используй интерфейсы и композицию.

Слишком детально для analysis-уровня. На собесе SA не нужны все методы — только domain attributes и ключевые операции.

Стрелки наследования в неправильную сторону. Стрелка идёт от потомка к родителю (snake → animal), не наоборот.

Использовать class для описания БД. Получится монстр без поведения. Используй ER для БД.

Игнорировать association class. Если у связи N:M есть свои атрибуты («Студент-Курс с оценкой») — это association class, не просто line.

Связанные темы

FAQ

Можно ли совмещать class и ER на одной диаграмме?

Можно через стереотипы («entity», «table»), но обычно разделяют. Class — analysis. ER — database. Спецификации читаются разными людьми.

Как обозначить enum?

Класс с стереотипом «enumeration» и списком значений в секции атрибутов:

«enumeration»
OrderStatus
─────────────
PENDING
PAID
SHIPPED
CANCELLED

Что такое derived attribute?

Атрибут, вычисляемый из других. Помечается /. Пример: /total: Money — вычисляется как сумма items.

Как показать abstract метод?

Имя метода курсивом или с пометкой {abstract}. У interface-методов реализация по умолчанию отсутствует.

Бывает ли множественное наследование в UML?

Да, в самом UML есть. На практике большинство языков (Java, C#) запрещают, заменяют интерфейсами. Подсказка для собеса: «UML позволяет, но избегайте».

Это официальная информация?

Нет. Статья основана на спецификации UML 2.5 (OMG) и стандартных практиках.


Тренируйте системный анализ — откройте тренажёр с 1500+ вопросами для собесов.