Вендров А.М., Малышко В.В. Объектно-ориентированный анализ и проектирование с использованием языка UML
.pdf3.Управляющие классы (Control) – обеспечивают координацию поведения объектов в системе. Могут отсутствовать в некоторых вариантах использования, ограничивающихся простыми манипуляциями с хранимыми данными. Как правило, для каждого варианта использования определяется один управляющий класс. Примеры управляющих классов: менеджер транзакций, координатор ресурсов, обработчик ошибок.
Пример набора классов, участвующих в реализации варианта использования Register for Courses, приведен на рис. 3.6.
<<boundary>> |
|
<<boundary>> |
RegisterForCoursesForm |
|
CourseCatalogSystem |
|
|
|
|
|
|
<<control>> RegistrationController
<<entity>> |
|
<<entity>> |
|
|
|
|
<<entity>> |
||
Student |
|
Schedule |
|
CourseOffering |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис. 3.6. Классы, участвующие в реализации варианта использования
Register for Courses
Упражнение 7. Создание классов, участвующих в реализации варианта использования Register for Courses, и диаграммы классов
«View Of Participating Classes» (VOPC)
1. Щелкните правой кнопкой мыши на пакете Design Model.
2.Выберите в открывшемся меню пункт New > Class. Новый класс под названием NewClass появится в браузере.
3.Выделите его и введите имя RegisterForCoursesForm.
4.Щелкните правой кнопкой мыши на классе
RegisterForCoursesForm.
5.В открывшемся меню выберите пункт Open Specification.
73
6. В поле стереотипа выберите Boundary и нажмите на кнопку ОК. 7. Создайте аналогичным образом классы CourseCatalogSystem
со стереотипом Boundary и RegistrationController со стереотипом Control.
8.Назначьте классам Schedule, CourseOffering и Student стереотип Entity.
9.Щелкните правой кнопкой мыши на кооперации Register for
Courses в пакете Use-Case Realization – Register for Courses.
10.В открывшемся меню выберите пункт New > Class Diagram. 11.Назовите новую диаграмму классов VOPC (classes only). 12.Откройте ее и перетащите классы на открытую диаграмму
в соответствии с рис. 3.6.
Распределение поведения, реализуемого вариантом использования, между классами
Реализуется с помощью диаграмм взаимодействия (диаграмм последовательности и кооперативных диаграмм). В первую очередь строится диаграмма (одна или более), описывающая основной поток событий и его подчиненные потоки. Для каждого альтернативного потока событий строится отдельная диаграмма. Примеры:
•обработка ошибок;
•контроль времени выполнения;
•обработка неправильных вводимых данных.
Нецелесообразно описывать тривиальные потоки событий (например, в потоке участвует только один объект).
Упражнение 8. Создание диаграмм взаимодействия
Создадим диаграммы последовательности и кооперативные диаграммы для основного потока событий варианта использования Register for Courses. Готовые диаграммы последовательности должны иметь вид, как на рис. 3.7 – 3.11.
74
: RegisterForCoursesForm : RegistrationController
: Student
1: // register for courses( )
2: // is registration open?( )
[ registration open ]
3: // display possible operations( )
Выполняется один из трех потоков:
4: // create schedule( |
|
) |
Sequence Diagram: |
|
Register |
|
|
|
|
||||
|
|
|
||||
|
|
|
||||
|
|
|
for Courses / Register |
|
for |
|
|
|
|
|
|
||
|
|
|
|
|
||
|
|
|
Courses - Basic Flow |
|
(Create |
|
|
|
|
|
|
||
|
|
|
|
|
||
|
|
|
Schedule) |
|
|
|
|
|
|
|
|
||
|
Sequence Diagram: |
|
Register |
|
||
|
|
|
|
|
||
|
|
|
||||
|
|
|
|
|
||
|
|
|
||||
5: // update schedule( |
|
) |
|
|
||
|
|
|
||||
|
|
|
||||
|
|
|
for Courses / Register |
|
for |
|
|
|
|
|
|
||
|
|
|
|
|
||
|
|
|
Courses - Basic Flow |
|
(Update |
|
|
|
|
|
|
||
|
|
|
|
|
||
|
|
|
Schedule) |
|
|
|
|
|
|
|
|
||
|
|
|
|
|
||
|
|
|
|
|
|
|
6: // delete schedule( ) |
|
Sequence Diagram: |
|
Register |
|
|
|||
|
|
|||
|
|
for Courses / Register |
|
for |
|
|
|
||
|
|
|
||
|
|
Courses - Basic Flow |
|
(Delete |
|
|
|
||
|
|
Schedule) |
|
|
|
|
|
||
|
|
|
Рис. 3.7. Диаграмма последовательности Register for Courses – Basic Flow
75
|
|
|
:RegisterForCourses |
|
:Registration |
|
:CourseCatalog |
: |
Schedule |
|
:Student |
||||||||||||||||
:Student |
Form |
|
|
Controller |
|
System |
:Course |
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
1: // create schedule( ) |
|
|
|
|
|
|
|
|
|
Catalog |
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
2: // get course |
|
offerings( ) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
Студент |
|
хочет создать |
|
|
|
|
|
3: // get course |
|
offerings(forSemester) |
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
||||||||||||||||||||||
график |
|
занятий |
|
|
|
|
|
|
|
|
|
4: // get course offerings( |
|
) |
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5: // display course offerings( )
Отображается список курсов текущего семестра
6: // display blank schedule( )
7: // select 4 primary and 2 alternate offerings( )
|
|
8: |
|
// create schedule |
|
|
|
|
|
|
|
|
|
|
|
|
|
9: // create with offerings( ) |
|
|
|
|
|||||||||
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10: // add |
|
schedule(Schedule) |
|
|
|
|
|||
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Sequence Diagram: |
|
Register for |
Courses / |
|||||
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
Register |
|
for Courses |
|
- Basic Flow |
|
|
||
В этой точке выполняется |
|
подчиненный |
|
поток |
|
|
|
||||||||
|
|
|
|
|
|||||||||||
«Принять |
|
график» |
|
|
|
|
(Submit |
|
Schedule) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис. 3.8. Диаграмма последовательности Register for Courses – Basic Flow (Create Schedule)
Настройка
1. В меню модели выберите пункт Tools > Options.
2.Перейдите на вкладку диаграмм.
3.Контрольные переключатели Sequence Numbering, Collaboration Numbering должны быть помечены, а Focus of Control – нет.
4.Нажмите ОК, чтобы выйти из окна параметров.
Создание диаграммы последовательности
1. Щелкните правой кнопкой мыши на кооперации Register for Courses в пакете Use-Case Realization – Register for Courses.
2.В открывшемся меню выберите пункт New > Sequence Diagram.
3.Назовите новую диаграмму Register for Courses – Basic Flow.
4.Дважды щелкните на ней, чтобы открыть ее.
76
Добавление на диаграмму действующего лица, объектов и сообщений
1. Перетащите действующее лицо Student из браузера на диаграмму.
2.Перетащите классы RegisterForCoursesForm и RegistrationController
из браузера на диаграмму.
3.На панели инструментов нажмите кнопку Object Message (Сообщение объекта).
4.Проведите мышью от линии жизни действующего лица Student к
линии жизни объекта RegisterForCoursesForm.
5.Выделив сообщение, введите его имя: // register for courses.
6.Повторите действия 3 – 5, чтобы поместить на диаграмму остальные сообщения, как показано на рис. 3.7 (для рефлексивного сообщения 3 используется кнопка Message to Self).
|
|
|
:RegisterForCourses |
|
: Registration |
|
|
:CourseCatalog |
|
|
: Student |
|
: Schedule |
|||||||||||||||
|
|
|
|
|
|
|
|
Form |
|
Controller |
|
|
System |
|
|
|
|
|
|
|
|
|
||||||
: Student |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1: // update schedule( ) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2: // get current schedule(Student, forSemester) |
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
||||||||||||||||||||
Студент хочет |
|
|
|
|
|
|
|
|
|
|
3: // get schedule(forSemester) |
|
|
|
|
|
|
|||||||||||
обновить график |
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
4: // display schedule(Schedule) |
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Отображается |
|
|
|
|
5: // get course offerings( ) |
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
текущий график |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6: // get course |
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Выводится список |
|
|
|
7: // display course |
|
offerings( ) |
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
курсов |
|
текущего |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
семестра |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8: // update offering selections( )
9: // update schedule with new selections( )
10: // update with new selections( )
Sequence Diagram: Register for Courses /
Register for Courses - Basic Flow (Submit
Schedule)
В этой точке выполняется подчиненный поток «Принять график»
Рис. 3.9. Диаграмма последовательности Register for Courses – Basic Flow (Update Schedule)
77
|
|
|
|
: RegisterForCourses |
|
: Registration |
|
:Student |
|
:Schedule |
|
:CourseOffering |
||||||||||||||||
: Student |
|
|
|
|
Form |
|
|
Controller |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
1: // delete schedule( ) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
2: // get current |
|
schedule(Student, |
|
forSemester) |
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
Студент хочет |
|
|
|
|
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
удалить график |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
3: // get schedule(forSemester) |
|
|
|
|
||||||||||||||||||||||
|
|
|
|
|
||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4: // display schedule(Schedule) |
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
Система |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
запрашивает |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
5: // request schedule delete confirmation( ) |
|
|
|
|
|
|||||||||||||||||||||
|
|
|
|
|
||||||||||||||||||||||||
подтверждение |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6: // confirm schedule deletion( )
7: // delete current schedule( )
8: // delete schedule(forSemester)
9: // delete( )
10: // remove student(Schedule)
Студент удаляется из списков курсов, на которые он был записан
Рис. 3.10. Диаграмма последовательности Register for Courses – Basic Flow (Delete Schedule)
Соотнесение сообщений с операциями
1. Щелкните правой кнопкой на сообщении 1, // register for courses.
2.В открывшемся меню выберите пункт <new operation>. Появится окно спецификации операции.
3.В поле имени оставьте имя сообщения – // register for courses.
4.Нажмите на кнопку ОК, чтобы закрыть окно спецификации операции и вернуться на диаграмму.
5.Повторите действия 1 – 4, пока не соотнесете с операциями все остальные сообщения.
78
Выполните аналогичные действия для создания диаграмм последовательности, показанных на рис. 3.8 – 3.11. Обратите внимание, что на диаграмме рис. 3.11 появился объект нового класса PrimarySheduleOfferingInfo (класса ассоциаций, описывающего связь между классами Shedule и OfferingInfo), который нужно предварительно создать.
|
:RegisterFor |
|
:Registration |
|
:Schedule |
|
:PrimarySchedule |
|
: Course |
|
:Student |
|
||
|
|
|
|
|
|
|
|
|||||||
: Student |
CoursesForm |
|
Controller |
|
|
|
|
OfferingInfo |
|
|
Offering |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1: // submit schedule( )
2: // submit schedule( )
3: // save( )
4: // submit( )
5: // is selected?( )
Повторяется для каждого курса из графика
[ is selected ] |
|
6: // has pre- |
|
requisites |
|
|
|||
|
(CourseOffering) |
|||
|
|
|||
|
|
|||
|
|
|
|
|
7:// still open?( )
8:// any conflicts?( )
[ has pre-requisites, course offering open, and no schedule conflicts ]
9: // add student(Schedule)
10: // mark as enrolled in( )
Рис. 3.11. Диаграмма последовательности Register for Courses – Basic Flow (Submit Schedule)
Создание примечаний
Чтобы поместить на диаграмму примечание:
1. Нажмите на панели инструментов кнопку Note.
2.Щелкните мышью в том месте диаграммы, куда собираетесь поместить примечание.
3.Выделив новое примечание, введите туда текст.
79
4.Чтобы прикрепить примечание к элементу диаграммы, на панели инструментов нажмите кнопку Anchor Notes To Item (Прикрепить примечания к элементу).
5.Нажав левую кнопку мыши, проведите указатель от примечания
до элемента диаграммы, с которым оно будет связано. Между примечанием и элементом возникнет штриховая линия.
6.Чтобы создать примечание-ссылку на другую диаграмму (как это сделано на диаграмме рис. 3.7 и других), создайте пустое примечание (без текста) и перетащите на него из браузера нужную диаграмму.
Кроме примечаний, на диаграмму можно поместить также и текстовую область. С ее помощью можно, например, добавить к диаграмме заголовок.
Чтобы поместить на диаграмму текстовую область: 1. На панели управления нажмите кнопку Text Box.
2.Щелкните мышью внутри диаграммы, чтобы поместить туда текстовую область.
3.Выделив эту область, введите в неё текст.
Создание кооперативной диаграммы
Для создания кооперативной диаграммы достаточно открыть диаграмму последовательности и нажать клавишу F5.
Определение обязанностей (responsibilities), атрибутов и ассоциаций классов
Обязанность (responsibility) – действие, которое объект обязан выполнять по запросу других объектов. Обязанность преобразуется в одну или более операций класса на шаге проектирования. Обязанности определяются, исходя из сообщений на диаграммах взаимодействия, и документируются в классах в виде операций «анализа», которые
80
появляются там автоматически в процессе построения диаграмм взаимодействия (соотнесения сообщений с операциями).
Так, диаграмма классов VOPC (classes only) (рис. 3.6)
после построения диаграмм взаимодействия в упражнении 8 должна принять вид, изображенный на рис. 3.12.
|
<<boundary>> |
|
|
|
<<control>> |
|||
|
RegisterForCoursesForm |
|
|
|
RegistrationController |
|||
|
|
|
|
|
|
|
|
|
|
// submit schedule() |
|
|
// get course offerings() |
||||
|
// display course offerings() |
|
|
// get current schedule() |
||||
|
// update schedule() |
|
|
// delete current schedule() |
||||
|
// delete schedule() |
|
|
// submit schedule() |
||||
|
// confirm schedule deletion() |
|
// is registration open?() |
|||||
|
// request schedule delete confirmation() |
|
// save schedule() |
|||||
|
// display schedule() |
|
|
// create schedule with offerings() |
||||
|
// register for courses() |
|
|
// update schedule with new selections() |
||||
|
// display possible operations() |
|
|
|
|
|
||
|
// save schedule() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
// create schedule() |
|
|
|
|
|
|
|
|
|
|
|
|
<<entity>> |
|
||
|
// select 4 primary and 2 alternate offerings() |
|
|
|
|
|||
|
|
|
|
Schedule |
|
|||
|
// display blank schedule() |
|
|
|
|
|
||
|
|
|
|
|
|
|
||
|
// update offering selections() |
|
|
|
|
|
||
|
|
|
|
// commit() |
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// select alternate() |
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
// remove offering() |
|
|
|
|
<<entity>> |
|
||||
|
<<entity>> |
|
|
|
// level() |
|
||
|
|
CourseOffering |
|
|
|
|||
|
Student |
|
|
|
// cancel() |
|
||
|
|
|
|
|
|
|
||
|
|
|
// add student() |
|
|
// get cost() |
|
|
|
|
|
|
|||||
|
|
|
|
|||||
|
// get tuition() |
|
|
|
// delete() |
|
||
|
|
// remove student() |
|
|
|
|||
|
// add schedule() |
|
|
|
// submit() |
|
||
|
|
// close registration() |
|
|
|
|||
|
// get schedule() |
|
|
|
// save() |
|
||
|
|
// get number of students() |
|
|
||||
|
// delete schedule() |
|
|
// any conflicts?() |
|
|||
|
|
// cancel() |
|
|
|
|||
|
// has pre-requisites() |
|
|
|
// create with offerings() |
|
||
|
|
// still open?() |
|
|
|
|||
|
|
|
|
|
// update with new selections() |
|
||
|
|
|
// add professor() |
|
|
|
||
|
|
|
|
|
|
|
||
|
|
|
// close() |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
// save() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<<boundary>> CourseCatalogSystem
// get course offerings()
<<entity>> PrimaryScheduleOfferingInfo
//is selected?()
//mark as enrolled in()
Рис. 3.12. Диаграмма классов VOPC (classes only) с операциями «анализа»
Атрибуты классов анализа определяются, исходя из знаний о предметной области, требований к системе и глоссария.
Упражнение 9. Добавление атрибутов к классам Настройка
1. В меню модели выберите пункт Tools > Options.
2.Перейдите на вкладку Diagram.
3.Убедитесь, что переключатель Show All Attributes помечен.
4.Убедитесь, что переключатели Suppress Attributes и Suppress Operations не помечены.
81
Добавление атрибутов
1. Щелкните правой кнопкой мыши на классе Student.
2.В открывшемся меню выберите пункт New Attribute.
3.Введите новый атрибут address
4.Нажмите клавишу Enter.
5.Повторите шаги 1 – 4, добавив атрибуты name и studentID.
6.Добавьте атрибуты к классам CourseOffering, Shedule и PrimaryScheduleOfferingInfo, как показано на рис. 3.13.
<<entity> >Student
address name studentID
//get tuition()
//add schedule()
//get schedule()
//delete schedule()
//has pre-requisites()
<<entity>> PrimaryScheduleOfferingInfo
grade
//is selected?()
//mark as enrolled in()
<<entity>> CourseOffering
/ numStudents : Int days : Enum endTime : Time
number : String = "100" startTime : Time
//add student()
//remove student()
//close registration()
//get number of students()
//cancel()
//still open?()
//add professor()
//close()
//save()
<<entity>> Schedule
semester
//commit()
//select alternate()
//remove offering()
//level()
//cancel()
//get cost()
//delete()
//submit()
//save()
//any conflicts?()
//create with offerings()
//update with new selections()
Рис. 3.13. Классы с операциями «анализа» и атрибутами
Связи между классами (ассоциации) определяются на основе диаграмм взаимодействия. Если два объекта взаимодействуют (обмениваются сообщениями), между ними должна существовать связь (путь взаимодействия). Для ассоциаций задаются множественность и, возможно, направление навигации. Могут использоваться множественные ассоциации, агрегации и классы ассоциаций.
Упражнение 10. Добавление связей
Добавим связи к классам, принимающим участие в варианте использования Register for Courses. Для отображения связей между
82