Rational Rose 2000 и UML. Визуальное моделирование

Кватрани Терри

Глава 4. Поиск классов

 

 

Что такое объект

Объект (object) — это некая сущность реального мира или концептуальная сущность. Объект может быть чем-то конкретным, например грузовик Джо или мой компьютер, или концептуальным, как, например, химический процесс, банковская операция, торговый заказ, кредитная история или ставка прибыли.

Объектом называется концепция, абстракция или вещь с четко определенными границами и значением для системы. Каждый объект в системе имеет три характеристики: состояние, поведение и индивидуальность.

 

Состояние, поведение и индивидуальность

Состоянием (state) объекта называется одно из условий, в которых он может находиться. Состояние системы обычно меняется во времени и определяется набором свойств, называемых атрибутами (attribute), значений свойств и отношений между объектами. Например, объект учебный курс (CourseOffering) в системе регистрации учебных курсов может находиться в одном из двух состояний: открыт для записи или закрыт для записи. Если количество студентов, зарегистрировавшихся на курс, меньше десяти, запись на курс продолжается. После регистрации десятого студента она прекращается.

Поведение (behavior) определяет, как объект реагирует на запросы других объектов и что может делать сам объект. Поведение реализуется с помощью набора операций (operation) для объекта. В системе регистрации курсов объект учебный курс может иметь операции добавить студента и удалить студента.

Индивидуальность (identity) означает, что каждый объект уникален, даже если его состояние идентично состоянию другого объекта. Например: Алгебра 101, секция 1 и Алгебра 101, секция 2 — два объекта в системе регистрации курсов. Хотя они оба являются учебными курсами, каждый из них уникален.

В языке UML объект изображается в виде прямоугольников, а его имя пишется с подчеркиванием — см. рис. 4.1.

Рис. 4.1. Нотация языка UML для объекта

 

Что такое класс

Класс (class) — это описание группы объектов с общими свойствами (атрибутами), поведением (операциями), отношениями с другими объектами и семантикой. Таким образом, класс представляет собой шаблон для создания объекта.

Каждый объект является экземпляром конкретного класса и не может быть экземпляром нескольких классов. Например, класс учебный курс (CourseOffering) может определяться следующими характеристиками:

  атрибуты — место занятий, время занятий;

  операции — получить место занятий, получить время занятий, добавить студента на курс.

Алгебра 101, секция 1 и Алгебра 101, секция 2 — это объекты, принадлежащие классу учебный курс. Каждый объект имеет значения атрибутов и доступ к операциям, определенным классом учебный курс.

«Хороший» класс представляет одну и только одну абстракцию, то есть должен отражать одну основную сущность. Например, класс, способный хранить информацию о студентах и данные о курсах, которые студент посещает в течение нескольких лет, не является «хорошим» классом, потому что не представляет одну сущность. Такой класс необходимо разделить на два связанных класса: студент и история студента.

Названия классов выбираются в соответствии с понятиями предметной области. Имя должно быть существительным в единственном числе, наиболее точно характеризующим предмет. В качестве имени класса можно использовать акроним, если он имеет одинаковое значение для всех представляемых сущностей. При использовании акронима в описании класса желательно указать полное название.

Иногда трудно отличить объект от класса. Почему, например, Алгебра 101, секция 1 — объект, а не класс? Что отличает его от объекта Алгебра 101, секция 2? Ответы на эти вопросы субъективны. Изучив эти объекты, можно заключить, что у них одинаковая структура и поведение. Они лишь являются разными учебными предметами семестра. Кроме того, в системе регистрации курсов можно обнаружить множество схожих сущностей с одинаковой структурой и поведением: Музыка 101, секция 1; История 101, секция 1; История 101, секция 2 и т. п. Значит, допустимо создание единого класса учебный курс (CourseOffering).

В языке UML классы изображаются в виде разделенных прямоугольников. В верхней секции указывается имя класса, средняя секция содержит его структуру — атрибуты, а нижняя описывает его поведение — операции. Класс показан на рис. 4.2.

Рис. 4.2. Нотация языка UML для класса

Рис. 4.3. Класс, созданный в окне браузера

Порядок создания классов в программе Rational Rose:

1. Щелкните правой кнопкой мыши по разделу Logical View (Логическое представление) в окне браузера.

2. В появившемся контекстно-зависимом меню выберите команду New => Class (Создать => Класс). В список браузера будет добавлен новый класс с именем New Class.

3. Введите нужное имя класса.

Класс в окне браузера показан на рис. 4.3.

 

Стереотипы и классы

Мы уже говорили о стереотипах отношений на диаграмме функций. Классы тоже могут иметь стереотипы. Как и ранее, стереотип используется для создания нового типа элемента моделирования, в данном случае для создания новых типов классов. Некоторые основные стереотипы класса — это сущность, граничный элемент, элемент управления, сервисный элемент и исключение.

Стереотип класса указывается под его именем и заключается в двойные треугольные скобки. Если требуется, стереотип можно отобразить графическим значком или выделить цветом. В программе Rational Rose есть изображения для стереотипов Rational Unified Process — управляющего элемента, сущности и граничного элемента. Эти стереотипы, а также пример класса со стереотипом исключение показаны на рис. 4.4.

Рис. 4.4. Классы со стереотипами

 

Обнаружение классов

 

Рецептов для поиска классов не существует. Как сказал Грейди Буч: «Это действительно трудно!» Rational Unified Process содержит средства, помогающие обнаружить в системе классы типа управляющий элемент, граничный элемент и сущность. Эти три стереотипа соответствуют концепции «модель — представление управление» и позволяют аналитику отделить друг от друга представление, предметную область и управление в системе.

По причине того, что процесс анализа и проектирования является итеративным, список классов со временем изменится. Начальный набор классов, скорее всего, будет отличаться от итогового. Поэтому для описания начального набора классов, обнаруженных в системе, часто используется термин «класс-кандидат».

 

Классы-сущности

Класс-сущность (entity class) используется для моделирования данных и поведения с длинным жизненным циклом. Этот тип классов может представлять сущности реального мира или внутренние элементы системы. Такие классы обычно не зависят от окружения, то есть они нечувствительны к взаимодействию окружающей среды с системой. Следовательно, они не зависят от приложения и могут использоваться в различных приложениях.

Первый шаг — изучить обязанности, описанные в потоке событий для выявления прецедентов (что система должна делать). Классы-сущности — это обычно те классы, которые требуются системе для выполнения определенных обязанностей. Использование существительных для описания обязанностей может стать хорошим началом. Исходный список нужно профильтровать, так как он будет содержать слова, не относящиеся к предметной области, языковые выражения, избыточные слова и существительные, описывающие структуру класса.

Классы-сущности обычно определяются на стадии проработки. Их часто называют классами предметной области, потому что они представляют собой абстракции предметов реального мира.

 

Граничные классы

Граничные классы (boundary class) обеспечивают взаимодействие между окружающей средой и внутренними элементами системы. Такие классы предоставляют интерфейс для пользователя или другой системы (то есть для актера). Они составляют внешне зависимую часть системы и используются для моделирования интерфейсов системы.

Для обнаружения граничных классов изучают пары актер/сценарий. Такие классы, определенные на фазе проработки, обычно являются классами верхнего уровня. Например, вы можете смоделировать окно, но не моделировать его диалоговые элементы и кнопки. В этом случае вы опишете требования пользовательского интерфейса, но не реализуете его.

Требования к пользовательскому интерфейсу порой недостаточно ясны. Обычно используются термины «дружественный» и «гибкий». Но дружественный интерфейс разными людьми трактуется по-разному Здесь могут пригодиться прототипы. Пользователь должен посмотреть и почувствовать систему, чтобы реально оценить, что значит «дружественный» И то, что это значит, затем представляется как структура и поведение граничного класса. На этапе проектирования такие классы совершенствуются и выносятся на обсуждение вопросов реализации пользовательского интерфейса.

Граничные классы также используются для обеспечения связи с другими системами. На этапе проектирования эти классы совершенствуются и выносятся на обсуждение вопросов реализации протоколов взаимодействия.

 

Управляющие классы

Управляющие классы (control class) служат для моделирования последовательного поведения одного или нескольких прецедентов и координации событий, реализующих заложенное в них поведение. Управляющие классы можно представить как классы, «исполняющие» прецедент и определяющие его динамику. Они обычно зависят от приложения.

На ранней стадии проработки управляющие классы добавляются для каждой пары актер/прецедент. Такие классы определяют поток событий в прецедентах.

Вопрос использования управляющих классов очень субъективный. Многие авторы утверждают, что их применение приводит к отделению данных от поведения. Это может случиться, если управляющие классы выбраны неаккуратно. Если управляющий класс реализует что-то большее, чем последовательное действие, то он делает слишком много. Например: в системе регистрации учебных курсов студент выбирает курс, и если курс доступен, студента на него записывают.

Кто должен знать, как прикрепить студента, — управляющий класс или класс, представляющий курс занятий? Правильный ответ — класс, представляющий курс занятий. Управляющий класс знает лишь, когда студент должен быть прикреплен. «Плохой» управляющий класс знает не только когда, но и как прикрепить студента.

Управляющий класс для каждой пары актер/прецедент создается на начальном этапе. При дальнейшем анализе и проектировании управляющие классы могут исключаться, разделяться или объединяться.

Этапы создания стереотипов для классов в программе Rational Rose:

1. Щелкните правой кнопкой мыши по имени класса в списке браузера.

2. В появившемся контекстно-зависимом меню выберите команду Open Specification (Открыть параметры).

3. Щелкните по вкладке General (Общие).

4. В открывающемся списке Stereotype (Стереотип) выберите нужный стереотип. Чтобы создать новый стереотип, введите его имя в поле открывающегося списка Stereotype.

5. Щелкните по кнопке OK, чтобы закрыть диалоговое окно настройки параметров класса.

Параметры для класса студент показаны на рис. 4.5. Если язык, выбранный в модели по умолчанию, отличается от языка анализа (вкладка Notation (Нотация) диалогового окна Options (Настройки)), то в диалоговом окне параметров класса появится еще одна вкладка для языка.

Рис. 4.5. Установка стереотипа класса

 

Документирование классов

После того как класс создан, информацию о нем необходимо отразить в документации. Документация предназначена для описания назначения класса, а не его структуры. Например, класс студент может быть описан следующим образом:

Информация, необходимая для регистрации студента и оплаты обучения. Студент — это человек, обучающийся в университете.

А вот пример неправильного описания:

Имя, адрес и телефон студента.

Оно раскрывает только структуру класса, которую можно увидеть, посмотрев на список атрибутов, и не поясняет, для чего нужен данный класс.

Трудности при выборе имени и описании класса могут свидетельствовать о том, что это недостаточно хорошая абстракция. В следующем списке перечислены возможнее варианты:

  можно определить имя и дать краткое, четкое описание — хороший класс-кандидат;

  можно определить имя и выбрать описание, похожее на описание другого класса, — объединить классы;

  можно определить имя, но потребуется целая книга, чтобы описать назначение класса, — разделить класс;

  нельзя определить имя и дать описание — требуется дополнительный анализ для выделения правильных абстракций.

Чтобы описать классы в программе Rational Rose:

1. Выберите класс в списке браузера.

2. Установите курсор в окне описания и введите описание класса. Описание класса представлено на рис. 4.6.

Рис. 4.6. Описание класса

 

Пакеты

Если в системе существует немного классов, управлять ими достаточно легко. Многие системы состоят из большого количества классов, поэтому необходим механизм, позволяющий разбить их на группы и облегчающий управление и повторное использование. Здесь оказывается полезной концепция пакетов.

Пакет (package) в логическом представлении модели — это набор классов и других связанных пакетов. Путем объединения классов в пакеты мы можем получить представление модели на более высоком уровне. Изучая содержимое пакета, мы, наоборот, получаем более детальное представление.

Каждый пакет содержит интерфейс, реализуемый набором его общедоступных классов (public classes), то есть тех, с которыми могут общаться классы из других пакетов. Остальные классы пакета — это классы реализации (implementation classes), которые не взаимодействуют с классами в других пакетах.

В сложной системе для облегчения восприятия пакеты могут быть созданы на этапе проработки. В более простой системе классы, выделенные на этапе анализа, могут быть сгруппированы в один пакет, представляющий саму систему. В ходе дальнейшего анализа и проектирования пакеты нужны для группировки классов, используемых в системной архитектуре.

В языке UML пакеты изображаются в виде папок (см. рис. 4.7). Чтобы создать пакеты в программе Rational Rose:

1. Щелкните правой кнопкой мыши по разделу Logical View (Логическое представление) в окне браузера.

2. В появившемся контекстно-зависимом меню выберите команду New => Package (Создать => Пакет).

3. Введите нужное имя пакета.

Рис. 4.7. Нотация языка UML для пакетов

Пакет, созданный в списке браузера, показан на рис. 4.8. После создания пакета в него можно поместить необходимые классы.

Рис. 4.8. Пакет, созданный в списке браузера

Последовательность перемещения классов в пакет в программе Rational Rose:

1. В списке браузера выделите нужный класс, щелкнув по нему мышью.

2. Удерживая кнопку мыши нажатой, перетащите класс в пакет.

3. Повторите те же действия для других классов, которые требуется переместить.

Перемещенные классы показаны на рис. 4.9.

Рис. 4.9. Перемещенные классы

 

Объекты и классы в системе регистрации курсов

 

Рассмотрим сценарий добавление учебного курса (Add a Course Offering to Teach), который является внутренним потоком для прецедента выбор предметов для преподавания (Select Courses to Teach). Данный сценарий позволяет преподавателю выбрать учебный курс для конкретного семестра.

Хотя мы рассматриваем этот процесс пошагово, на практике большинство шагов могут быть выполнены одновременно.

 

Выбор граничных классов

Рассматриваемый прецедент взаимодействует только с актером преподаватель. Действие, выполняемое указанным сценарием, — это только одна из возможностей, обеспечиваемых прецедентом (он также определяет, что преподаватель может изменять, удалять, просматривать и печатать курсы). Это означает, что в системе должен быть механизм, позволяющий преподавателю выбирать желаемое действие. Для обеспечения потребностей преподавателя создается специальный класс — параметры курса преподавателя (ProfessorCourseOptions). Дополнительно мы можем указать класс, который служит для добавления новых курсов, доступных преподавателю, — добавление учебного курса (AddACourseOffering).

 

Выбор классов-сущностей

Данный сценарий состоит из предметов, учебных курсов и назначения преподавателей. Мы можем выделить три класса-сущности: предмет (Course), учебный курс (CourseOffering) и преподаватель (Professor).

 

Выбор управляющих классов

Добавим один управляющий класс с целью обработки потока событий для прецедента — менеджер курсов преподавателя (ProfessorCourseManager).

Выбранные классы (с установленными стереотипами сущность, управляющий элемент или граничный элемент) могут быть добавлены к модели (см. рис. 4.10). Так как актер преподаватель уже существует, при создании класса преподаватель программа Rational Rose предупредит, что одно и то же имя используется в разных разделах.

Рис. 4.10. Классы для сценария

 

Создание пакетов

Следующий шаг — объединить классы в пакеты. На данном этапе выделим шесть классов: предмет, учебный курс, преподаватель, параметры курса преподавателя, добавление учебного курса и менеджер курсов преподавателя. Их можно разделить на три логические группы: объекты, специфичные добавление учебного курса для университета; объекты, содержащие информацию о людях; интерфейсы для актеров. Таким образом, мы можем создать следующие пакеты: Интерфейсы (Interfaces), Объекты университета (UniversityArtifacts) и Сведения о людях (Peoplelnfo). Затем классы помещаются в соответствующие пакеты (см. рис. 4.11).

Рис. 4.11. Пакеты в браузере

 

Диаграммы классов

По мере того как новые классы добавляются в систему, их текстовое представление становится неудобным. Диаграммы классов (class diagrams) помогают графически представить некоторые или все классы в модели.

Главная диаграмма классов в логическом представлении модели обычно отображает пакеты системы. Каждый пакет также имеет свою главную диаграмму классов, которая обычно содержит общедоступные классы пакета. Другие диаграммы создаются по необходимости. Приведу типичные примеры использования диаграмм классов:

  просмотр всех классов реализации в пакете;

  просмотр структуры и поведения одного или нескольких классов;

  просмотр иерархии наследования классов.

Программа Rational Rose автоматически создает главную диаграмму классов в логическом представлении модели.

Чтобы добавить пакеты к главной диаграмме классов, сделайте следующее:

1. Дважды щелкните по пункту списка Main diagram (Главная диаграмма) в браузере, чтобы открыть диаграмму.

2. Выберите нужный пакет в списке, щелкнув по нему мышью.

3. Перетащите пакет на диаграмму.

4. Аналогичным образом перетащите на диаграмму другие пакеты.

Главная диаграмма классов для системы регистрации показана на рис. 4.12. Этапы создания главной диаграммы классов пакета в программе Rational Rose:

1. Дважды щелкните по изображению пакета на диаграмме классов.

2. Пакет откроется, и появится главная диаграмма классов.

3. Выберите нужный класс в списке браузера и перетащите его на диаграмму с помощью мыши. Для отображения стереотипа класса на диаграмме можно воспользоваться командой меню Format => Stereotype display (Формат => Показать стереотип).

4. Повторите предыдущий шаг для других классов, которые вы хотите поместить на диаграмму.

Рис. 4.12. Главная диаграмма классов

Главная диаграмма классов для пакета Объекты университета изображена на рис. 4.13. Заметьте, что класс учебный курс (CourseOffering) на ней отсутствует. Это класс реализации в пакете, и мы решили не показывать его на главной диаграмме. По мере добавления пакетов и классов в модель могут быть созданы дополнительные диаграммы.

Рис. 4.13. Главная диаграмма классов пакета Объекты университета

Настройка видимости классов по умолчанию:

1. Выберите команду меню Tools => Options (Сервис => Параметры).

2. Щелкните по вкладке Diagram (Диаграмма).

3. Установите флажок Show Visibility (Показать видимость) для отображения по умолчанию всех классов.

Установка видимости для выбранного класса:

1. Щелкните правой кнопкой мыши по одному из классов на диаграмме.

2. В появившемся контекстно-зависимом меню выберите команду Options => Show Visibility (Параметры => Показать видимость).

Диаграмма классов, отражающая видимость пакетов, показана на рис. 4.14.

Рис. 4.14. Диаграмма классов, отражающая видимость пакетов

 

Резюме

Объекты — это компьютерное представление сущностей (предметов реального мира или понятий, придуманных человеком). Объект — это концепция, абстракция или вещь с четко определенными границами и значением для системы. Каждый объект в системе имеет три характеристики: состояние, поведение и индивидуальность. Состояние объекта — одно из условий, в которых он может находиться. Поведение характеризует объект и показывает, как он реагирует на запросы других объектов. Индивидуальность означает, что каждый объект уникален, даже если его состояние идентично состоянию другого объекта.

Класс — это описание группы объектов с общими свойствами (атрибутами), поведением (операциями), отношениями с другими объектами (ассоциативными или агрегационными) и семантикой. В языке UML классы изображаются в виде разделенных прямоугольников. В секциях прямоугольника указываются имя, структура и поведение класса. После того как класс создан, его необходимо описать в документации. Документация предназначена для описания назначения класса, а не его структуры.

Стереотипы обеспечивают возможность создания новых типов элементов моделирования и должны основываться на элементах, входящих в метамодель языка UML. На этапе анализа выделяют три основных стереотипа для классов: класс-сущность, граничный класс и управляющий класс. Эти стереотипы используются для определения классов в разрабатываемой системе.

Пакет в логическом представлении модели — это набор классов и других связанных пакетов. Путем объединения классов в пакеты мы можем получить представление модели на более высоком уровне. Изучая содержимое пакета, мы получаем более детальное представление.

Диаграммы классов помогают графически изобразить некоторые или все классы системы. Диаграммы классов можно создать и в представлении модели прецедента. Они обычно прикрепляются к прецеденту и содержат представления классов, участвующих в их выполнении.