Имя Класса
Атрибуты Класса
Атрибуты Класса
Операции Класса
Рис. 3.40. Графическое изображение класса на диаграмме классов
Обязательным элементом обозначения класса является его имя. На начальных этапах разработки диаграммы класс может обозначаться простым прямоугольником с указанием только его имени (рис. 3.40, а). В дальнейшем диаграммы описания классов дополняются атрибутами (рис. 3.40, б) и операциями (рис. 3.40, в).
Чтобы сразу отличить класс от других элементов языка иМЬ, секцию атрибутов и операций выделяют горизонтальной линией, даже если она является пустой. На рис. 3.41 приведены примеры графического изображения классов на диаграмме классов. В первом случае для класса «Прямоугольник»
Счет
Прямоугольник
Окно
проверить^)
показать() скрыть()
р1.Ронт1 р2.РоЫ
Исключения
б
Кредитная карточка просрочена
в
Рис. 3.41. Примеры графического изображения классов на диаграмме
(рис. 3.41, а) указаны только его атрибуты — точки на координатной плоскости, определяющие его местоположение. Для класса «Окно» (рис. 3.41, б) указаны только его операции (пока-зать(), скрыть()), секция атрибутов оставлена пустой. Для класса «Счет» (рис. 3.41, в), кроме операции проверки кредитной карточки, дополнительно изображена четвертая секция, в которой указано исключение — отказ от обслуживания просроченной кредитной карточки.
Имя класса
Имя класса должно быть уникальным в пределах диаграммы или совокупности диаграмм классов пакета. Оно указывается в первой верхней секции прямоугольника, записывается по центру секции имени полужирным шрифтом и должно начинаться с заглавной буквы. В качестве имен классов рекомендуется использовать одно или несколько существительных без пробелов между ними. Кроме того, в секции обозначения класса могут находиться ссылки на стандартные шаблоны или абстрактные классы, от которых образован данный класс и, соответственно, от которых он наследует свойства и методы.
Примерами имен классов могут быть такие существительные, как «Сотрудник», «Фирма», «Руководитель», «Покупатель», «Продавец» и многие другие, имеющие непосредственное отношение к моделируемой предметной области и функциональному назначению проектируемой системы.
Если класс не имеет экземпляров (объектов), то он называется абстрактным классом, его имя записывается курсивом так как любой текст, относящийся к абстрактному элементу.
Атрибуты класса
Во второй секции прямоугольника — графического изображения класса — записываются его атрибуты (attributes) или свойства. Стандартная запись атрибута в языке UML выглядит следующим образом:
<квантор видимостихимя атрибута>[кратность]
<тип атрибута> <исходное значение>{строка-свойство}
Квантор видимости может быть опущен — это означает, что видимость атрибута не указывается либо же должна принимать одно из трех возможных значений:
общедоступный (public) — обозначается «+»;
защищенный (protected) — обозначается «#»;
закрытый (private) — обозначается «-».
Имя атрибута — единственный обязательный элемент обозначения атрибута, представляет собой строку текста, которая используется в качестве идентификатора соответствующего атрибута и является уникальной в пределах данного класса.
Кратность атрибута показывает количество конкретных атрибутов данного типа, входящих в состав класса, и обозначается следующим образом:
[нижняя_граница1
верхняя_граница1,
нижняя_граница2.
верхняя_граница2, нижняя_границак
верхняя_границак],
где нижняя_граница и верхняя_граница являются положительными целыми числами, каждая пара которых служит для обозначения отдельного замкнутого интервала целых чисел. В качестве верхней границы может использоваться специальный символ «*», который означает произвольное положительное целое число, т. е. неограниченное сверху значение кратности соответствующего атрибута.
Если в качестве кратности указывается единственное число, то кратность атрибута принимается равной данному числу. Значения кратности из интервала следуют в монотонно возрастающем порядке без пропуска отдельных чисел, лежащих между нижней и верхней границами, соответствующие нижние и верхние границы интервалов включаются в значение кратности. Если же указывается единственный знак «*», то это означает, что кратность атрибута может быть произвольным положительным целым числом или нулем.
Могут использоваться следующие варианты задания кратности атрибутов:
[0..1] означает, что кратность атрибута может принимать значение 0 или 1. При этом 0 означает отсутствие значения для данного атрибута;
[0..*] или просто [*] означает, что кратность атрибута может принимать любое положительное целое значение, большее или равное 0;
[1..*] означает, что кратность атрибута может принимать любое положительное целое значение, большее или равное 1;
[1..5] означает, что кратность атрибута может принимать любое значение из чисел 1, 2, 3, 4, 5;
[1.-3,7.. 10] означает, что кратность атрибута может принимать любое значение из чисел 1, 2, 3, 7, 8, 9, 10;
[1..3,7-.*] означает, что кратность атрибута может принимать любое значение из чисел 1, 2, 3, а также любое положительное целое значение, большее или равное 7.
Если кратность атрибута не указана, то по умолчанию принимается ее значение, равное 1.
Тип атрибута указывается строкой текста, имеющей осмысленное значение в пределах пакета или модели, к которым относится рассматриваемый класс. Можно также определять тип атрибута в зависимости от языка программирования, который будет использоваться для реализации данной модели.
Например:
имя_студента [1..2] String здесь имя_студента является именем атрибута, тип атрибута String (строка)
Исходное значение служит для задания некоторого начального значения для соответствующего атрибута в момент создания отдельного экземпляра класса.
Например:
имя студента [1..2] : String = Иван.
Строка-свойство служит для указания фиксированных значе-ний атрибута. Эти значения не могут быть изменены в программе при работе с данным типом объектов. При отсутствии строки-свойства значение соответствующего атрибута может быть изменено в программе. Например, строка-свойство в записи атрибута стипендия Integer = {$50} означает фиксированную сумму стипендии для всех объектов класса «Студент». Запись данного атрибута в виде стипендия Integer = $50 означает, что при создании нового экземпляра Студент для него устанавливается по умолчанию стипендия в 50 долл. Но по результатам очередной сессии некоторые студенты могут получать надбавки к стипендии и именные стипендии, а кто-то будет лишен стипендии вовсе, о чем необходимо позаботиться в программе.
Операция
Операцией класса (методом класса) называется именованный сервис, который предоставляется по требованию любым объектом данного класса. Другими словами, операция — это абстракция того, что можно делать с объектом. Класс может содержать любое число операций (в частности, не содержать ни одной операции). Набор операций класса является общим для всех объектов данного класса.
Операции класса определяются в секции, расположенной ниже секции атрибутов. При этом можно ограничиться только указанием имен операций, оставив детальную спецификацию выполнения операций на более поздние этапы моделирования. Для именования операций рекомендуется использовать глаголы, соответствующие ожидаемому поведению объектов данного класса. Описание операции имеет следующий вид:
<квантор видимостихимя операции> (список параметров) <выражение типа возвращаемого значения>{строка-свойство}
Квантор видимости принимает такие же значения, как и в случае атрибутов класса, и может быть опущен. Вместо условных графических обозначений также можно записывать соответствующее ключевое слово: public, protected, private.
Имя операции представляет собой строку текста, которая используется в качестве идентификатора соответствующей операции, и поэтому должна быть уникальной в пределах данного класса. Имя является единственным обязательным элементом синтаксического обозначения операции.
Список параметров является перечнем разделенных запятой формальных параметров, каждый из которых может быть представлен в следующем виде:
<вид параметраХимя параметра>: <выражение типа>=<значение параметра по умолчанию>.
Вид параметра — это одно из ключевых слов in, out или inout со значением in по умолчанию. Имя параметра есть идентификатор соответствующего формального параметра. Выражение типа зависит от конкретного языка программирования и описывает тип возвращаемого значения для соответствующего формального параметра. Значение по умолчанию в общем случае представляет собой выражение для значения формального параметра.
Выражение типа возвращаемого значения также является зависимой от языка реализации спецификацией типа или типов значений параметров, которые возвращаются объектом после выполнения соответствующей операции. Операция может не возвращать никакого значения. Для указания кратности возвращаемого значения данная спецификация может быть записана в виде списка отдельных выражений.
Строка-свойство служит для определения значений свойств данного элемента. Строка-свойство может отсутствовать, если никакие свойства не специфицированы.
Операция, которая не может изменять состояние системы, обозначается строкой-свойством {запрос} ({query}). Другие операции могут изменять состояние системы, хотя и необязательно будут это делать.
Описание операции на самом верхнем уровне объявляет эту операцию на весь класс, при этом данная операция наследуется всеми потомками данного класса. Если в некотором классе операция не выполняется, то такая операция может быть помечена как абстрактная ({abstract}). Можно также записать сигнатуру операции курсивом, чтобы обозначить ее абстрактной. Подчиненное появление записи данной операции без свойства {абстрактная} указывает на тот факт, что соответствующий класс-потомок может выполнять данную операцию в качестве своего метода.
Пример:
+создать() — обозначает абстрактную операцию по созданию отдельного объекта класса, которая является общедоступной (public) и не содержит формальных параметров. Эта операция не возвращает никакого значения после своего выполнения.
3-6-4. Описание поведения системы. Диаграммы последовательностей, деятельности и состояний
Концептуальная модель характеризует статические свойства разрабатываемого программного обеспечения. Для описания особенностей его поведения, т. е. возможных действий системы, целесообразно использовать диаграммы последовательностей системы, системные события, системные операции, диаграммы деятельности, а при необходимости и диаграммы состояний объектов.
Диаграмма последовательностей системы (sequence diagram)
Диаграмма последовательностей системы — графическая модель, которая для определенного сценария варианта использования показывает динамику взаимодействия объектов во времени [1, 48].
Для построения диаграммы последовательностей системы необходимо:
идентифицировать каждое действующее лицо (объект) и изобразить для него линию жизни. Крайним слева на диаграмме изображается объект, который является инициатором взаимодействия (см. объект 1 на рис. 3.42). Правее изображается другой объект, который непосредственно взаимодействует с первым, и т. д.;
из описания варианта использования определить множество системных событий и их последовательность;
изобразить системные события в виде линий со стрелкой на конце между линиями жизни действующих лиц и системы, а также указать имена событий и списки передаваемых значений.
На диаграмме последовательности изображаются только те объекты, которые непосредственно участвуют во взаимодействии, и не показываются возможные статические ассоциации с другими объектами. При этом диаграмма последовательности имеет как бы два измерения. Одно — слева направо в виде вертикальных линий, каждая из которых изображает линию жизни отдельного объекта, участвующего во взаимодействии. Графически каждый объект изображается прямоугольником и располагается в верхней части своей линии жизни (рис. 3.42). Внутри прямоугольника записываются имя объекта и имя класса, разделенные двоеточием. При этом вся запись подчеркивается, что является признаком объекта, который представляет собой экземпляр класса.
Линия жизни объекта
Линия жизни объекта (object lifeline) служит для обозначения периода времени, в течение которого объект существует в системе и, следовательно, может потенциально участвовать во всех ее взаимодействиях. На диаграмме линия жизни изображается пунктирной вертикальной линией, ассоциированной с единственным объектом. Если объект существует в системе постоянно, то и его линия жизни должна продолжаться по всей плоскости диаграммы последовательности от самой верхней ее части до самой нижней (объекты 1 и 2 на рис. 3.42).
Если объекты разрушаются в какой-то момент для освобождения ресурсов системы, то их линия жизни обрывается в момент уничтожения. Для обозначения такого момента в языке UML используется специальный символ в форме латинской буквы «X» (объект 3 на рис. 3.42). Ниже этого символа пунктирная линия не изображается, поскольку соответствующего объекта в системе уже нет и этот объект должен быть исключен из всех последующих взаимодействий.
Фокус управления
Объекты на диаграмме последовательности могут находиться в двух состояниях, активном — непосредственно выполняя какие-либо действия, и пассивном, ожидая сообщения от других объектов. Чтобы явно выделить подобную активность объектов, в языке UML применяется специальное понятие, получившее название фокуса управления (focus of control). Фокус управления изображается в форме вытянутого узкого прямоугольника (см. объект 1 на рис. 3.42), верхняя сторона которого обозначает начало получения фокуса управления объекта (начало активности), а ее нижняя сторона — окончание фокуса управления (оконча-ние активности).
Сообщения
Как уже было сказано, диаграмма последовательности описывает динамику взаимодействий между множеством объектов. Каждое взаимодействие описывается совокупностью сообщений, которыми участвующие в нем объекты обмениваются между собой. Сообщение (message) представляет собой законченный фрагмент информации, который отправляется одним объектом другому. Объект, принявший сообщение, должен отреагировать на него какой-либо последовательностью действий, направленных на решение поставленной задачи.
Графически сообщения изображаются горизонтальными стрелками, соединяющими линии жизни или фокусы управления двух объектов на диаграмме последовательности (рис. 3.42).
Имя Объекта 1: Имя Класса 1
Имя Объекта 2: Имя Класса 2
Фокус управления
Символ разрушения объекта
Рис. 3.42. Различные графические примитивы диаграммы последовательности
На рис 3.43 можно увидеть пример построения диаграммы последовательности для моделирования процесса телефонного разговора с использованием обычной телефонной сети. Объектами в этом примере являются: два абонента а и Ь, два телефон-
о
о
d:
Телефонный
аппарат
с:
Телефонный
аппарат
А
а: Абонент
Л
Ь: Абонент
Поднять трубку
и
Тон-сигнал()
•Поворот
диска
*Набор цифры
Разговор
«send»
Звонок()
Соединение ()
«send»
Поднять
Соединение (а)
Соединение (Ь)
трубку
Опустить \
Закончить
Закончить раз
овор /
Опустить
трубку
разговор
«destroy»
т
трубку
т
-X /
Опустить трубку
После установления соединения абоненты а и Ь могут начать обмен информацинй
Рис. 3.43. Пример диаграммы последовательностей состояний
ных аппарата, коммутатор и сам разговор как объект моделирования.
Диаграммы деятельностей (activity diagram)
Для моделирования процесса выполнения операций в языке UML используются так называемые диаграммы деятельности. На этапе анализа требований и уточнения спецификаций диаграммы деятельностей позволяют конкретизировать основные функции разрабатываемого программного обеспечения.
Состояние действия
Под деятельностью в данном случае понимают задачу (операцию), которую необходимо выполнить вручную или с помощью средств автоматизации. Каждому варианту использования соот-
Бетствует своя последовательность задач. В теоретическом плане диаграммы деятельности являются обобщенным представлением алгоритма, реализующего анализируемый вариант использования. Графически состояние действия представляется прямоугольником со скругленными углами (рис. 3.44). Внутри этой фигуры записывается выражение действия (action-expression), которое должно быть уникальным в пределах одной диаграммы деятельности.
Разработать план проекта
index := number + 1
а 6
Рис. 3.44. Графическое изображение состояния действия: а — простое действие; б — выражение
Действие может быть записано на естественном языке, некотором псевдокоде или языке программирования. Рекомендуется в качестве имени простого действия использовать глагол с пояснительными словами (рис. 3.44, а). Если это возможно, то допускается запись действия на том языке программирования, на котором предполагается реализовывать конкретный проект (рис. 3.44, б).
Каждая диаграмма деятельности должна иметь единственное начальное и единственное конечное состояния (рис. 3.45). Саму диаграмму деятельности принято располагать таким образом, чтобы действия следовали сверху вниз. В этом случае начальное состояние будет изображаться в верхней части диаграммы, а конечное — в ее нижней части.
Рис. 3.45. Графическое изображение: начальное состояние; б — конечное состояния
Переходы
При построении диаграммы деятельности используются только нетриггерные переходы, т. е. такие, которые срабатывают сразу после завершения деятельности или выполнения соответствующего действия. Этот переход переводит деятельность в последующее состояние сразу, как только закончится действие в предыдущем состоянии. На диаграмме такой переход изображается сплошной линией со стрелкой.
Если из состояния действия выходит единственный переход, то он может быть никак не помечен. Если последовательно выполняемая деятельность должна разделиться на альтернативные ветви в зависимости от значения некоторого промежуточного результата (такая ситуация получила название ветвления, а для ее обозначения применяется специальный символ), то таких переходов несколько и сработать может только один из них. Именно в этом случае для каждого из таких переходов должно быть явно записано условие в квадратных скобках. При этом для всех выходящих из некоторого состояния переходов должно выполняться требование истинности только одного из них.
Графически ветвление на диаграмме деятельности обозначается небольшим ромбом, внутри которого нет никакого текста (рис. 3.46). В этот ромб может входить только одна стрелка от того состояния действия, после выполнения которого поток
т
Преобразовать уравнение к каноническому виду
Вычислить дискриминант
Символ
ветвления![]()
[дискриминант >= 0]
1
[дискриминант < 0]
Вычислить корни (корень) квадратного уравнения
Рис. 3.46. Фрагмент диаграммы деятельности для алгоритма нахождения корней
квадратного уравнения управления должен быть продолжен по одной из взаимно ис-^ючающих ветвей. Принято входящую стрелку присоединять к верхней или левой вершине символа ветвления. Выходящих стрелок может быть две или более, но для каждой из них явно указывается соответствующее условие перехода в форме булевского выражения.
На рис. 3.46 представлен фрагмент известного алгоритма нахождения корней квадратного уравнения. В общем случае после приведения уравнения второй степени к каноническому виду а х х + b х+ с = О в случае отрицательного дискриминанта уравнение не имеет решения на множестве действительных чисел, и дальнейшие вычисления должны быть прекращены. При неотрицательном дискриминанте уравнение имеет решение, корни которого могут быть получены на основе конкретной расчетной формулы.
Для представления параллельных процессов в языке UML используется специальный символ разделения и слияния параллельных вычислений или потоков управления. Таким символом является прямая черточка, которая изображается отрезком горизонтальной линии, толщина ее несколько шире основных сплошных линий диаграммы деятельности. При этом разделение (concurrent fork) имеет один входящий переход и несколько выходящих (рис. 3.47, а). Слияние (concurrent join), наоборот, имеет несколько входящих переходов и один выходящий (рис. 3.47, б).
I I I гт ^
Рис. 3.47. Графическое изображение: а — разделения; б — слияния параллельных потоков управления
На рис. 3.48 показан пример диаграммы деятельности процесса приготовления напитка.
Диаграммы состояний (statechart diagram)
Главное предназначение этой диаграммы — описать возможные последовательности состояний и переходов, которые в совокупности характеризуют поведение элемента модели в течение
его жизненного цикла. Диаграммы состояний используются для моделирования динамических аспектов системы. По большей части под этим подразумевается моделирование поведения реактивных объектов. Реактивным называется объект, поведение которого лучше всего характеризуется его реакцией на события, произошедшие вне его собственного контекста. У реактивного объекта есть четко выраженный жизненный цикл, когда текущее поведение обусловлено прошлым. Если внешние действия, изменяющие состояния системы, инициируются в произвольные случайные моменты времени, то говорят об асинхронном поведении модели.
Представьте себе моделирование поведения встроенной системы безопасности у себя дома. Она работает непрерывно, реагируя на внешние события, скажем, на разбитое окно. Порядок событий изменяет поведение системы. Например, обнаружение разбитого окна вызовет срабатывание сигнализации, только если система предварительно была активизирована. Поведение такой системы лучше всего описывается путем моделирования ее устойчивых состояний (например, Ожидание, Активна, Проверка и т. д.), событий, инициирующих смену состояния, и действий, выполняемых при каждой такой смене.
Автомат
Диаграмма состояний по существу является графом специального вида, который представляет некоторый автомат. Вершинами этого графа являются состояния, которые изображаются соответствующими графическими символами. Дуги графа служат для обозначения переходов из состояния в состояние. Диаграммы состояний могут быть вложены друг в друга, образуя вложенные диаграммы более детального представления отдельных элементов модели.
Простейший пример автомата с двумя состояниями демонстрирует ситуация с исправностью компьютера. Здесь рассматриваются два самых общих состояния: «исправен» и «неисправен» и два перехода: «выход из строя» и «ремонт». Графически эта информация может быть представлена в виде изображенной Диаграммы состояний компьютера (рис. 3.49).
Основными понятиями, описывающими автомат, являются состояние и переход. Предполагается, что система находится в
каком-либо состоянии в течение некоторого времени, тогда как переход объекта из состояния в состояние происходит мгновенно.
Состояние
Состояние (State) — это ситуация в жизни объекта, на протяжении которой он удовлетворяет некоторому условию, осуществляет определенную деятельность или ожидает какого-то события.
Состояние на диаграмме изображается прямоугольником со скругленными вершинами (рис. 3.50), который может быть разделен горизонтальной линией на две секции.
Имя состояния
Список внутренних действий в данном состоянии
Рис. 3.50. Графическое изображение состояний на диаграмме состояний
В прямоугольнике может располагаться «Имя состояния» (первая секция) и «Список внутренних действий в данном состоянии» (вторая секция). При этом под действием (action) в языке UML понимают некоторую атомарную операцию, выполнение которой приводит к изменению состояния или возврату некоторого значения.
Имя состояния
Имя состояния — это строка текста, начинающаяся с заглавной буквы, которая раскрывает содержательный смысл данного состояния. Имя является необязательным элементом. Рекомендуется в качестве имени использовать глаголы в настоящем времени (звенит, печатает, ожидает) или соответствующие причастия (занят, свободен, передано, получено).
Список внутренних действий
Эта секция содержит перечень внутренних действий или деятельностей, которые выполняются в процессе нахождения моделируемого элемента в данном состоянии. Каждое из действий записывается в виде отдельной строки и имеет следующий формат:
<метка-действия выражение-действия>
Метка действия указывает на обстоятельства или условия, при которых будет выполняться деятельность, определенная выражением действия. При этом выражение действия может использовать любые атрибуты и связи, которые принадлежат области имен или контексту моделируемого объекта. Если список выражений действия пустой, то разделитель в виде наклонной черты У может не указываться.
На рис. 3.51 показан пример состояния Считывает запись после открытия файла, содержащего несколько записей.
Считывает запись
символ / считать символ
конец _строки / проверить на конец строки
> )
Рис. 3.51. Пример состояния с непустой секцией внутренних действий
Начальное и конечное состояния описаны в разделе описания диаграммы деятельности (см. рис. 3.45).
Переход
Простой переход (simple transition) представляет собой отношение между двумя последовательными состояниями, которое Указывает на факт смены одного состояния другим. Пребывание моделируемого объекта в первом состоянии может сопровождаться выполнением некоторых действий, а переход во второе состояние будет возможен после завершения этих действий, а также после удовлетворения некоторых дополнительных условий. В этом случае говорят, что переход срабатывает. До срабатывания перехода объект находится в предыдущем от него состоянии, называемом исходным состоянием, или в источнике (не путать с начальным состоянием — это разные понятия), а после его срабатывания объект находится в последующем от него состоянии (целевом состоянии).
На диаграмме состояний переход изображается сплошной линией со стрелкой, которая направлена в целевое состояние (например, «выход из строя» на рис. 3.49). Рядом с линией может находиться строка текста, описывающая событие-триггер, вызывающее переход (в этом случае переход будет триггерным), и сторожевое условие, по которому осуществляется переход. В примере на рис. 3.49 переход сработает при возникновении события — «выход из строя».
Событие
Событие (Event) — это спецификация существенного факта, который происходит во времени и пространстве. В контексте автоматов событие — это стимул, способный вызвать срабатывание перехода.