Обобщение вариантов использования

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

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

Для начала стоит напомнить, что обобщение демонстрирует отношение общее-частное, родитель-потомок. При этом говорят, что родитель обобщает в себе черты всех своих потомков, а потомок специализирует, уточняет черты своего родителя. При этом потомки могут:

  • Наследовать возможности родительского варианта использования
  • Вводить новые возможности
  • Переопределять (менять) унаследованные возможности.

Дочерний вариант использования автоматически наследует все возможности своего родителя. Однако не все возможности могут быть переопределены.

 Возможность ВИ Наследование  Добавление  Переопределение
 Отношение  +  +  —
 Точка расширения  +  +  —
 Предусловия  +  +  +
 Постусловия  +  +  +
 Шаг основного потока  +  +  +
 Альтернативный поток  +  +  +

Метод тегов

На диаграммах обобщение изобразить очень просто. Однако ВИ — это прежде всего текст, спецификация. Каким же образом осуществляется документирование обобщения в описаниях ВИ? Спецификация UML по этому поводу безмолвствует. Однако существует несколько довольно стандартных методов. Один из них предлагают в своей книге Дж. Арлоу и А. Нейштадт. Метод основан на использовании простого языка тегов. Есть два правила применения этого метода:

  • Каждый номер шага в потомке сопровождается номером эквивалентного шага родителя, если таковой имеется. Например: 1. (2.) Некоторый шаг
  • Если шаг потомка переопределяет шаг родителя, его номер сопровождается буквой «o» (overridden – переопределенный) и родительским номером шага. Например: 6. (о6.) Другой шаг.
 Возможность …  Использование
 Унаследована без изменения 3. (3.) Покупатель вводит запрашиваемый критерий
 Унаследована и перенумерована  6.2. (6.1.) Система сообщает Покупателя, что соотвествующие продукты не найдены
 Унаследована и переопределена  1. (о1.) Покупатель выбирает опцию «найти книгу»
 Унаследована, переопределена и перенумерована  1. (о1.) Покупатель выбирает опцию «найти книгу»5.2. (о5.1.) Система выводит на экран страницу с данными максимум пяти книг
 Добавлена  6.3. Система повторно выводит на экран страницу поиска «найти книгу»

Ниже представлен фрагмент диаграммы и примеры спецификаций вариантов использования, выполненных в соответствии с этим методом.

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

ВИ: Найти продукт
ID: 6
Краткое описание:
Клиент ищет продукт
Основное действующее лицо:
Клиент
Второстепенные действующие лица:
Нет
Предусловия:
Нет
Основной поток:
1. ВИ начинается, когда Клиент выбирает опцию «найти продукт»
2. Система запрашивает у Клиента критерий поиска
3. Клиент вводит запрашиваемый критерий
4. Система ищет продукты, соответствующие введенному критерию
5. Если система находит соответствующие продукты
5.1. Система выводит на экран список соответствующих продуктов
6. Иначе
6.1. Система сообщает Клиенту о том, что соответствующие продукты не найдены
Постусловия:
Нет
Альтернативные потоки:
Нет.

ВИ: Найти книгу
ID: 7
ID родителя: 6
Краткое описание:
Клиент ищет книгу
Основное действующее лицо:
Клиент
Второстепенные действующие лица:
Нет
Предусловия:
Нет
Основной поток:
1. (о1.) ВИ начинается, когда Клиент выбирает опцию «найти книгу»
2. (о2.) Система запрашивает у Клиента критерий поиска книги, включающий автора, название, ISBN или тематику
3. (3.) Клиент вводит запрашиваемый критерий
4. (о4.) Система ищет книги, соответствующие введенному критерию
5. (о5.) Если система находит соответствующие книги
5.1. Система выводит на экран текущий бестселлер
5.2. (о5.1.) Система выводит на экран данные по максимум пяти книгам
5.3. Для каждой книги система выводит название, автора, цену и ISBN
5.4. Пока есть другие соответствующие запросу книги, система предоставляет Клиенту опцию отображения следующей страницы с книгами
6. (6.) Иначе
6.1. Система выводит на экран текущий бестселлер
6.2. (о6.1.) Система сообщает Клиенту о том, что соответствующие книги не найдены
Постусловия:
Нет
Альтернативные потоки:
Нет

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

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

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

Как выявлять и изображать обобщение

Не могу удержаться, чтобы не привести несколько выдержек из книги Алистера Коберна «Современные методы описания функциональных требований к системе». Коберн дает ряд рекомендаций по использованию обобщения ВИ, а также по тому, как обнаруживать наличие такого обобщения. Интересный вывод можно сделать при внимательном прочтении рекомендаций автора: обобщения вообще можно избежать, заменив его иными формами отношения между вариантами использования.

*********Начало цитаты*****************************************************

Хорошим проверочным словом является обобщенный (т.е. определенного типа).
Будьте осторожны, когда говорите, что пользователь выполняет некоторую разновидность этого действия. Говоря так, вы получаете кандидата для обобщения.

Вот фрагмент варианта использования «Использовать банкомат»:
1. Клиент вводит карточку и PIN.
2. Банкомат удостоверяется в правильности номера счета и PIN клиента.
3. Клиент выполняет транзакцию, одну из:
Извлечь наличные
Внести наличные на счет
Перевести деньrи
Проверить баланс
Клиент выполняет транзакции, пока не выберет пункт меню
«завершить сеанс».
4. Банкомат возвращает карту.

Что выполняет клиент на шаге 3? Обобщенный ответ — «транзакцию». Для клиента существуют четыре типа транзакции. Слова «обобщенный» и «типа» предупреждают нас о присутствии обобщенной цели «Выполнить транзакцию». В версии с обычным текстом мы не замечаем, что применяем связь обобщения между вариантами использования. Мы просто перечисляем типы операций или транзакций, которые может выполнить пользователь, и идем дальше. В UML, однако, это служит сигналом для рисования стрелки обобщения.

На самом деле здесь две возможности. Можно игнорировать обобщение и просто включить определенные операции, как показано на рис. 2.

Рис.2. Изображение обобщения через включение

Можно также создать общий вариант использования «Выполнить одну транзакцию» и представить определенные операции в качестве его специализаций, как на рис. 3.

Рис. 3. Использование обобщения-специализации

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

Опасности обобщения

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

Рис. 4. Рискованное обобщение

Специализированное действующее лицо может выполнять любой вариант использования, который может выполнять главное (родительское) действующее лицо. Таким образом, служащий отдела продаж — это обобщенный старший агент. Многим людям это кажется трудным для понимания, но это соответствует форме и вполне корректно.

Другая специализация представляется вполне естественной: «заключение большой сделки» — специальный случай «заключения обычной сделки». Однако согласно правилу UML, специализированный вариант использования можно подставить везде, где упоминается общий вариант использования. Поэтому на рисунке показано, что обычный служащий отдела продаж может заключить большую сделку!

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

Рис.5 Правильное обобщение

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

Если вы все-таки используете обобщение, советую сделать обобщенный вариант использования пустым, как «Выполнить одну транзакцию» в вышеприведенном примере. Далее специализирующий вариант использования будет определять все поведение, и вам будет угрожать лишь одна, только что описанная ловушка.

*********Конец цитаты*****************************************************