Шаг 163.
Унифицированный язык моделирования UML.
Области расширения на диаграмме деятельности

    На этом шаге рассмотрим области расширения на диаграммах деятельности в UML.

    Часто одну и ту же операцию нужно выполнять для всех элементов набора. Например, если заказ включает в себя список позиций, обработчик заказа должен выполнить одну и ту же операцию для каждой строки этого списка: проверить наличие товара, посмотреть цену, узнать, облагается ли данная позиция налогом и т.д. Операции над списками часто моделируются в виде циклов, но при этом проектировщик должен предусмотреть проход по всем позициям, извлечь их все одну за другой, выполнить операцию, добавить результат в выходной массив, увеличить индекс и проверить цикл на завершенность. Механика выполнения цикла скрывает действительный смысл операции. Этот весьма часто применяемый образец можно смоделировать, применяя область расширения (expansion region).

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

    Затем область расширения исполняется для каждого элемента массива. Нет необходимости моделировать итерацию, – в области расширения она подразумевается неявно. Притом обработка нескольких элементов набора по возможности происходит параллельно. Когда завершается обработка элемента, его выходное значение, если оно есть, помещается в выходной массив в том же порядке, в котором элементы расположены во входном. Другими словами, область расширения выполняет операцию forall (для всех) над элементами существующего массива, чтобы создать новый.

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

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

    Рис. 1 демонстрирует пример области расширения.


Рис.1. Область расширения

    В основном теле диаграммы принимается заказ. Это событие генерирует значение типа Order (Заказ), которое состоит из значений типа LineItem (СтрокаЗаказа). Значение Order служит входным для области расширения.

    Каждое исполнение области расширения работает с одним элементом из набора Order. Поэтому внутри области тип входного значения соответствует одному элементу массива Order, а именно LineItem.

    Деятельность в пределах области расширения разделяется на две: одна находит Product (Продукт) и включает его в поставку, а другая вычисляет стоимость этой позиции. Необязательно обрабатывать элементы LineItem по порядку; разные выполнения области расширения могут происходить параллельно. После того как все элементы обработаны, из них формируется объект Shipment (Поставка) – набор продуктов, – а цены формируют Bill (Счет) – набор значений типа Money (Деньги). Значение объекта Shipment служит входным параметром деятельности ShipOrder (ОтгрузитьЗаказ), а значение объекта Bill – входным для деятельности SendBill (Выслать счет).

    На следующем шаге рассмотрим общее применение диаграмм деятельности.




Предыдущий шаг Содержание Следующий шаг