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

OpenU.Ru

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

qualifier (квалификатор)

Слот для атрибута или списка атрибутов бинарной ассоциации, значения которого выбирают один уникальный объект (или множество объектов) из тех, которые связаны с данным объектом посредством ассоциации. Другими словами, квалификатор представляет собой индекс для прохождения ассоциации.
См. association class, association end.

Семантика

Бинарная ассоциация соотносит один объект и множество связанных с ним объектов. Иногда нужно выбрать один объект из общего множества - для этого берется значение, с помощью которого можно различать объекты в этом множестве. Таким значением может стать атрибут целевого класса. В общем случае, это значение представляет собой часть самой ассоциации (ее атрибут, значение которого предоставляется создающим элементом при добавлении роли связи в класс-ассоциацию). В бинарной ассоциации такой атрибут носит название квалификатора. Объект имеет со значением квалификатора определяет уникальный, связанный с ним объект или (что реже встречается) подмножество объектов. Это значение квалифицирует ассоциацию. В контексте реализации такой атрибут называется индексным значением.
Квалификатор используется для выбора одного или нескольких объектов ил целого множества объектов, связанных с другим объектом (квалифицированным объектом) посредством ассоциации (рис. 148). Объект, выбираемый при помощи квалификатора, называется целевым объектом. Квалификатор может присутствовать только в ассоциациях, имеющих в целевом направлении неограниченную множественность ("много"). Самый простой случай - это когда значение квалификатора выбирает один объект из целевого множества связанных с ним объектов. Другими словами, квалифицированный объект и значение квалификатора указывают на уникальный целевой объект. При этом каждая пара квалифицированного объекта и значения квалификатора соотносится с уникальным целевым объектом.
Квалификаторами являются многие виды имен, В определенном контексте такое имя соотносится с уникальным значением. Квалифицированный объект предоставляет этот контекст, квалификатор является именем, а целевой объект - результатом. Любой идентификатор или другой уникальный код является квалификатором, чье назначение состоит в уникальном выборе значения. Массив можно смоделировать в виде квалифицированной ассоциации, где он представляет собой квалифицированный объект, индекс массива - квалификатор, а элемент массива - целевой объект. В случае с массивом чином квалификатора будет ряд целых чисел.
Квалификатор можно использовать в выражении, описывающем навигацию, где он позволяет выбрать подмножество объектов, связанных с другим объектом посредством ассоциации, - то есть тех, у которых есть определенное значение атрибута квалификатора или список таких значений. Квалификатор служит селектором для множества объектов, связанных друг с другом при помощи ассоциации. Значение квалификатора разбивает это множество на несколько подмножеств. В большинстве случаев назначение квалификатора состоит в выборе одного объекта из множества связанных друг с другом объектов, таким образом, что квалифицированная ассоциация ведет себя как таблица соответствий.

Структура

Квалификатор. Атрибут квалификатора является необязательной принадлежностью полюса бинарной ассоциации. Он квалифицирует класс, прикрепленный к данному полюсу этой ассоциации. Для конкретного объекта и того класса значение квалификатора позволяет выбрать объект или множество объектов из класса, находящегося на противоположном полюсе бинарной ассоциации. Квалификаторы могут стоять у обоих полюсов бинарной ассоциации, однако это встречается нечасто.
Квалификатор представляет собой атрибут или список атрибутов ассоциации. У каждого атрибута есть имя и тип. Однако исходного значения у них нет, поскольку кодификаторы не являются отдельными объектами - значение квалификатора должно задаваться явно. При добавлении к ассоциации новой связи.
С n-арными ассоциациями квалификаторы не используются.
Множественность. Множественность квалифицированного отношения помещается на противоположном от квалификатора полюсе ассоциации. (Это можно запомнить так: квалифицированный класс и сам квалификатор образуют вместе композитное значение, которое связано с целевым классом.) Другими словами, квалификатор крепится к "ближнему" полюсу ассоциации, а множественность и имя роли - к "дальнему".
Множественность, стоящая у целевого полюса ассоциации, указывает, сколько объектов может быть выбрано с помощью пары (исходный объект + значение квалификатора). Обычно это множественность 0..1 (уникальное значение может быть выбрано, однако не каждое возможное значение квалификатора всенепременно выбирает значение), множественность 1 (каждое возможное значение квалификатора служит для выбора уникального целевого объекта, поэтому возможное количество значений квалификатора должно быть конечным) или же множественность (значение квалификатора представляет собой индекс, который делит все целевые объекты на подмножества произвольного размера).
В большинстве случаев употребляется первый вариант - множественность "нуль или единица". Она означает, что объект вместе со значением квалификатора могут выбрать из всего множества, самое большее, один связанный объект.
Множественность, равная единице, указывает, что с помощью каждого возможного значения квалификатора выбирается только один объект. Следовательно, в этом случае тип квалификатора должен иметь конечное множество значений (как минимум с точки зрения программной реализации). Этот вид множественности удобно использовать при соотнесении конечных типов перечислений - например, если Pixel (Пиксел) квалифицируется с помощью PrirnaryColor (ОсновнойЦвет), который представляет собой перечисление красного, зеленого и синего компонентов, то есть триплет значений "красно-зелено-синий" для каждого пиксела изображения. Множественность неквалифицированного варианта ассоциации явно не указывается. Как правило, считается, что это множественность "много" или, в любом случае, что она больше единицы. В противном случае этой ассоциации не понадобился бы квалификатор. Множественность "много", стоящая у квалифицированной ассоциации, не имеет особого семантического значения, поскольку в этом случае квалификатор не может уменьшить множественность целевого множества. Такая множественность представляет собой проектное указание то наличие индекса для прослеживания этой ассоциации. В этом случае квалификатор будет разделять множество целевых объектов на подмножества. С семантической точки зрения это ничем не отличается от атрибута ассоциации, который также (неявно) разделяет связи. Однако смысл именно такого проектирования состоит в том, что в проектной модели квалификатор обеспечивает эффективность прослеживания ассоциации - другими словами, при этом не потребуется линейный поиск среди всех целевых значений. Обычно это реализуется в виде таблицы соответствий. Чтобы смоделировать индекс в базе или структуре данных, его нужно смоделировать в виде квалификатора.
Множественность, указанная в обратном направлении квалифицированной ассоциации (то есть идущая от целевого класса к квалифицированному объекту), обозначает количество пар (квалифицированный объект + квалификатор), которые могут быть связаны с одним целевым объектом, а не число самих квалифицированных объектов. Иначе говоря, если несколько пар (квалифицированный объект + квалификатор) соотносятся с одним и тем же объектом, то обратная множественность неограничена ("много"). Обратная множественность, идущая от целевого объекта к квалификатору, равная единице, означает, что целевому объекту соответствует только одна пара квалифицированный объект-квалификатор.

Нотация

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

Варианты презентации

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

Обсуждение

Множественность квалифицированной ассоциации рассматривается так, будто квалифицированный объект и квалификатор представлявляет собой единую сущность, некий составной ключ. В прямом направлении множественность у целевого полюса ассоциации обозначает количество объектов, связанных с составным значением (квалифицированный объект + значение квалификатора), В обратном направлении множественность указывает на количество этих составных значений, связанных с каждым из целевых объектов (но не количество квалифицированных объектов, связанных с каждым из целевых объектов). Именно поэтому квалификатор помещается на самый конец маршрута ассоциации (полюс), вопле символа класса, - чтобы вы не подумали, что маршрут ассоциации соединяет составное значении с целевым классом.
Множественность неквалифицированного варианта отношения не указывают. Обычно в прямом направлении она представляет собой неограниченную множественность. Моделировать квалифицированную ассоциацию имеет смысл только тогда, когда с одним квалифицированным объектом связано много целевых. Логическое обоснование использования квалификатора состоит в том, что он позволяет уменьшить множественность до единицы - для этого нужно просто добавить квалификатор, и тогда запрос будет гарантировано возвращать одно, а не несколько значений. Квалификаторы незаменимы при моделировании особо сложных семантических условий, которые трудно отобразить другим образом. Почти все прогpaмные приложения содержат множество квалифицированных ассоциаций. Многие имена являются, на самом деле, квалификаторами. Вообще, если какое-либо имя в определенном контексте уникально, то оно представляет собой квалификатор, а его контекст должен быть соответствующим образом идентифицирован и смоделирован. Но не все имена являются квалификаторами. Например, имена людей не обладают уникальностью. Имена собственные неоднозначны, потому в большинстве программ для обработки данных для идентификации используются какие-либо цифры, например номер клиента, номер социального страхования или номер служащего. Если в функции разрабатываемого программного продукта входит поиск информации на основе поискового ключа, то его модель нужно создавать с использованием квалифицированных ассоциаций. Любой контекст, в котором имена или другие идентификационные коды используются для выборки объектов из множества, следует моделировать как квалифицированную ассоциацию.
Обратите внимание, что значение квалификатора является свойством связи, а не целевого объекта. Возьмем, к примеру, файловую систему в UNIX, где каждый каталог представляет собой список элементов, имена которых в данном каталоге уникальны, хотя и могут встречаться в других каталогах. Каждый такой элемент указывает на определенный файл, который может представлять собой файл данных или другой каталог. На один и тот же файл может указывать сразу несколько элементов. В этом случае у файла есть несколько альтернативных имен. Система каталогов в UNIX моделируется и виде ассоциации много-к-одному (many-to-one), в которой квалифицированный по имени файла каталог выдает один файл. Обратите внимание, что имя файла в данном случае не является частью этого файла, а представляет собой часть отношения, существующего между каталогом и файлом. У файла может быть несколько имен. Он может иметь различные имена в различных каталогах (и даже несколько различных имен в одном и том же каталоге). Имя файла не является его атрибутом.
Чаще всего необходимость в квалифицированных ассоциациях возникает, когда требуется создать модель важной семантической ситуации, обладающей сложной структурой данных реализации. В прямом направлении квалифицированная ассоциация представляет собой таблицу соответствий - иными словами, каждое значение квалификатора для квалифицированного объекта выдает один целевой объект (или нулевое значение, если значение квалификатора отсутствует во множестве имеющихся значений). Таблицы соответствий можно реализовывать в виде структур данных, таких как хэш-таблицы, Ь-деревьев и отсортированных списков, поиск в которых гораздо более эффективен, чем в несортированных, где он должен вестись линейным перебором. В абсолютном большинстве случаев реализация поиска по именам или коду в несортированной структуре данных: свидетельствует о плохом проектировании. Однако, как это ни печально, очень многие программисты поступают именно таким образом. При качественном программировании соответствующие ситуации должны моделироваться в виде квалифицированных ассоциаций, а реализовываться - при помощи эффективных структур данных. В логической модели квалифицированная ассоциация, у которой не ограничена множественность в прямом направлении, является бессмысленной, так как квалификатор не вносит никакой дополнительной информации, которую нельзя было бы выразить посредством атрибута ассоциации. В модели, предназначенной для проектирования алгоритмов и структур данных, кодификатор несет и дополнительную информацию, - а именно, об эффективности выборки значения при помощи квалификатора. Другими словами, квалифицированная ассоциация обозначает индексированную структуру данных, оптимизированную для поиска по значению квалификатора. В этом случае неограниченную множественность можно использовать для представления некоторого множества значений, доступ к которым должен осуществляться при помощи некоторого общего индекса, без необходимости поиска среди всех других значений.
Атрибут квалификатора не нужно включать в атрибуты целевого класса, так как достаточно его присутствия В ассоциации. Возможно, в случае индекса его значение потребуется взять из атрибутов целевого класса, то есть представить его как значение квалификатора. Значения индекса, по сути, избыточны.

Ограничения

Некоторые сложные ситуации невозможно смоделировать исключительно при помощи не избыточных отношений. Для их моделирования лучше всего использовать квалифицированные ассоциации, которые обозначают основные пути доступа, и добавить к ним ограничения. Однако такие ситуации встречаются довольно редко, и мы решили, что вносить в нотацию все возможные ограничения множественности не стоит.
Например, возьмем каталог (Directory), в котором каждое имя файла служит для идентификации конкретного уникального файла. Один файл (File) соответствует нескольким парам каталог-имя файла (filename). Это базовая модель, которую мы уже обсуждали. Она изображена на рис. 149.
Теперь мы хотим внести в модель дополнительные ограничения. Предположим, например, что каждый файл должен находиться только в одном каталоге, однако внутри этого каталога у него может быть несколько имен - то есть один и тот же файл можно именовать различными способами. Это можно смоделировать при помощи дополнительной ассоциации между классами File (Файл) и Directory (Каталог), где у класса Directory множественность равна единице (рис. 13,150), Избыточность этих двух ассоциаций указана с помощью ограничения {same}, который обозначает, что эти два элемента представляют собой одно и то же, но на различных уровнях детализации. Поскольку обе ассоциации описывают одно и то же, реализована будет только квалифицированная ассоциация - другая будет рассматриваться как ограничение ее времени выполнения.

Рис. 150. Файл, имеющий много имен в одном и том же каталоге
Похожим образом моделируется ситуация, в которой каждый файл может появляться в различных каталогах, но всегда под одним и тем же именем. Этим именем могут называться и другие файлы, однако они должны находиться в других каталогах. Это можно смоделировать, представив filename (имя файла) как атрибут класса File и определив ограничение, по которому атрибут класса должен совпадать с квалификатором (рис. 151). Такой образец часто используется при моделировании индекса поиска, хотя в общем случае индекса множественность квалифицированного целевого класса будет неограниченной. Таким образом, эта ситуация несет в себе больше семантического содержания, нежели индекс, который представляет собой просто механизм реализации.

Рис. 151. Файл, имеющий одно и то же имя во всех каталогах
В третьем случае мы разрешили файлу появляться в нескольких каталогах под различными именами, однако в каждом из каталогов этот файл не может появляться более одного раза. Это моделируется при помощи дополнительной квалифицированной ассоциации и класса ассоциации, которые разделяют общий атрибут filename (рис. 152).

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

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