Множественная и динамическая классификация

 

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

При однозначной классификации (single classification) любой объект принадлежит единственному типу, -который может быть унаследован от супертипов. Во множественной классификации (multiple classifica­tion) объект может быть описан несколькими типами, которые не обя­зательно должны быть связаны наследованием.

Множественная классификация отличается от множественного насле­дования. При множественном наследовании тип может иметь несколь­ко супертипов, но для каждого объекта должен быть только один тип. Множественная классификация допускает принадлежность объекта нескольким типам, при этом не требуется определять специальный тип.

В качестве примера рассмотрим тип Person (Личность), подтипами ко­торого являются Male (Мужчина) или Female (Женщина), Doctor (Док­тор) или Nurse (Медсестра), Patient (Пациент) или вообще никто (рис. 5.11). Множественная классификация позволяет некоторому


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

Если вы используете множественную классификацию, то должны быть уверены в том, что четко определили, какие комбинации являют­ся допустимыми. В языке UML версии 2 это осуществляется помеще­нием каждого обобщающего отношения в множество обобщения. На диаграмме классов вы помечаете линию обобщения с помощью имени множества обобщения, которое в UML 1 называется дискриминато­ром. Единственная классификация соответствует одному безымянно­му множеству обобщения.

По определению множества обобщения не пересекаются: каждый эк­земпляр супертипа может быть экземпляром только одного подтипа из данного множества. Если вы соединяете линии обобщений с одной стрелкой, то они должны входить в одно и то же множество обобще­ния, как показано на рис. 5.11. Альтернативный способ - изобразить несколько стрелок с одинаковой текстовой меткой.

В качестве иллюстрации отметим на диаграмме следующие допусти­мые комбинации подтипов: (Female, Patient, Nurse); (Male, Physiothera­pist (Физиотерапевт)); (Female, Patient) и (Female, Doctor, Surgeon (Хи­рург)). Комбинация (Patient, Doctor, Nurse) является недопустимой, по­скольку она содержит два типа из множества обобщения role (роль).

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

 

 


Динамическая классификация (dynamic classification) разрешает объ­ектам изменять свой тип в рамках структуры подтипов, а статическая классификация (static classification) этого не допускает. Статическая классификация проводит границу между типами и состояниями, а ди­намическая классификация объединяет эти понятия.

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