Диаграмма объектов
Объект представляет собой экземпляр класса – особую сущность, которая имеет заданные значения атрибутов и операций. Ваша стиральная машина, например, может иметь атрибуты: компания-производитель – Laundatorium, наименование модели – Washmeister, серийный номер изделия – GL57774 и емкость – 16 фунтов.
На рис. 17 показано, как объект представляется в обозначениях UML. Отметим, что объект изображается прямоугольником, как в случае представления класса, но его имя подчеркнуто. Наименование экземпляра размещено слева от двоеточия, а наименование класса – с правой стороны.
мояМашина:СтиральнаяМашина |
Рис. 17. Представление объекта в UML
Прямоугольник – это условное обозначение класса в UML. Именем класса обычно является слово, начинающееся с прописной буквы. Оно располагается вверху прямоугольника. Если имя класса состоит из двух слов, объедините их и второе слово тоже напишите с прописной буквы (например, Стиральная Машина, рис. 18).
СтиральнаяМашина |
Рис. 18. Обозначение класса в UML
|
|
Атрибуты
Атрибут – это свойство класса. Атрибуты описывают перечень значений, в рамках которых указываются свойства объектов (т.е. экземпляров) этого класса. Класс может не иметь атрибутов или содержать любое их количество. Имена атрибутов, состоящие из одного слова, принято обозначать строчными буквами. Если имя состоит из нескольких слов, то эти слова объединяются, и каждое слово, за исключением первого, начинается с прописной буквы. Список имен атрибутов начинается ниже линии, отделяющей их от имени класса (рис. 19, 20).
UML позволяет отображать дополнительную информацию об атрибутах. В изображении класса можно указать тип для каждого значения атрибута. Перечень возможных типов включает строку, число с плавающей точкой, целое число, логическое значение и другие перечислимые типы. Для отображения типа используется двоеточие, которое отделяет имя атрибута от его типа. Здесь же можно указать значение атрибута по умолчанию. На рис. 21 показан этот способ задания атрибутов.
WashingMachine |
brandName |
modelName |
serialName |
capacity |
Рис. 19. Класс и его атрибуты
myWasher:WashinqMashine |
brandName = "Laundatorium" |
modelName = "Washmeister" |
serialNumber = "GL57774" |
capacity =16 |
Рис. 20. Значения атрибутов класса
WashingMachine |
brandName: String = "Laundatorium" |
modelName: String |
serialNumber: String |
capacity: Integer |
Рис. 21. Типы атрибутов и значения по умолчанию
Перечислимый тип представляет собой информацию, заданную списком именованных значений. Логический тип также является перечислимым, потому что он состоит из значений «истина» и «ложь». Можно определить свои собственные перечислимые типы (например, Состояние), образованные из значений «твердое», «жидкое» и «газообразное».
|
|
Операции
Операция – это то, что может выполнять класс, либо то, что вы (или другой класс) можете выполнять над данным классом. Подобно имени атрибута, имя операции записывается строчными буквами, если это одно слово. Если имя состоит из нескольких слов, они соединяются, и все слова, кроме первого, пишутся с прописной буквы. Список операций начинается ниже линии, отделяющей операции от атрибутов (рис. 22).
Помимо дополнительной информации об атрибутах, можно отобразить дополнительную информацию об операциях. В скобках, следующих за именем операции, можно указать параметр операции и его тип. Один из типов операций, функция, по окончании работы возвращает значение. В этом случае можно указать возвращаемое значение и его тип.
Перечисленные фрагменты информации об операции носят название сигнатуры операции. На рис. 23 представлены операции класса и ее сигнатура.
WashingMachine |
brandName |
modelName |
serialNumber |
capacity |
addClothes() |
removeClothes() |
addDetergent() |
turnOn() |
Рис. 22. Операции класса и их сигнатуры
WashingMachine |
brandName |
modelName |
serialNumber |
capacity |
addClothes(C:String) |
removeClothes(С:String) |
addDetergent(D:Integer) |
turnOn():Boolean |
Рис. 23. Сигнатуры операций класса
Если имеющийся список атрибутов и операций слишком велик, можно уточнить информацию с помощью стереотипа. Стереотип – это механизм расширения UML, позволяющий создавать новые элементы с учетом особенностей решаемой задачи. Имя стереотипа заключается в две пары угловых скобок. В списке атрибутов стереотип можно использовать в качестве заголовка определенного подмножества атрибутов (рис. 24).
Стереотип является гибкой конструкцией, которую можно использовать по-разному. Например, если разместить его над именем класса, то можно указать дополнительную информацию о роли этого класса.
WashingMachine |
«идентификационные данные» |
brandName |
modelName |
serialNumber |
«данные о машине» |
capacity |
«для белья» |
addClothes() |
removeClothes() |
addDetergent() |
«для машины» |
turnOn() |
Рис. 24. Задание стереотипов
Обязанности и ограничения
На изображении класса можно указать и другую информацию о нем. В области, расположенной ниже списка операций, можно привести обязанности класса. Обязанность – это описание выполняемой классом функции, для которой и предназначены его атрибуты и операции. Стиральная машина должна принять на входе грязное белье и выдать чистое на выходе.
На изображении класса его обязанности перечисляются ниже области операций (рис. 25).
WashingMachine |
«идентификационные данные» |
brandName |
modelName |
serialNumber |
«данные о машине» |
capacity |
«для белья» |
addClothes() |
removeClothes() |
addDetergent() |
«для машины» |
turnOn() |
Обязанность: |
взять грязное белье на входе |
и выдать чистое |
на выходе |
Рис. 25. Обязанности класса
Главное заключается в том, чтобы наиболее точно описать класс, поэтому включение обязанностей является неформальным способом исключить двусмысленность описания.
Более формальным путем решения задачи является добавление ограничений в виде произвольного текста, заключенного в фигурные скобки. Этот текст задает одно или несколько правил класса, к которому он относится. Предположим, для класса WashingMachine нужно указать, что емкость барабана может составлять только 16, 18 или 20 фунтов (и таким образом «ограничить» атрибут емкости). Тогда рядом с изображением класса нужно написать (capacity = 16 или 18 или 20 фунтов). На рис. 26 показано, как это сделать.
WashingMachine | |
brandName | |
modelName | |
serialNumber | |
capacity | {capacity = 16 или 18 или 20 фунтов} |
addClothes() | |
removeClothes() | |
addDetergent() | |
turnOn() |
Рис. 26. Ограничения классов
Комментарии
Помимо атрибутов, операций, обязанностей и ограничений, дополнительную информацию о классе можно представить в виде комментариев, присоединенных к классу.
|
|
Комментарии обычно связаны с атрибутами и операциями. На рис. 27 приведен комментарий, ссылающийся на правительственный Стандарт по формированию номеров изделий для объектов класса WashingMachine.
WashingMachine | ||
brandName modelName serialNumber capacity | В соответствии с правительственным Стандартом EV-2241 о присвоении серийных номеров | |
addClothes() removeClothes() addDetergent() turnOn() |
Рис. 27. Типы атрибутов и значения по умолчанию
Комментарий наряду с текстом может содержать также и графические объекты.
Недостающая информация – это взаимодействие классов между собой. Если взглянуть на модель (рис. 28), то можно заметить отсутствие связи игрока с мячом. Из самой модели не понятно, как игроки образуют команду или как происходит игра. Сконструирован лишь список терминов, но не «снимок» предметной области.
Рассмотрим связи между классами, позволяющие дополнить картину предметной области.
Ассоциации
Если классы концептуально взаимодействуют друг с другом, то такое взаимодействие называется ассоциацией. Исходная модель игры в баскетбол содержит несколько подобных примеров. Рассмотрим одну ассоциацию – между игроком икомандой. Ее можно охарактеризовать фразой «игрок играет в команде» и отобразить в виде соединяющей два класса линии, указав имя ассоциации (играет в) прямо над этой линией. Для наглядности с помощью закрашенного треугольника указывается направление взаимосвязи. На рис. 28 показано, как изобразить ассоциацию «Играет в» между игроком и командой.
Рис. 28. Ассоциация между классами
Когда один класс ассоциируется с другим, каждый из них играет свою роль в этой ассоциации. Такие роли можно показать на диаграмме под линией ассоциации возле обозначения класса, выполняющего соответствующую роль. В ассоциации между профессиональным игроком и командой эти роли носят названия «наемный работник» и «наниматель». На рис. 29 показано, как изображать эти роли.
Рис. 29. Роль класса в ассоциации
|
|
Ассоциация может работать в другом направлении: команда нанимает игроков. Обе ассоциации можно показать на одной диаграмме, сопровождая их закрашенным треугольником соответствующей ориентации (рис. 30).
Рис. 30. Две ассоциации между классами
Ассоциации могут быть более сложными, чем просто связь одного класса с другим. Если рассмотреть таких игроков команды, как защитники, нападающие и центровые, то при построении их ассоциаций с классом Команда получим диаграмму, изображенную на рис. 31.
Рис. 31. Ассоциации нескольких классов с одним