Примеры диаграмм деятельностей
Пример: Диаграмма описания алгоритма функции «Модификация данных»
Рис. 6.75. Модификация данных
Пример: Диаграмма описания алгоритма функции «Удалить запись»
Рис. 6.76. Удалить запись
Классы
Классы – это самые важные строительные блоки любой объектно–ориентированной системы.
Классом (Class) называется описание совокупности объектов с общими атрибутами, операциями, отношениями и семантикой. Правильно сконструированный класс должен представлять одну и только одну абстракцию. Хорошо структурированные классы характеризуются четкими границами и помогают формировать сбалансированное распределение обязанностей в системе.
Класс представляет не индивидуальный объект, а целую их совокупность.
Многие языки программирования поддерживают концепцию классов. В этом случае создаваемые абстракции могут быть непосредственно отображены в конструкциях языка программирования, даже если речь идет об абстракциях не программных сущностей типа "покупатель", "торговля" или "разговор".
Графическое изображение класса в UML показано на рис. 6.77. Такое обозначение абстракции независимо от конкретного языка программирования и подчеркивает ее наиболее важные характеристики: имя, атрибуты и операции.
Рис. 6.77. Классы
У каждого класса есть имя, отличающее его от других классов. Имя класса – это текстовая строка. Взятое само по себе, оно называется простым именем. К составному имени впереди добавлено имя пакета, в который входит класс. Имя класса в объемлющем пакете должно быть уникальным. Например, java::awt::Rectangle. Имя класса может состоять из любого числа букв, цифр и ряда знаков препинания (за исключением таких, например, как двоеточие, которое применяется для отделения имени класса от имени объемлющего пакета). Имя может занимать несколько строк. На практике для именования класса используют одно или несколько коротких существительных, взятых из словаря моделируемой системы. Обычно каждое слово в имени класса пишется с заглавной буквы, например: Customer (Клиент).
Атрибут – это именованное свойство класса, включающее описание множества значений, которые могут принимать экземпляры этого свойства. Класс может иметь любое число атрибутов или не иметь их вовсе. Атрибут представляет некоторое свойство сущности, общее для всех объектов данного класса. В каждый момент времени любой атрибут объекта, принадлежащего данному классу, обладает вполне определенным значением. Атрибуты представлены их именами в разделе, который расположен под именем класса (рис. 6.78.).
Имя атрибута, как и имя класса, может быть произвольной текстовой строкой. На практике для именования атрибута используют одно или несколько коротких существительных, соответствующих некоторому свойству объемлющего класса.
При описании атрибута можно явным образом указывать его класс и начальное значение, принимаемое по умолчанию, как показано на рис. 6.78.
Рис. 6.78. Атрибуты и их класс
Операцией называется реализация услуги, которую можно запросить у любого объекта класса для воздействия на поведение. Иными словами, операция – это абстракция того, что позволено делать с объектом. У всех объектов класса имеется общий набор операций. Класс может содержать любое число операций или не содержать их вовсе. Часто (хотя не всегда) обращение к операции объекта изменяет его состояние или его данные. Операции класса изображаются в разделе, расположенном ниже раздела с атрибутами. При этом можно ограничиться только именами, как показано на рис. 6.79. Имя операции, как и имя класса, может быть произвольной текстовой строкой. На практике для именования операций используют короткий глагол или глагольный оборот, соответствующий определенному поведению объемлющего класса. Каждое слово в имени операции, кроме самого первого, обычно пишут с заглавной буквы, например move или isEmpty.
Рис. 6.79. Операции
Операцию можно описать более подробно, указав ее сигнатуру, в которую входят имена и типы всех параметров, их значения, принятые по умолчанию, а применительно к функциям – тип возвращаемого значения, как показано на рис. 6.80.
Рис. 6.80. Операции и их сигнатуры
При изображении класса необязательно показывать все его атрибуты и операции. Их может быть много для одного рисунка. Поэтому нужно указывать наиболее важные атрибуты и операции или совсем опускать их. Таким образом, пустой раздел в соответствующем месте прямоугольника может означать не отсутствие атрибутов или операций, а только то, что их не сочли нужным изобразить. Явным образом наличие дополнительных атрибутов или операций можно обозначить, поставив в конце списка многоточие.
Для лучшей организации списков атрибутов и операций можно снабдить каждую группу дополнительным описанием, воспользовавшись стереотипами.
Обязанности (Responsibilities) класса – это своего рода контракт, которому должен подчиняться класс. Соответствующие атрибуты и операции являются теми свойствами, посредством которых выполняются обязанности класса.
Моделирование классов лучше всего начинать с определения обязанностей сущностей. Число обязанностей класса может быть произвольным, но на практике хорошо структурированный класс имеет по меньшей мере одну обязанность. С другой стороны, их не должно быть и слишком много. При уточнении модели обязанности класса преобразуются в совокупность атрибутов и операций, которые должны наилучшим образом обеспечить их выполнение.
Графически обязанности изображают в особом разделе в нижней части пиктограммы класса (рис. 6.81.). Их можно указать также в примечании.
Рис. 6.81. Обязанности
Кроме того, иногда приходится визуализировать или специфицировать и другие особенности классов: видимость отдельных атрибутов и операций, специфические для конкретного языка программирования свойства операции или исключения, которые объекты класса могут возбуждать или обрабатывать.
Классы редко существуют сами по себе. При построении моделей следует обращать внимание на группы взаимодействующих между собой классов. В языке UML такие сообщества принято называть кооперациями и изображать на диаграммах классов.
Надо избегать слишком больших или, наоборот, чересчур маленьких классов. Каждый класс должен хорошо делать что–то одно. Язык UML способен помочь в визуализации и специфицировании баланса обязанностей.
Хорошо структурированный класс обладает следующими свойствами:
является четко очерченной абстракцией некоторого понятия из словаря проблемной области или области решения;
содержит небольшой, точно определенный набор обязанностей и выполняет каждую из них;
поддерживает четкое разделение спецификаций абстракции и ее реализации;
понятен и прост, но в то же время допускает расширение и адаптацию к новым задачам.