
23
типа
сотрудников
–
с
почасовой
оплатой
и
на
окладе
.
Таким
образом
,
мы
получаем
два
других
класса
HourlyEmp
и
SalariedEmp,
являющихся
потомками
класса
Employee.
Защищенный
атрибут
Address
можно
просмотреть
или
изменить
из
классов
Employee,
HourlyEmp
и
SalariedEmp,
но
не
из
класса
Company.
Нотация
UML
для
защищенного
атрибута
–
это
знак
« # ».
–
Package or Implementation (
пакетный
).
Предполагает
,
что
данный
атрибут
является
общим
,
но
только
в
пределах
его
пакета
.
Допустим
,
что
атрибут
Address
имеет
пакетную
видимость
.
В
таком
случае
он
может
быть
изменен
из
класса
Company,
только
если
этот
класс
находится
в
том
же
пакете
.
Этот
тип
видимости
не
обозначается
никаким
специальным
значком
.
+Hire()
+Fire()
+Promote()
+Demote()
+Transfer()
-Employee ID : Integer = 0
#SSN : String
#Salary : float
+Address : String
+City : String
+State : String
+Zip Code : long
+Departament : String
Employee
Рис
.
1
.8.
Видимость
атрибутов
В
общем
случае
,
атрибуты
рекомендуется
делать
закрытыми
или
защищенными
.
Это
позволяет
лучше
контролировать
сам
атрибут
и
код
.
С
помощью
закрытости
или
защищенности
удается
избежать
ситуации
,
когда
значение
атрибута
изменяется
всеми
классами
системы
.
Вместо
этого
логика
изменения
атрибута
будет
заключена
в
том
же
классе
,
что
и
сам
этот
атрибут
.
Задаваемые
параметры
видимости
повлияют
на
генерируемый
код
.

24
1.5.5.
Операции
Операции
реализуют
связанное
с
классом
поведение
.
Операция
включает
три
части
–
имя
,
параметры
и
тип
возвращаемого
значения
.
Параметры
–
это
аргументы
,
получаемые
операцией
«
на
входе
».
Тип
возвращаемого
значения
относится
к
результату
действия
операции
.
На
диаграмме
классов
можно
показывать
как
имена
операций
,
так
и
имена
операций
вместе
с
их
параметрами
и
типом
возвращаемого
значения
.
Чтобы
уменьшить
загруженность
диаграммы
,
полезно
бывает
на
некоторых
из
них
показывать
только
имена
операций
,
а
на
других
их
полную
сигнатуру
.
В
языке
UML
операции
имеют
следующую
нотацию
:
Имя
Операции
(
аргумент1
:
тип
данных
аргумента1
,
аргумент
2 :
тип
данных
аргумента
2, ...) :
тип
возвращаемого
значения
Следует
рассмотреть
четыре
различных
типа
операций
.
Операции
реализации
Операции
реализации
(implementor operations)
реализуют
некоторые
бизнес
-
функции
.
Такие
операции
можно
найти
,
исследуя
диаграммы
взаимодействия
.
Диаграммы
этого
типа
фокусируются
на
бизнес
-
функциях
,
и
каждое
сообщение
диаграммы
,
скорее
всего
,
можно
соотнести
с
операцией
реализации
.
Каждая
операция
реализации
должна
быть
легко
прослеживаема
до
соответствующего
требования
.
Это
достигается
на
различных
этапах
моделирования
.
Операция
выводится
из
сообщения
на
диаграмме
взаимодействия
,
сообщения
исходят
из
подробного
описания
потока
событий
,
который
создается
на
основе
варианта
использования
,
а
последний
–
на
основе
требований
.
Возможность
проследить
всю
эту
цепочку
позволяет
гарантировать
,
что
каждое
требование
будет
реализовано
в
коде
,
а
каждый
фрагмент
кода
реализует
какое
-
то
требование
.
Операции
управления
Операции
управления
(manager operations)
управляют
созданием
и
уничтожением
объектов
.
В
эту
категорию
попадают
конструкторы
и
деструкторы
классов
.

25
Операции
доступа
Атрибуты
обычно
бывают
закрытыми
или
защищенными
.
Тем
не
менее
,
другие
классы
иногда
должны
просматривать
или
изменять
их
значения
.
Для
этого
существуют
операции
доступа
(access operations).
Пусть
,
например
,
у
нас
имеется
атрибут
Salary
класса
Employee.
Мы
не
хотим
,
чтобы
все
остальные
классы
могли
изменять
этот
атрибут
.
Вместо
этого
к
классу
Employee
мы
добавляем
две
операции
доступа
–
GetSalary
и
SetSalary.
К
первой
из
них
,
являющейся
общей
,
могут
обращаться
и
другие
классы
.
Она
просто
получает
значение
атрибута
Salary
и
возвращает
его
вызвавшему
ее
классу
.
Операция
SetSalary
также
является
общей
,
она
помогает
вызвавшему
ее
классу
установить
новое
значение
атрибута
Salary.
Эта
операция
может
содержать
любые
правила
и
условия
проверки
,
которые
необходимо
выполнить
,
чтобы
зарплата
могла
быть
изменена
.
Такой
подход
дает
возможность
безопасно
инкапсулировать
атрибуты
внутри
класса
,
защитив
их
от
других
классов
,
но
все
же
позволяет
осуществить
к
ним
контролируемый
доступ
.
Создание
операций
Get
и
Set
(
получения
и
изменения
значения
)
для
каждого
атрибута
класса
является
стандартом
.
Вспомогательные
операции
Вспомогательными
(helper operations)
называются
такие
операции
класса
,
которые
необходимы
ему
для
выполнения
его
ответственностей
,
но
о
которых
другие
классы
не
должны
ничего
знать
.
Это
закрытые
и
защищенные
операции
класса
.
Чтобы
идентифицировать
операции
,
выполните
следующие
действия
:
1
.
Изучите
диаграммы
последовательности
и
кооперативные
диаграммы
.
Большая
часть
сообщений
на
этих
диаграммах
является
операциями
реализации
.
Рефлексивные
сообщения
будут
вспомогательными
операциями
.
2.
Рассмотрите
управляющие
операции
.
Может
потребоваться
добавить
конструкторы
и
деструкторы
.
3.
Рассмотрите
операции
доступа
.
Для
каждого
атрибута
класса
,
с
которым
должны
будут
работать
другие
классы
,
надо
создать
операции
Get
и
Set.

26
1.5.6.
Связи
Связь
представляет
собой
семантическую
взаимосвязь
между
классами
.
Она
дает
классу
возможность
узнавать
об
атрибутах
,
операциях
и
связях
другого
класса
.
Иными
словами
,
чтобы
один
класс
мог
послать
сообщение
другому
на
диаграмме
последовательности
или
кооперативной
диаграмме
,
между
ними
должна
существовать
связь
.
Существуют
четыре
типа
связей
,
которые
могут
быть
установлены
между
классами
:
ассоциации
,
зависимости
,
агрегации
и
обобщения
.
Ассоциации
Ассоциация
(association) –
это
семантическая
связь
между
классами
.
Их
рисуют
на
диаграмме
классов
в
виде
обыкновенной
линии
.
NewClass
NewClass2
Рис
.
1
.9.
Ассоциация
Ассоциации
могут
быть
двунаправленными
,
как
в
примере
,
или
однонаправленными
.
На
языке
UML
двунаправленные
ассоциации
рисуют
в
виде
простой
линии
без
стрелок
или
со
стрелками
с
обеих
ее
сторон
.
На
однонаправленной
ассоциации
изображают
только
одну
стрелку
,
показывающую
ее
направление
.
Направление
ассоциации
можно
определить
,
изучая
диаграммы
последовательности
и
кооперативные
диаграммы
.
Если
все
сообщения
на
них
отправляются
только
одним
классом
и
принимаются
только
другим
классом
,
но
не
наоборот
,
между
этими
классами
имеет
место
однонаправленная
связь
.
Если
хотя
бы
одно
сообщение
отправляется
в
обратную
сторону
,
ассоциация
должна
быть
двунаправленной
.
Ассоциации
могут
быть
рефлексивными
.
Рефлексивная
ассоциация
предполагает
,
что
один
экземпляр
класса
взаимодействует
с
другими
экземплярами
этого
же
класса
.

27
Зависимости
Связи
зависимости
(dependency)
также
отражают
связь
между
классами
,
но
они
всегда
однонаправлены
и
показывают
,
что
один
класс
зависит
от
определений
,
сделанных
в
другом
.
Зависимости
изображают
в
виде
стрелки
,
проведенной
пунктирной
линией
.
NewClass
NewClass2
Рис
.
1
.
1
0.
Зависимость
При
генерации
кода
для
этих
классов
к
ним
не
будут
добавляться
новые
атрибуты
.
Однако
,
будут
созданы
специфические
для
языка
операторы
,
необходимые
для
поддержки
связи
.
Например
,
на
языке
С
++
в
код
войдут
необходимые
операторы
#include.
Агрегации
Агрегации
(aggregations)
представляют
собой
более
тесную
форму
ассоциации
.
Агрегация
–
это
связь
между
целым
и
его
частью
.
Например
,
у
вас
может
быть
класс
Автомобиль
,
а
также
классы
Двигатель
,
Покрышки
и
классы
для
других
частей
автомобиля
.
В
результате
объект
класса
Автомобиль
будет
состоять
из
объекта
класса
Двигатель
,
четырех
объектов
Покрышек
и
т
.
д
.
Агрегации
визуализируют
в
виде
линии
с
ромбиком
у
класса
,
являющегося
целым
:
Whole
Part
Рис
.
1
.
11
.
Агрегация
В
дополнение
к
простой
агрегации
UML
вводит
более
сильную
разновидность
агрегации
,
называемую
композицией
.
Согласно