Кратность

Кратность (multiplicity) — это количество экземпляров одного класса, которые могут быть связаны с одним экземпляром другого класса через одну ассоциацию. Кратность ограничивает количество связанных между собой объектов. В литературе чаше всего рассматриваются два значения кратности: 1 и «много», но в общем случае кратность может быть потенциально бесконечным подмножеством неотрицательных целых чисел. На диаграммах UML кратность указывается явно около конца линии, которой обозначается ассоциация. Значение кратности указывается в виде диапазона, например «1» (ровно один), «1..*» (один и более) или «3..5» (от трех до пяти включительно). Специальный символ «*» обозначает слово «много» (many) — нуль и более.

Рисунок 5 демонстрирует ассоциацию многие-к-многим (кратность «много» на обоих концах). Человек может владеть акциями произвольного количества компаний. Владельцами акций конкретной компании может быть произвольное число людей. В нашем конкретном случае Джон и Мэри владеют акциями GE, Элис владеет акциями IBM, Сью является держателем акций обеих компаний, а Джефф вообще никаких акций не покупал. Акции GE принадлежат троим, a IBM — двоим держателям.

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

На рис. 7 приведен пример кратности нуль-или-один. Одно из окон рабочей станции может быть выделено для сообщений об ошибках. Однако можно и не выделять такого окна. (Слово console на диаграмме — это название полюса ассоциации.)

Не следует путать кратность с количеством элементов. Кратность (multiplicity) — это ограничение на размер совокупности, а количество элементов (cardinality) — это число элементов, которые фактически входят в совокупность. Следовательно, кратность ограничивает количество элементов.

 

Рисунок 6 – Ассоциация один-к-одному

 

Рисунок 7 – Ассоциация нуль-или-один

 

Кратность «много» указывает, что объект может быть связан с произвольным количеством объектов. Однако для каждой ассоциации между конкретной парой объектов может существовать только одна связь (за исключением мультимножеств и последовательностей). Если между двумя объектами должно быть две связи, необходимо создать две ассоциации (рис. 8 и 9).

 

Рисунок 8

Рисунок 9

 

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

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

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