Множественная и динамическая классификация
Классификация служит для обозначения отношения между некоторым объектом и его типом. В основных языках программирования предполагается, что объект относится к единственному классу. Но в XJML имеется больше возможностей для классификации.
При однозначной классификации (single classification) любой объект принадлежит единственному типу, -который может быть унаследован от супертипов. Во множественной классификации (multiple classification) объект может быть описан несколькими типами, которые не обязательно должны быть связаны наследованием.
Множественная классификация отличается от множественного наследования. При множественном наследовании тип может иметь несколько супертипов, но для каждого объекта должен быть только один тип. Множественная классификация допускает принадлежность объекта нескольким типам, при этом не требуется определять специальный тип.
В качестве примера рассмотрим тип Person (Личность), подтипами которого являются Male (Мужчина) или Female (Женщина), Doctor (Доктор) или Nurse (Медсестра), Patient (Пациент) или вообще никто (рис. 5.11). Множественная классификация позволяет некоторому
объекту иметь любой из этих типов в любом допустимом сочетании, при этом нет необходимости определять отдельные типы для всех возможных комбинаций.
Если вы используете множественную классификацию, то должны быть уверены в том, что четко определили, какие комбинации являются допустимыми. В языке UML версии 2 это осуществляется помещением каждого обобщающего отношения в множество обобщения. На диаграмме классов вы помечаете линию обобщения с помощью имени множества обобщения, которое в UML 1 называется дискриминатором. Единственная классификация соответствует одному безымянному множеству обобщения.
По определению множества обобщения не пересекаются: каждый экземпляр супертипа может быть экземпляром только одного подтипа из данного множества. Если вы соединяете линии обобщений с одной стрелкой, то они должны входить в одно и то же множество обобщения, как показано на рис. 5.11. Альтернативный способ - изобразить несколько стрелок с одинаковой текстовой меткой.
В качестве иллюстрации отметим на диаграмме следующие допустимые комбинации подтипов: (Female, Patient, Nurse); (Male, Physiotherapist (Физиотерапевт)); (Female, Patient) и (Female, Doctor, Surgeon (Хирург)). Комбинация (Patient, Doctor, Nurse) является недопустимой, поскольку она содержит два типа из множества обобщения role (роль).
Возникает еще один вопрос: может ли объект изменить свой класс? Например, когда банковский счет клиента становится пустым, он существенно меняет свое поведение. В частности, отклоняются некоторые операции, такие как «снять со счета» и «закрыть счет»
Динамическая классификация (dynamic classification) разрешает объектам изменять свой тип в рамках структуры подтипов, а статическая классификация (static classification) этого не допускает. Статическая классификация проводит границу между типами и состояниями, а динамическая классификация объединяет эти понятия.
Следует ли использовать множественную динамическую классификацию? Я полагаю, что она полезна для концептуального моделирования. Однако с точки зрения программного обеспечения на пути ее реализации слишком много препятствий. В подавляющем большинстве диаграмм UML вы встретите только однозначную статическую классификацию, поэтому она должна стать вашим обычным инструментом.