Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KPO_2_semestr_prakticheskie_zanyatia.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
619.01 Кб
Скачать

Практика 12. Работа с атрибутами.

Атрибут — это фрагмент информации, связанный с классом. Например, у класса Company (Компания) могут быть атрибуты Name (Название), Address (Адрес) и NumberOfEmployees (Число служащих).

Выявление атрибутов

Существует множество источников, где можно найти атрибуты. Для начала взгляните на описание ва­рианта использования. Ищите имена существительные в потоке событий. Некоторые из них будут классами или объектами, другие — действующими лицами, и, наконец, последняя группа — атрибута­ми. Например, в потоке событий может быть написано: "Пользователь вводит имя сотрудника, его ад­рес, номер социальной страховки и номер телефона". Это означает, что у класса Сотрудник имеются атрибуты Имя, Адрес, Номер страховки и Номер телефона.

Атрибуты можно также выявить, изучая документацию, описывающую требования к системе. Ищите такие требования, которые определяют собираемые системой данные. Любой элемент соби­раемой информации может быть атрибутом класса.

Наконец, взгляните на структуру базы данных. Если она уже определена, поля в ее таблицах дадут вам хорошее представление об атрибутах.

Часто имеется однозначное соответствие между таблицами базы данных и классами-сущностями. Если вернуться к предыдущему примеру, то в таблице Сотрудник должны быть поля Имя, Адрес, Но­мер телефона и Номер страховки. Соответствующий класс Сотрудник также имеет атрибуты Имя, Ад­рес, Номер телефона и Номер страховки. Следует отметить, однако, что не всегда существует такое однозначное соответствие. Подходы к проектированию баз данных и классов могут различаться.

В частности, реляционные базы данных не поддерживают наследование непосредственно.

Определяя атрибуты, следите за тем, чтобы каждый из них можно было соотнести с требования­ми к системе. Это помогает решить классическую проблему приложения, собирающего огромный объем никому не нужной информации. Каждое требование должно быть отслежено до конкретного | потока событий варианта использования, конкретного требования или существующей таблицы базы ( данных. Если это не удается сделать, нельзя быть уверенным в том, что данное требование нужно заказчику. В этом заключается отличие данного подхода к проектированию приложений от более старых методов — вместо того чтобы сначала создавать структуру базы данных и затем на ее основе ; разрабатывать систему, вы проектируете систему и базу данных одновременно, добиваясь их соответствия одним и тем же требованиям.

Определив атрибуты, внимательно соотнесите их с соответствующими классами. Атрибут должен / соответствовать классу. Например, класс Сотрудник может содержать имя и адрес, но не должен / включать в себя сведения о выпускаемой компанией продукции. Для последних подошел бы класс I Продукция.

Обратите внимание на классы, у которых слишком много атрибутов. Возможно, такой класс следует разделить на два меньших. Так, класс с 10-ю или 15-ю атрибутами может быть вполне приемлемым — только убедитесь, что все его атрибуты нужны и действительно должны принадлежать этому классу. Будьте осторожны и с классами, у которых слишком мало атрибутов. Вполне возможно, что I все нормально — например, управляющий класс имеет мало атрибутов. Однако это может быть и признаком необходимости в объединении нескольких классов.

Иногда могут возникнуть сомнения, соответствует ли обнаруженная вами информация атрибуту I или классу. Рассмотрим, например, такой атрибут, как название компании. Является ли он атрибутом класса Person (Человек), или лучше создать отдельный класс Company (Компания)? Ответ зависит от того, какое приложение вы пишете. Если вы собираете сведения о компании и имеется связанное с ней поведение, она может быть классом. Допустим, что вы проектируете систему работы с заказчика­ми. В таком случае может потребоваться информация о компаниях, которым вы поставляете товары или услуги. Вам нужно знать, сколько сотрудников работает в компании, ее имя и адрес, контактный телефон и т.д.

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

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

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

Добавление атрибутов

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

Добавление атрибута выполняется непосредственно на диаграмме Классов, в браузере или в окне спецификации класса.

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

Для добавления атрибута к классу:

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

  • В открывшемся меню выберите пункт New Attribute (Создать Атрибут).

  • Введите имя атрибута в формате Имя : Тип данных = Начальное значение. Например: Address : String IDNumber : Integer = Тип данных нужен при генерации кода, но начальное значение необязательно.

  • Чтобы еще добавить атрибуты, нажмите клавишу Enter и введите новые атрибуты непосредст­венно на диаграмму Классов

Удаление атрибутов

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

Для удаления атрибута класса:

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

  • В открывшемся меню выберите пункт Delete (Удалить).

Спецификации атрибута

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

Все спецификации можно просматривать или изменять в окне спецификации атрибута, показанном на рис.

Открыть окно спецификации атрибута можно следующим образом:

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

  • В открывшемся меню выберите пункт Open Specification (Открыть спецификацию).

Задание типа данных атрибута

Одной из главных характеристик атрибута является его тип данных. Он специфичен для используемо­го языка. Это может быть, например, тип string, integer, long или boolean. Перед началом генерации кода необходимо указать тип данных каждого атрибута.

В качестве типов данных можно использовать либо встроенные типы языка программирования (string, integer, long и т.д.), либо определенные в вашей модели имена классов. Для того чтобы имена определенных в модели классов выводились в раскрывающемся списке типов данных атрибутов, уста­новите флажок Show Classes (Показать классы).

Для задания начального значения атрибута:

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

  • В открывшемся меню выберите пункт Open Specification (Открыть спецификацию). Вы увидите окно спецификации атрибута класса.

  • Укажите тип данных в раскрывающемся списке типов или введите собственный тип данных.

Назначение стереотипа для атрибута

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

В Rose необязательно назначать стереотипы атрибутам. Стереотипы не требуются для генерации кода, но при их использовании легче читать и понимать модель.

Для назначения стереотипа атрибуту:

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

  • В открывшемся меню выберите пункт Open Specification (Открыть спецификацию). Вы увидите окно спецификации атрибута класса.

  • Укажите стереотип в раскрывающемся списке или введите новый стереотип.

Задание начальных значений атрибута

Атрибуты могут иметь значения по умолчанию. Например, класс Order содержит информацию и пове­дение, связанное с заказами, которые получает ваша компания. Атрибут TaxRate этого класса пред­ставляет собой ставку налога с покупки. В вашем городе налог равен 7.5%, так что почти все заказы будут облагаться налогом 7.5%. Следовательно, у атрибута TaxRate можно определить значение по умолчанию, равное 0.075.

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

Для задания начального значения атрибута:

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

  • В открывшемся меню выберите пункт Open Specification (Открыть спецификацию). Вы увидите окно спецификации атрибута класса.

  • В поле Initial Value (Начальное значение) введите значение атрибута по умолчанию.

Задание видимости атрибута

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

Класс можно представить себе следующим образом:

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

Допустимы четыре значения этого параметра. Рассмотрим каждый из них в контексте примера. Пусть у нас имеется класс Employee с атрибутом Address и класс Company.

Public (Общий, открытый) Атрибут виден всем остальным классам. Любой класс может про­смотреть или изменить значение атрибута. В таком случае класс Company может изменить значе­ние атрибута ^Address класса Employee. В соответствии с нотацией UML общему атрибуту предшествует знак "+".

Private (Закрытый, секретный) Атрибут не виден никаким другим классам. Классу Employee бу­дет известно значение атрибута Address, и он сможет редактировать его, но класс Company не сможет его ни увидеть, ни изменить. При необходимости он должен попросить у класса Employee разрешение на просмотр или изменение значения этого атрибута, что обычно делается с помо­щью общих операций (см. ниже). В соответствии с нотацией UML закрытый атрибут обозначает­ся знаком "-".

Protected (Защищенный) Атрибут доступен только самому классу и его потомкам. Допустим, что имеются два различных типа сотрудников: с почасовой оплатой и с окладом. Таким образом, мы получаем классы HourlyEmp и SalariedEmp, являющиеся потомками класса Employee. Защи­щенный атрибут Address можно просмотреть или изменить из классов Employee, HourlyEmp и SalariedEmp, но не из класса Company. Нотация UML для защищенного атрибута — знак "#".

Package or Implementation (Пакетный) Атрибут является общим, но только в пределах своего пакета. Допустим, что атрибут Address имеет пакетную видимость. В таком случае он может быть изменен из класса Company, только если этот класс находится в том же пакете. Данный тип види­мости не обозначается никаким специальным значком.

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

Задание метода локализации атрибута

Метод локализации атрибута (containment) показывает, каким образом атрибут хранится в классе.: Возможны три значения этого параметра:

By value (По значению) Предполагается, что атрибут содержится внутри класса. Например, если атрибут относится к типу string, эта строка будет содержаться внутри определения класса.

By reference (По ссылке) Предполагается, что атрибут локализован вне класса, но класс содер-: жит указатель на него. Например, у класса Timecard (Карточка табельного учета) может быть ат-: рибут типа Employee (Сотрудник). Сам объект employee размещен вне объекта timecard. Таки\с образом, этот атрибут является указателем на внешний объект employee.

Unspecified (Не определен) Метод локализации атрибута еще не определен. В этом случае прк генерации кода по умолчанию применяется значение By value этого параметра.

Задать метод локализации атрибута можно следующим образом:

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

  • В открывшемся меню выберите пункт Open Specification (Открыть спецификацию) или Орегь Standard Specification (Открыть стандартную спецификацию), если вы работаете с Rose 98i. По­явится окно спецификации атрибута класса.

  • Перейдите на вкладку Detail (Подробно).

  • Укажите значение метода локализации атрибута (containment): By value, By reference или Unspez cified. Значение этого параметра по умолчанию — Unspecified.

Определение статичного атрибута

При добавлении атрибута к классу каждый экземпляр класса получит свою собственную копию этого: атрибута. Рассмотрим, например, класс Employee. В процессе работы приложения мы можем создать: экземпляры трех сотрудников: Джона Доу, Билла Джонса и Джейн Смит. Каждый из этих объектов по­лучит свою собственную копию атрибута Salary.

Статичный атрибут (static) — это такой атрибут, который используется всеми экземплярами клас­са. Если бы атрибут Salary был статичным, он был бы общим для Джона, Билл и Джейн.

На языке UML статичный атрибут помечают символом $ в нашем примере Salary станет $Salary.

Сделать атрибут статичным можно следующим образом:

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

  • В открывшемся меню выберите пункт Open Specification (Открыть спецификацию) или Open Standard Specification (Открыть стандартную спецификацию), если вы работаете с Rose 98i. По­явится окно спецификации атрибута класса.

  • Перейдите на вкладку Detail (Подробно).

  • Установите флажок Static, чтобы сделать атрибут статичным. Перед именем атрибута на диа­грамме Классов появится символ

Определение производного атрибута

Производным (derived) называется атрибут, созданный из одного или нескольких других атрибутов. На­пример, класс Rectangle (Прямоугольник) может иметь атрибуты Width (Ширина) и Height (Высота). У него также может быть атрибут Area (Площадь), вычисляемый как произведение ширины и высоты. Так как Area получается из этих двух атрибутов, он считается производным атрибутом.

В UML производные атрибуты помечают символом "/". В описанном примере атрибут Area следу­ет написать как /Area.

Сделать атрибут производным можно следующим образом:

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

  • В открывшемся меню выберите пункт Open Specification (Открыть спецификацию) или Open

  • Standard Specification (Открыть стандартную спецификацию), если вы работаете с Rose 98i. По­явится окно спецификации атрибута класса.

  • Перейдите на вкладку Detail (Подробно).

  • Установите флажок Derived (Производный). Перед именем атрибута на диаграмме

  • Классов поя­вится символ "/".

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]