UML. Диаграммы классов
Диаграммы классов – это краеугольный камень UML – большинство диаграмм, с которыми вам придется работать – это диаграммы классов. Помимо своего широкого применения, диаграммы классов концентрируют в себе большой диапазон понятий моделирования. Их основные элементы использутся прагтически всеми типами диаграмм. Диаграмма классов описывает типы объектов системы и различного рода статические отношения, которые существуют между ними. На диаграммых классов отображаются также свойства классов, операции классов и ограничения, которые накладываются на связи между объектами.
Свойства
Свойства представляют структурную функциональность классов. В первом приближении можно можно рассматривать свойства, как поля класса. Они представленны в виде атрибутов и ассоциаций.
Атрибут описывает свойство в виде строки текста внутри прямоугольника класса. Полная форма атрибута:
видимость имя: тип кратность=значение по умолчанию {свойства}
например:
count: int = 7 {readOnly}
Для аттрибута обязательно только имя.
Другая ипостась свойства – это ассоциация. Значительная часть информации, которую можно указать в аттрибуте, проявляется в ассоциации. Ассоциации – это непрерывная линия между двумя классами, направленная от исходного класса к целевому. Имя свойства вместе с кратностью располагается на целевом конце ассоциации.
Кратность.
Кратность свойства обозначает количество объектов, которые могут заполнять данное свойство. Чаще всего встречаются данные кратности:
1 – только 1. Например, только одна буква “а” в слове “пар”
0..1 – может быть или не быть. Например, второй двигатель у самолета
* — любое количество. Например, лепестков у цветка
В большинстве случаев кратности определяются своими нижней и верхней границами. Нижняя граница может быть нулем или положительным числом, верхняя граница представляет собой положительное число или *(без ограничений). Если верхняя и нижняя границы совпадают, то можно указать одно число, например 1..1 эквивалентно 1.
Операции
Операции представляют собой действия, реализуемые некоторым классом. Существует очевидное соответствие между операциями и методами класса. Обычно можно не показывать такие операции, которые просто манипулируют свойствами, поскольку они и так подразумеваются.
Полный синтаксис операции в языке UML выглядит следующим образом:
видимость имя(параметры) : возвращаемый тип {свойства}
Параметры в списке параметров обозначаются таким же образом, что и для атрибутов:
направление имя: тип = значение по умолчанию
Направление обозначает, является ли данный параметр входным или выходным. Например,
+switchOn ( on: bool ) : Result
Cледует различать операции, изменяющие состоя ние системы, и операции, не делающие этого. Язык UML определяет запрос как некую операцию, результатом которой является некоторое значение, получаемое от класса; при этом состояние системы не изме няется, то есть данная операция не вызывает побочных эффектов. Та кую операцию можно пометить строкой свойств {query} (запрос). Опе рации, изменяющие состояние, я называю модификаторами, иначе именуемые командами.
Строго говоря, различие между запросом и модификаторами состоит в том, могут ли они изменять видимое состояние. Видимое состоя ние – это то, что можно наблюдать извне. Операция, обновляющая кэш, изменит внутреннее состояние, но это не окажет никакого влия ния на то, что видно снаружи.
Другие термины, с которыми иногда приходится сталкиваться, – это методы получения значения (getting methods) и методы установки значения (setting methods). Метод получения значения возвращает некоторое значение из поля (и не делает ничего больше). Метод установ ки значения помещает некоторое значение в поле (и не делает ничего больше). За пределами класса клиент не способен определить, являет ся ли запрос методом получения значения или модификатор – методом установки значений. Эта информация о методах является исключи тельно внутренней для каждого из классов.
Генерализация
Один из трех ключевых признаков ООП – это наследование. Наследование позволяет увеличить используемость кода, сократить пространство для дебага и ускорить процесс разработки. Однако, наследование является не самым “чистым” сбособом использовать код многократно. Мы будем обсуждать этот вопрос в статьях, посвященных ООП.
В любом случае, вне зависимости от конкретного способа наследования функционала, UML позволяет показать, что один объект является подтипом другого. Такая связь называется генерализацией:
Реализация
Реализация – это способ показать наследование интерфейса в UML. Когда мы говорим, что класс A реализует интерфейс B, это значит, что мы можем обращаться к A методами B:
Last updated