OpenU.Ru
Отношение между расширяющим и базовым вариантами использования.
Описывает, каким образом поведение, определенное
для расширяющего варианта использования может быть внесено в, поведение, определенное
для базового варианта использования. Расширяющий вариант использования инкрементно
изменяет базовый вариант использования модульным путем.
См. extension point; include;
use case; use
case generalization.
Семантика
Отношение расширения связывает расширяющий вариант использования с базовым
вариантом использования. При этом расширяющий вариант использования не обязательно
должен быть классификатором, допускающим создание
экземпляров. Вместо этого он может состоять из одного или нескольких сегментов,
описывающих дополнительные последовательности поведения, которые инкрементно
изменяют поведение базового варианта использования. Каждый сегмент расширяющего
варианта использования можно вставить в отдельное место базового варианта использования.
У отношения расширения есть список имен точек
расширения, количество которых совпадает с количеством сегментов в расширяющем
варианте использования. При этом каждая точка расширения должна быть определена
в базовом варианте использования.
Когда выполнение экземпляра варианта использования точки расширения в базовом
варианте использования (и когда удовлетворены условия для расширения), осуществляется
выполнение соответствующего сегмента расширения из расширяющего варианта использования.
При завершении выполнения сегмента расширения управление возвращается к. исходному
варианту использования.
К одному базовому варианту использования можно применить несколько отношений
расширения. За время своей жизни экземпляр варианта использования может выполнить
несколько расширений. Если расширения базового варианта использования осуществляются
в одной точке несколькими вариантами использования, то эти расширения выполняются
в произвольной последовательности. Несколько отношений расширения могут существовать
даже между одними и темп же двумя вариантами использования, при условии, что
каждое расширение имеет свою точку расширения в базовом варианте использования.
Одни расширения даже могут расширять другие (при этом образуются вложенные расширения).
Расширяющий вариант использования имеет доступ к атрибутам базового варианта
и может изменять их. С другой стороны, базовый вариант использования "не
видит" расширения и не имеет доступа к их атрибутам или операциям. Базовый
вариант использования определяет каркас, и который могут быть добавлены расширения,
хотя они ему и не видны. Расширения неявно изменяют поведение базового варианта
использования. Обратите внимание на разницу между расширением и обобщением варианта
использования. В первом случае при создании экземпляров базового варианта использования,
к его действиям добавляются действия расширяющего варианта использования. В
случае обобщения при создании экземпляров варианта использования-потомка к его
действиям добавляются действия предка. При этом экземпляры варианта и с пользования-предка
не выполняют действия потомка.
Один расширяющий вариант использования может расширять несколько базовых вариантов.
В свою очередь, базовый вариант использования может быть расширен несколькими
различными расширяющими вариантами, причем это не указывает на какие-либо отношения
между базовыми вариантами использования.
Расширяющий вариант использования может сам быть базой для отношений расширения,
включения или обобщения.
Структура (расширяющего варианта использования)
Расширяющий вариант использования содержит список из одного или нескольких вносимых сегментов, каждый из которых представляет собой последовательность поведения.
Структура (базового варианта использования)
Базовый вариант использования определяет множество точек расширения, каждая из которых определяет одно или несколько мест, допускающих внесение дополнительного поведения.
Структура (отношения расширения)
У отношения расширения есть список имен точек расширения, которые должны присутствовать
в базовом варианте использования. Число таких имен должно равняться числу сегментов
в расширяющем варианте использования.
В отношениях расширения может быть условие. Оно представляет собой выражение,
построенное на основе атрибутов базового варианта использование, или же событие
(например, получение сигнала). Условие определяет, будет ли выполнен код расширяющего
варианта использования в тот момент, когда выполнение экземпляра варианта использования
достигнет места, на которое ссылается первая точка расширения. Если условие
отсутствует, то считается, что оно всегда истинно. Если условие есть, то выполнение
расширяющего варианта использования запускается только тогда, когда оно удовлетворено.
В том случае, когда точка расширения ссылается одновременно на несколько мест
базового варианта использования, расширяющий вариант использования может быть
выполнен в любой из них.
Если условие остается истинным, то расширение может быть выполнено несколько
раз. При этом все сегменты расширяющего варианта использовании выполняются одинаковое
количество pay. Ограничить количество выполнений можно при помощи того же условия.
Семантика выполнения
Когда экземпляр базового варианта использования достигает при выполнении того
места, на которое ссылается отношение расширения, происходит вычисление условия.
Расширяющий вариант использования выполняется, если это условие истинно (или
если оно вообще отсутствует). Часто условие включает в себя исполнение события
или наличие значений, необходимых для самого сегмента расширяющего варианта
использования, - например, сигнала от актанта, которое
инициирует запуск сегмента расширения. Условие может зависеть от состояния,
в котором находится экземпляр варианта использования, включая значения атрибутов
базового варианта использования. Если же собьтие не происходит или если условие
ложно, то выполнение расширяющего варианта использования не начинается. После
завершения выполнения сегмента расширения экземпляр базового варианта использования
продолжает выполнять базовый вариант использования с того места, где он прервался.
Если условие удовлетворено, то можно тут же осуществить вставку дополнительных
сегментов расширяющего варианта использования. В тех случаях, когда точка расширения
ссылается на несколько мест в базовом варианте использования, условие может
удовлетворяться в любом из них.
Когда в расширяющем варианте использования есть несколько вносимых последовательностей,
то все их сегменты выполняются, если условие удовлетворено в первой же точке
расширения. Для последовательных сегментов, которые вставляются в базовый вариант
использования, условие не пересчитывается. Между различными точками расширения
экземпляр продолжает выполнение базового варианта использования. Если выполнение
сегментов расширения началось, оно доводится до конца.
Интересно заметить, что в целом вариант использования представляет собой недетерминированный
конечный автомат (как в грамматике), а не выполнимую
процедуру. Это происходит, поскольку УСЛОВИЯ могут включать в себя и выполнение
внешних условий. Чтобы реализовать вариант использования в виде кооперации классов,
возможно, понадобится трансформировать его в явные механизмы управления, точно
так же, как приходится трансформировать грамматику программных конструкций в
форму выполнимого кода, который более эффективен, хотя и сложнее для понимания.
Обратите внимание на то, что термины базовый и расширение относительны. Одно
расширение может являться базой для следующего расширения. В этом нет ничего
сложного, все вышеизложенные правила остаются в силе. Предположим, что вариант
использования В расширяет вариант использования А в точке расширениях, А теперь
предположим, что вариант использования С расширяет вариант использования В в
точке у (рис. 96). Когда экземпляр варианта А приходит в точку х, начинается
выполнение варианта В. Когда выполнение варианта В доходит до точки у, начинается
выполнение варианта С. После завершения варианта С продолжается выполнение варианта
В, после чего выполняется вариант А. Все это соответствует вызовам вложенных
процедур или любым другим вложенным конструкциям.
Рис. 96. Вложенные расширения
Нотация
От символа расширяющего варианта использования к символу базового варианта использования
идет пунктирная стрелка. Наконечник стрелки направлен на базовый вариант. Около
стрелки ставится ключевое слово "extend". В скобках после ключевого
слова можно дать список имен точек расширения.
На рис. 97 изображены варианты использования, связанные отношением расширения.
На рис. 98 - последовательности поведения вариантов использования.
Рис. 97. Отношение расширения
Базовые варианты использования для ATM session (Сессия работы с автоматом):
show advertise men! of the day
include (identify customer) Включение расширения
include (validate account) Включение расширения
(сюда ссылается точка расширения} <--- <transaction possible>
print receipt header
(еще одна цель точки расширения) <---- <receipt details>
log out
Расширение вариантов использования с запросом (query):
segment Первый сегмент
receive request query
display query information
segment Второй сегмент
print withdrawal information
Расширение вариантов использования со снятием со счета (withdrawal):
segment Первый сегмент
receive request withdrawal
specify amount
(another extension point target) <---- <receipt details>
segment secretary ond segment
disburse cash
Расширение вариантов использования с арестованной карточкой:
segment Единственный сегмент
swallow the card
end the session
Рис. 98. Поведенческие сценарии для вариантов использования
Обсуждение
Отношения расширения, включения и обобщения сходны тем, что вносят в исходный
вариант использования дополнительное поведение. У них есть много общего, однако
на практике их лучше различать. В табл. 13.1 мы приводим сравнительные характеристики
всех трех отношений.
Таблица 1. Сравнение отношений вариантов использования
Свойство
Расширение
Включение
Обобщение
Базовое
ПОВСЛепИе
Базовый
Базовый
Прямой предок
Дополнительное повеление
Расширяющий
Включаемый
Прямой потомок
Направление ссылки
Расширяющий вариант ссылается на базовый
Базовый вариант ссылается на включаемый;
Прямой потомок ссылается на прямого предка
Изменяется ли база после введения
дополнительного поведения?
Расширение неявно меняет повеление балы. Базовый вариант должен быть хорошо
согласован и при отсутствии расширения, однако если расширение уже есть, то
оно может наполняться при работе экземпляра балы
Включение явно меняет результат работы базы. Без включения базовый вариант может,
как быть, так и не быть хорошо согласованным, однако если включение есть, то
оно выполняется при работе экземпляра базы
Прямой потомок не влияет на выполнение своего прямого предка. Для того чтобы
почувствовать результат отношения обобщения, нужно создать экземпляр прямою
потомка, а не прямого предка
Допускает ли дополнение создание экземпляров?
Расширение не всегда допускает создание Экземпляров. Оно может представлять
собой фрагмент
Включение не всегда допускает создание экземпляров. Оно может представлять собой
фрагмент
Прямой потомок не всегда допускает создание экземпляров. Он может быть абстрактным
Имеет ли дополнение доступ к атрибутам базы?
Расширение имеет доступ к состоянию базы и может изменять его
Включение имеет доступ к состоянию базы. База должна предоставить включению
соответствующие атрибуты
Прямой потомок имеет доступ к состоянию базы и может изменять его (с помощью
обычного механизма наследования)
Видит ли база дополнение?
База не видит расширения, она должна быть хорошо согласована на случай его отсутствия
База видит включение и может зависеть от его результатов, однако не имеет доступ
к атрибутам включения и не может менять их
Прямой предок не может видеть прямого потомка и должен быть хорошо, согласован
на случай его отсутствия
Повторение
Зависит от условия
Только одно повторение
Прямой потомок сам управляет своим выполнением