
98
выделить
еще
два
состояния
:
инициализация
(
до
начала
регистрации
студентов
на
курс
)
и
отмена
(
курс
исключается
из
расписания
).
Рис
. 3.26.
Диаграмма
состояний
для
класса
CourseOffering
Упражнение
13.
Создание
диаграммы
состояний
для
класса
CourseOffering
Для
создания
диаграммы
состояний
:
1
.
Щелкните
правой
кнопкой
мыши
в
браузере
на
нужном
классе
.
2.
В
открывшемся
меню
выберите
пункт
New > Statechart Diagram.
Чтобы
добавить
состояние
:
1
.
На
панели
инструментов
нажмите
кнопку
State
2.
Щелкните
мышью
на
диаграмме
состояний
в
том
месте
,
куда
хотите
его
поместить
.
Все
элементы
состояния
можно
добавить
с
помощью
вкладки
Detail
окна
спецификации
состояния
.
Чтобы
добавить
деятельность
:
1
.
Откройте
окно
спецификации
требуемого
состояния
.
2.
Перейдите
на
вкладку
Detail.
3.
Щелкните
правой
кнопкой
мыши
на
окне
Actions.
4.
В
открывшемся
меню
выберите
пункт
Insert.
5.
Дважды
щелкните
на
новом
действии
.
6.
Введите
действие
в
поле
Actions.
7.
В
окне
When
укажите
Do,
чтобы
сделать
новое
действие
деятельностью
.
Initialization
do/ initialize course offering
data
Open
entry/ Register student
exit/ ^CourseRoster.AddStudent(Student)
Closed
do/ Finalize course
Canceled
add student / set count=0 ^CourseRoster.create
add student[ count <
1
0 ]
cancel
^CourseRoster.delete
cancel
[ count =
1
0 ]

99
Чтобы
добавить
входное
действие
,
в
окне
When
укажите
On Entry.
Чтобы
добавить
выходное
действие
,
в
окне
When
укажите
On Exit.
Чтобы
послать
событие
:
1
.
Откройте
окно
спецификации
требуемого
состояния
.
2.
Перейдите
на
вкладку
Detail.
3.
Щелкните
правой
кнопкой
мыши
на
окне
Actions.
4.
В
открывшемся
меню
выберите
пункт
Insert.
5.
Дважды
щелкните
на
новом
действии
.
6.
В
качестве
типа
действия
укажите
Send Event.
7.
В
соответствующие
поля
введите
событие
(event),
аргументы
(arguments)
и
целевой
объект
(Target).
Чтобы
добавить
переход
:
1
.
Нажмите
кнопку
Transition
панели
инструментов
.
2.
Щелкните
мышью
на
состоянии
,
откуда
осуществляется
переход
.
3.
Проведите
линию
перехода
до
того
состояния
,
где
он
завершается
.
Чтобы
добавить
рефлексивный
переход
:
1
.
Нажмите
кнопку
Transition to Self
панели
инструментов
.
2.
Щелкните
на
том
состоянии
,
где
осуществляется
рефлексивный
переход
.
Чтобы
добавить
событие
,
его
аргументы
,
ограждающее
условие
и
действие
:
1
.
Дважды
щелкните
на
переходе
,
чтобы
открыть
окно
его
спецификации
.
2.
Перейдите
на
вкладку
General.
3.
Введите
событие
в
поле
Event.
4.
Введите
аргументы
в
поле
Arguments.
5.
Введите
ограждающее
условие
в
поле
Condition.
6.
Введите
действие
в
поле
Action.
Чтобы
отправить
событие
:
1
.
Дважды
щелкните
на
переходе
,
чтобы
открыть
окно
его
спецификации
.

1
00
2.
Перейдите
на
вкладку
Detail.
3.
Введите
событие
в
поле
Send Event.
4.
Введите
аргументы
в
поле
Send Arguments.
5.
Задайте
цель
в
поле
Send Target.
Для
указания
начального
или
конечного
состояния
:
1
.
На
панели
инструментов
нажмите
кнопку
Start State
или
End State.
2.
Щелкните
мышью
на
диаграмме
состояний
в
том
месте
,
куда
хотите
поместить
состояние
.
Уточнение
ассоциаций
:
некоторые
ассоциации
(
семантические
,
структурные
,
устойчивые
связи
по
данным
)
могут
быть
преобразованы
в
зависимости
(
неструктурные
,
временные
связи
,
отражают
видимость
),
а
агрегации
–
в
композиции
.
Рис
. 3.27.
Пример
преобразования
ассоциаций
и
агрегаций
0..n
+alternateCourses
0..2
+primaryCourses
0..4
0..
1
boolean
11
+ submitSchedule()
+ saveSchedule()
+ getCourseOfferings() : CourseOfferingList
+ getCurrentSchedule(forStudent : Student, forSemester :
Semester) : Schedule
+ deleteCurrentSchedule()
<<class>> + new(forStudent : string)
+ getStudent(withID : string) : Student
<<control>>
RegistrationController
(from Registration)
0..
1
+registrant
0..
1
<<entity>>
Student
(from University Artifacts)
<<entity>>
CourseOffering
(from University
Artifacts)
0..n
0..n
<<entity>>
Schedule
(from University
Artifacts)
<<Interface>>
ICourseCatalogSystem
(from External System
Interfaces)
0..
1
+currentSchedule
+ getTuition() : double
+ addSchedule(theSchedule : Schedule)
+ getSchedule(forSemester: Semester) : Schedule
+ deleteSchedule(forSemester: Semester)
+ hasPrerequisites(forCourseOffering : CourseOffering) :
boolean
# passed(theCourseOffering : CourseOffering) : boolean
<<class>> + getNextAvailID() : int
+ getStudentID():int
+ getName() : string
+ getAddress(): string

1
0
1
Чтобы
установить
преобразовать
агрегацию
в
композицию
:
1
.
Щелкните
правой
кнопкой
мыши
на
том
конце
агрегации
,
который
упирается
в
класс
-
часть
(
на
рис
.3.27 – Schedule).
2.
В
открывшемся
меню
выберите
пункт
Containment.
3.
Укажите
метод
включения
By Value.
Примечание
.
Значение
By Value
предполагает
,
что
целое
и
часть
создаются
и
разрушаются
одновременно
,
что
соответствует
композиции
.
Агрегация
(By Reference)
предполагает
,
что
целое
и
часть
создаются
и
разрушаются
в
разное
время
.
Уточнение
обобщений
:
в
случае
ситуации
с
миграцией
подклассов
(
студент
может
переходить
с
очной
формы
обучения
на
вечернюю
)
иерархия
наследования
реализуется
так
,
как
показано
на
рис
. 3.28 .
Такое
решение
повышает
устойчивость
системы
(
не
нужно
модифицировать
описание
объекта
).
Рис
. 3.28
Преобразование
обобщения
FulltimeClassification
- gradDate
<<entity>>
ParttimeClassification
- maxNumCourses
<<entity>>
Classification
Student.
- name : string
- address : string
<<class>> - nextAvailID : int
- studentID : int
- dateofBirth : Date
<<entity>>
1
1
1
1

1
02
3.6.4.
Проектирование
баз
данных
Проектирование
реляционных
баз
данных
выполняется
с
использованием
средства
Data Modeler.
Его
работа
основана
на
известном
механизме
отображения
объектной
модели
в
реляционную
.
Результатом
является
построение
диаграммы
«
сущность
-
связь
»
и
последующая
генерация
описания
БД
на
SQL.
Упражнение
14.
Проектирование
реляционной
базы
данных
Проектирование
БД
состоит
из
следующих
шагов
:
Создание
нового
компонента
–
базы
данных
:
1
.
Щелкните
правой
кнопкой
мыши
на
представлении
компонентов
.
2.
В
открывшемся
меню
выберите
пункт
Data Modeler > New >
Database.
3.
Откройте
окно
спецификации
вновь
созданного
компонента
DB_0
и
в
списке
Target
выберите
Oracle 8.x.
Определение
устойчивых
(persistent)
классов
:
1
.
Откройте
окно
спецификации
класса
Student
в
пакете
University
Artifacts.
2.
Перейдите
на
вкладку
Detail.
3.
Установите
значение
переключателя
Persistence
в
Persistent.
4.
Проделайте
такие
же
действия
для
классов
Classification,
FulltimeClassification
и
ParttimeClassification.
5.
Откройте
класс
Student
в
браузере
,
нажав
« + ».
6.
Щелкните
правой
кнопкой
мыши
на
атрибуте
studentID.
7.
В
открывшемся
меню
выберите
пункт
Data Modeler > Part of Object
Identity (
указание
атрибута
в
качестве
части
первичного
ключа
).
Примечание
.
Шаги
5, 6
и
7
можно
выполнять
в
Rational Rose,
начиная
с
версии
200
1
.
Создание
схемы
БД
:
1
.
Щелкните
правой
кнопкой
мыши
на
пакете
University Artifacts.
2.
В
открывшемся
меню
выберите
пункт
Data Modeler > Transform to
Data Model.