Открытая коллекция знаний

OpenU.Ru

Справочник UML. Объектно-ориентированное проектирование.

template (шаблон)

Параметризованный элемент модели, для использования которого необходимо (во время моделирования) связать его параметры с фактическими значениями.
Синоним: parameterized element
См. binding; bound element.

Семантика

Шаблон представляет собой дескриптор элемента с одним или несколькими формальными несвязанными параметрами. Следовательно, он определяет целый ряд возможных элементов, которые образуются в результате связывания параметров шаблона с реальными значениями. Обычно параметры являются классификаторами, представляющими типы атрибутов (либо целые числа или даже операции). Производные элементы шаблона определяются с использованием формальных параметров, поэтому, когда происходит связывание шаблона, они тоже связываются с фактическими значениями.
Класс-шаблон - это дескриптор параметризованного класса. Тело шаблона может содержать формальные параметры, а также элементы по умолчанию, которые представляют сам шаблон. Фактический класс получается путем связывания параметров с реальными значениями. Атрибуты и операции класса-шаблона определяются, исходя из формальных параметров. Такой класс может иметь отношения между самим собой и одним из своих параметров - например, в виде ассоциации и обобщения. В результате связывания шаблона возникает отношение между связанным классом-шаблоном и классами, использованными в качестве параметров для этого связывания. Класс-шаблон нельзя использовать напрямую, так как у него есть несвязанные параметры. Для того чтобы создать реальный класс, нужно связать параметры класса-шаблона с фактическими значениями. Прямым предком или целью ассоциации может быть только реальный класс (впрочем, допускается односторонняя ассоциация, идущая от шаблона к другому классу). Класс-шаблон может быть подклассом любого обычного класса. При этом все классы, образованные путем связывания этою шаблона, будут являться подклассами данного класса. Класс-шаблон может также быть прямым потомком одного из параметров шаблона; при этом снизанный класс-шаблон является прямым потомком класса, переданного в виде аргумента. Параметризацию можно применять и к другим элементам модели, например к кооперациям и даже целым пакетам. Описание, которое мы приводим здесь для классов, можно отнести ко всем прочим элементам модели.
Содержимое шаблона не всегда должно отвечать правилам согласованности модели, так как параметры обретают окончательную семантику только после связывания с конкретными значениями. Шаблон представляет собой элемет второго уровня - он не используется непосредственно для моделирования системы, но с его помощью создаются другие элементы моделей. Таким образом, содержимое шаблона находится вне семантики системы. В результате связывания шаблона получаются обычные элементы модели, которые должны подчиняться правилам согласованности и выполнять предопределенную им роль в рамках разрабатываемой системы. Можно, конечно, определить правила согласованности и для шаблона - исходя из того факта, что производные от него элементы должны подчиняться этим правилам, однако мы не беремся их перечислить. Когда происходит связывание шаблона, его содержимое копируется и на место параметров становятся аргументы. Получившийся в результате элемент становится частью рабочей модели, как если бы он был включен в нее напрямую.
Параметризировать можно и другие виды классификаторов, - например, варианты использования и сигналы. Если параметризировать кооперации, то в результате получатся образцы.

Нотация

Для того чтобы изобразить на диаграмме шаблон, нужно наложить маленький пунктирный прямоугольник на правый верхний угол класса (или другого элемента модели). В этом пунктирном прямоугольнике содержится список формальных параметров класса. У каждого параметра есть имя и классификатор. Список не может быть пуст (в этом случае не было бы и самого шаблона), но в презентации его можно скрыть. Имя, атрибуты и операции параметризованного класса указываются обычным способом - внутри прямоугольника класса. При этом можно использовать формальные параметры. Точно так же дело обстоит и с другими видами параметризованных элементов Формальные параметры могут указываться в теле шаблона, например, чтобы показать некий класс, который идентифицируется одним из параметров.
Параметры имеют следующий синтаксис:

имя : тип

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

Рис. 180. Нотация шаблона с использованием параметра в качестве ссылки

Обсуждение

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

Рис. 181. Шаблон, содержащий отношение и одному из своих параметров
Тело шаблона косвенно содержит в себе элемент, который представляет собой экземпляр элемента самого шаблона, - например, класс, полученный при его связывании. Этот косвенный элемент можно использовать при моделировании отношений, например ассоциаций и обобщений, с параметрами шаблона. На диаграммах параметры изображаются внутри границ шаблона, а связь, идущая внутрь шаблона, указывает на существование отношения с непрямым экземпляром элемента шаблона. При создании экземпляра шаблона эти отношения переходят в результирующую модель, где связывают (только что полученный) связанный элемент шаблона и (существовавшие ранее) элементы, которые являются аргументами шаблона.
Шаблон может являться прямым потомком другого элемента. Это означает, что каждый связанный элемент, который был получен при помощи этого шаблона, является прямым потомком /чанного элемента. Возьмем, к примеру, рис. 181. где каждый массив переменной длины (VArray) является массивом (Array). Следовательно, VArray <Point> представляет собой прямого потомка Array, VArray<Address> - прямого потомка Array и т. д.
Как правило, шаблон не может быть прямым предком другого элемента. В противном случае это означало бы, что каждый элемент, полученный при связывании такого шаблона, должен быть прямым предком другого элемента. Наверное, можно увидеть некий смысл и в такой ситуации, но на наш взгляд она бессмысленна.
Наличие общего имени параметра у двух шаблонов не означает, что они связаны ассоциацией. (В противном случае это бы означало, что каждый экземпляр первого шаблона ассоциирован с каждым экземпляром другого шаблона, что едва ли может представлять собой цель моделирования. В прошлом авторы нередко неправильно истолковывали этот момент). Область действия параметра ограничена рамками его шаблона. Если вы используете одно и то же имя для параметров, находящихся в двух разных шаблонах, это не будет означать один и тот же параметр. В целом, если у двух шаблонов сеть параметризованные элементы, которые должны быть связаны между собой, то создание экземпляров одного шаблона должно происходить в теле другого шаблона. (Вспомните, что создание экземпляра шаблона косвенно происходит внутри его собственного тела. Следовательно, в теле создаются экземпляры обоих шаблонов, а отношения существуют между вновь созданными элементами.) На рис. 182. изображены две попытки смоделировать такое отношение - правильная и неправильная. В данном случае речь идет о параметризованном классе "указатель", который служит для указания на параметризованный массив того же вида.

Рис. 182. Ассоциации между шаблонами
Подобным образом происходит и объявление параметризованного класса, который является прямым потомком другого класса-шаблона, связанного с тем же параметром. Существует еще один подход - экземпляры обоих шаблонов создаются внутри третьего шаблона, которому принадлежит параметр. Этот параметр используется при связывании копии каждого из двух других шаблонов. После этого можно моделировать ассоциацию между копиями шаблонов, экземпляры которых были только что созданы. Однако в большинстве случаев в этом нет необходимости, поскольку отношение можно объявить в теле одною из шаблонов.

Алфавитный указатель