Отношение «extend»

В двух ситуациях создание расширяющих вариантов использования оправдано.

Наиболее распространенная ситуация — когда пользователь может применить много асинхронных или прерывающих выполнение услуг, которые не должны мешать базовому варианту использования. Часто эти услуги разрабатываются разными командами и проявляют себя при работе с «коробочным» программным продуктом, таким как текстовый редактор.

Другая ситуация — когда вы пишете дополнения к документу, излагающему зафиксированное описание требований

Алистер Коберн

Отношение «extend» предоставляет возможность ввести новое поведение в существующий вариант использования (рис.1). Базовый ВИ представляет собой набор точек расширения (extension points) — точек входа, в которые может быть добавлено новое поведение. А расширяющий ВИ предоставляет ряд сегментов вставки, которые можно ввести в базовый в места, указанные точками входа.

Рис. 1. Фрагмент диаграммы использования с отношением «extend»

В отношении «extend» любопытно то, что базовый ВИ ничего не знает о расширяющих ВИ, он просто предоставляет для них точки входа. Базовый ВИ абсолютно полон и без расширений. Это существенно отличает «extend» от отношения «include», где базовые ВИ остаются неполными без включаемых ВИ. Более того, точки расширения на самом деле не вводятся в поток событий базового ВИ; они накладываются поверх потока.

Точки расширения обозначаются в потоке событий базового ВИ, как показано на рис.2.

Рис. 2. Обозначение точек расширения

Пример 1

ВИ: Принять возврат книг
ID: 9
Краткое описание:
Библиотекарь принимает от читателя взятые ранее книги (книгу)
Основные действующие лица:
Библиотекарь
Второстепенные действующие лица:
Нет
Предусловия:
1. Библиотекарь вошел в систему
Основной поток:
1. Библиотекарь вводит ID читателя
2. Система выводит данные читателя, включая список взятых им книг
3. Библиотекарь находит возвращаемую книгу в списке книг
точка расширения: превышен срок (возврата)
4. Библиотекарь отмечает возврат книги

Постусловия:
1. Книга возращена
Альтернативные потоки:
Нет

Точки расширения также можно показать на диаграмме ВИ, перечислив их в новой ячейки пиктограммы базового ВИ.

Обратите внимание на то, что точки расширения в основном потоке не пронумерованы. Они появляются между нумерованными шагами потока. UML явно определяет тот факт, что точки расширения фактически существуют в слое поверх основного потока. Следовательно, они вообще не являются его частью. Этот слой подобен прозрачной пленке, наложенной поверх основного потока, на которую нанесены точки расширения. Основная идея введения этого слоя — сделать поток базового ВИ полностью независимым от точек расширения. Иначе говоря, поток базового ВИ не знает (или не интересуется), в каких точках происходит его расширение. Это позволяет использовать отношение «extend» для создания произвольных или специальных расширений потока базового ВИ.

При использовании «extend» базовый ВИ выступает в роли модульного каркаса, к которому можно подключать расширение в предопределенных точках расширения. В примерах на рис.2 в базовом ВИ «Принять возврат книги» точка расширения «превышен срок» находится между шагами 3 и 4 потока событий.

Отношение «extend» представляет собой хороший способ обработки исключительных ситуаций или ситуаций, когда нужен гибкий каркас, поскольку невозможно предсказать (или просто не известны) все возможные расширения.

Расширяющий вариант использования

Расширяющие ВИ обычно не являются полными вариантами использования, поэтому, как правило, их экземпляр не может быть создан. Обычно они состоят всего из одного или нескольких фрагментов поведения, называемых сегментами вставки. Отношение «extend» определяет точку расширения в базовом ВИ, в которой будет введен сегмент вставки. Здесь действуют следующие правила:

  • Отношение «extend» должно определять одну или несколько точек расширения базового ВИ. В противном случае предполагается, что отношение «extend» относится ко всем точкам расширения.
  • В расширяющем ВИ должно быть столько же сегментов вставки, сколько точек расширения определено в отношении «extend».
  • Два расширяющих ВИ могут «расширять» один базовый в одной и той же точке расширения. Но в этом случае порядок выполнения расширений не определен.

В примере на рис. 3 в расширяющем ВИ всего один сегмент вставки «Назначить штраф».

Рис. 3. Расширяющий ВИ с одним сегментом вставки

Пример 2

Расширяющий ВИ: Назначить штраф
ID: 10
Краткое описание:
Сегмент 1. Библиотекарь записывает и распечатывает штраф
Основные действующие лица:
Библиотекарь
Второстепенные действующие лица:
Нет
Сегмент 1 предусловия:
1. Возвращенная книга просрочена
Поток сегмента 1:
1. Библиотекарь вводит данные штрафа в систему
2. Система распечатывает штраф
Сегмент 1 постусловия:
1. Штраф записан в системе
2. Система распечатала штраф

Расширяющий ВИ может также иметь предусловия и постусловия. Предусловия должны быть выполнены, в противном случае сегмент не выполняется. Постусловия ограничивают состояние системы после выполнения сегмента.

У самих расширяющих ВИ могут быть расширяющие или включаемые ВИ. Однако лучше избегать такой вложенности, поскольку это сильно усложняет систему.

Несколько сегментов вставки

В расширяющем ВИ может быть несколько сегментов вставки. Это полезно в тех случаях, когда не получается полностью реализовать расширение в одном сегменте из-за того, что необходимо вернуться и что-то сделать в основном потоке базового ВИ. Обратимся к примеру, изображенному на рис. 4. Пусть после записи и распечатки штрафа выполнение возвращается в основной поток для обработки других просроченных книг, после чего в точке расширения «выплатить штраф» должнику предлагается заплатить общую сумму штрафа. Конечно, такая процедура более эффективна, чем взимание платежей по каждому штрафу в отдельности (так произошло бы, если бы эти два сегмента были сведены в один сегмент «Назначить штраф».

Рис. 4. Расширяющий ВИ с двумя сегментами вставки

Пример 3

Расширяющий ВИ: Назначить штраф
ID: 10
Краткое описание:
Сегмент 1. Библиотекарь записывает и распечатывает штраф
Сегмент 2. Библиотекарь принимает платеж по штрафу
Основные действующие лица:
Библиотекарь
Второстепенные действующие лица:
Нет
Сегмент 1 предусловия:
1. Возвращенная книга просрочена
Поток сегмента 1:
1. Библиотекарь вводит данные штрафа в систему
2. Система распечатывает штраф
Сегмент 1 постусловия:
1. Штраф записан в системе
2. Система распечатала штраф
Сегмент 2 предусловия:
1. Штраф взыскан с должника
Поток сегмента 2:
1. Библиотекарь принимает платеж по штрафу от должника
2. Библиотекарь вводит выплаченный штраф в систему
3. Библиотекарь распечатывает квитанцию об уплате штрафа
Сегмент 2 постусловия:
1. Штраф зарегистрирован как выплаченный
2. Система распечатала квитанцию об уплате штрафа

При создании расширяющих ВИ с несколькими сегментами необходимо четко нумеровать каждый сегмент, как показано в примере 3, поскольку здесь важен порядок сегментов: первый сегмент вставляется в первой точке расширения и т.д. Поэтому надо очень аккуратно записывать сегменты в правильном порядке, а затем придерживаться его.

Условные расширения

Пример на рис. 5 демонстрирует другой, более гуманный подход к должнику: если впервые он задержал книгу, выдается предупреждение, а штраф выписывается только при повторном нарушении правил. Это можно смоделировать путем добавления нового расширяющего ВИ «Выдать предупреждение» и введения условий в отношения «extend». Условия — это логические выражения, вставка осуществляется только в том случае, если выражение истинно.

Рис. 5. Добавление условного расширяющего ВИ

Пример 4

Расширяющий ВИ: Выдать предупреждение
ID: 11
Краткое описание:
Сегмент 1. Библиотекарь выдает предупреждение
Основные действующие лица:
Библиотекарь
Второстепенные действующие лица:
Нет
Сегмент 1 предусловия:
1. Возвращенная книга просрочена
Поток сегмента 1:
1. Библиотекарь вводит данные предупреждения в систему
Сегмент 1 постусловия:
1. Предупреждение записано в системе

Обратите внимание, что расширяющий ВИ «Выдать предупреждение» вводится только в точке «превышен срок». Однако (как и раньше) расширяющий ВИ «Назначить штраф» вводится и в точке «превышен срок», и в точке «выплатить штраф». Это свидетельствует о том, что «Выдать предупреждение» содержит только один сегмент вставки, тогда как «Назначить штраф» (как мы уже видели) — два.

Дополнительно рекомендую почитать книгу А. Коберна «Современные методы описания функциональных требований к системам». Отношениям «extend» посвящены раздел 10.2, приложение А.2. Также интересно будет перечитать главу 8.

Иллюстрации подготовлены с помощью лицензированного инструмента Sparx Systems Enterprise Architect v7.5

Материал подготовлен по книге Джима Арлоу и Айлы Нейштадта «UML 2 и Унифицированный процесс: практический объектно-ориентированный анализ и проектирование, 2-е издание»