← Назад к вопросам

Приведи пример extend в UML

2.0 Middle🔥 201 комментариев
#Нотации и диаграммы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Пример Extend в UML диаграммах

Что такое Extend

Extend — это отношение в UML диаграммах use case (вариантов использования), которое показывает, что один use case может опционально расширить функциональность другого use case при выполнении определённого условия.

Ключевые характеристики:

  • Расширяемый use case (базовый) может работать независимо без расширения
  • Расширяющий use case добавляет дополнительное поведение при соблюдении условия
  • Это отношение опциональное, не обязательное
  • Стрелка направлена от расширяющего use case к базовому

Отличие Extend от Include

Часто путают extend и include. Вот различие:

Include (включение):

  • Обязательное выполнение подсценария
  • Use case полностью зависит от включённого use case
  • Стрелка направлена от базового к включённому
  • Пример: "Оформление заказа" требует включения "Проверка доступности товара"

Extend (расширение):

  • Опциональное выполнение дополнительного сценария
  • Только при определённых условиях
  • Use case может работать без расширения
  • Пример: "Оформление заказа" может быть расширено сценарием "Применить скидку"

Практический пример: Система управления авиакассой

Рассмотрим систему для бронирования авиабилетов:

Пользователь (Actor)
    │
    ├─→ Поиск рейсов (Search Flights) [основной use case]
    │
    ├─→ Бронирование билета (Book Ticket) [основной use case]
    │       │
    │       ├─<<include>>─→ Выбор мест (Select Seats) [обязательно]
    │       │
    │       └─<<extend>>─→ Применить скидку (Apply Discount) [условие: код купона]
    │       │
    │       └─<<extend>>─→ Добавить страховку (Add Insurance) [условие: пожелание клиента]
    │
    ├─→ Оплата билета (Pay for Ticket) [основной use case]
    │       │
    │       ├─<<include>>─→ Валидация платёжных данных (Validate Payment) [обязательно]
    │       │
    │       └─<<extend>>─→ Применить рассрочку (Use Installment) [условие: сумма > 50000]
    │
    └─→ Получить электронный билет (Get E-Ticket)
            │
            ├─<<include>>─→ Отправить на email (Send Email) [обязательно]
            │
            └─<<extend>>─→ Отправить SMS уведомление (Send SMS) [условие: клиент выбрал опцию]

Текстовое описание сценариев

Base Use Case: "Бронирование билета"

Основной поток:

  1. Пользователь выбирает рейс
  2. Система запрашивает выбор мест (include - обязательно)
  3. Система предлагает применить скидку (extend - опционально, условие: есть код купона)
  4. Система предлагает добавить страховку (extend - опционально, условие: сумма > 5000 рублей)
  5. Система проводит оплату
  6. Система выдаёт электронный билет

Extending Use Case: "Применить скидку"

Условие выполнения: клиент имеет код скидки, сумма покупки > 1000 рублей

Сценарий расширения:

  1. Система предлагает ввести код скидки
  2. Пользователь вводит код
  3. Система проверяет валидность и проценты скидки
  4. Система применяет скидку к сумме
  5. Система отображает итоговую цену (включение стандартных шагов базового use case продолжается)

Альтернативный поток (если код неверный):

  • Система показывает ошибку
  • Расширение отменяется
  • Бронирование продолжается без скидки

Диаграмма в формате PlantUML

@startuml
actor User

rectangle "Booking System" {
    usecase UC1 as "Search Flights"
    usecase UC2 as "Book Ticket"
    usecase UC3 as "Select Seats"
    usecase UC4 as "Apply Discount"
    usecase UC5 as "Add Insurance"
    usecase UC6 as "Pay for Ticket"
    usecase UC7 as "Validate Payment"
    usecase UC8 as "Get E-Ticket"
    usecase UC9 as "Send SMS Notification"
    
    User --> UC1
    User --> UC2
    User --> UC6
    User --> UC8
    
    UC2 ..> UC3 : <<include>>
    UC2 ..> UC4 : <<extend>> [condition: has_coupon]
    UC2 ..> UC5 : <<extend>> [condition: amount > 5000]
    
    UC6 ..> UC7 : <<include>>
    
    UC8 ..> UC9 : <<extend>> [condition: customer_opted_sms]
}

@enduml

Ещё один пример: Система управления контентом (CMS)

Use Cases:

Редактор (Actor)
    │
    └─→ Создать статью (Create Article) [основной]
            │
            ├─<<include>>─→ Написать текст (Write Content) [обязательно]
            │
            ├─<<include>>─→ Установить категорию (Set Category) [обязательно]
            │
            └─<<extend>>─→ Добавить изображение (Add Image) 
                [condition: требуется оформление]
            │
            └─<<extend>>─→ Установить SEO параметры (Set SEO)
                [condition: статья для публикации на веб-сайте]
            │
            └─<<extend>>─→ Разослать уведомление подписчикам (Send Newsletter)
                [condition: статья с меткой 'важное']

Описание:

  • Include: Написание текста и установка категории всегда требуются
  • Extend: Добавление изображения может быть, если редактор решит
  • Extend: SEO параметры добавляются, только если статья для веб-публикации
  • Extend: Рассылка подписчикам происходит, только если статья помечена как 'важное'

Условия в Extend

Условие указывается в скобках на стрелке extend:

UseCase1 --<<extend>> [condition: выполняется_это_условие] --> UseCase2

Примеры условий:

  • [condition: amount > 1000]
  • [condition: user_is_premium]
  • [condition: payment_method == 'card']
  • [condition: first_purchase]
  • [condition: delivery_to_office]

Правила использования Extend

✓ Используйте Extend когда:

  • Функциональность опциональна и добавляется при определённом условии
  • Базовый use case работает корректно без расширения
  • Расширяющий use case имеет смысл только в контексте базового
  • Вы хотите моделировать альтернативные сценарии

✗ Не используйте Extend когда:

  • Функциональность обязательна (используйте Include)
  • Это совершенно независимый use case
  • Расширяющий use case может быть вызван отдельно без базового

Практический совет

При проектировании use case диаграмм спросите себя:

  1. "Может ли базовый use case выполниться без этого?" → Да = Extend, Нет = Include
  2. "Есть ли условие выполнения?" → Да = Extend, Нет = Include
  3. "Это дополнительное поведение?" → Да = Extend, Нет = Include

Это поможет правильно выбрать тип отношения между use case-ами.