Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Практика 8. Работа с классами

Поиск

Практика 8. Работа с классами

Создание диаграмм Классов

В среде Rose диаграммы Классов создаются в Логическом представлении модели. Так же вы можете создать столько диаграмм Классов, сколько нужно для полного описания вашей системы. При построении новой модели автоматически будет создана Главная диаграмма Классов, она разме­щается непосредственно под Логическим представлением. Обычно с помощью этой диаграммы пока­зывают пакеты классов модели. Вы можете создать дополнительные диаграммы классов в Логическом представлении или внутри любого пакета.

Для создания новой диаграммы Классов:

· Щелкните правой кнопкой мыши на Логическом представлении браузера

· В открывшемся меню выберите пункт New > Class Diagram (Создать > Диаграмма классов)

· Введите имя новой диаграммы.

· Дважды щелкнув на диаграмме в браузере, откройте ее.

Для добавления к диаграмме Классов нового элемента воспользуйтесь кнопками панели инстру­ментов диаграммы Классов. Можно также выбрать в меню модели пункт Tools > Create (Инструмен­ты > Создать) и указать элемент, который вы хотите добавить.

Удаление диаграмм Классов

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

Для удаления диаграммы Классов:

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

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

Организация элементов на диаграмме классов

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

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

Для расположения элементов на диаграмме Классов:

Выберите в меню пункт Tools > Layout Diagram (Инструменты > Расположить диаграмму). Все классы на диаграмме будут автоматически размещены наиболее оптимальным способом.

Для изменения размеров элементов на диаграмме Классов:

Выберите в меню пункт Tools > Autosize All (Инструменты Настроить размер всех элемен­тов). Размер соответствующего каждому классу прямоугольника будет автоматически изменен так, чтобы вместить имя, атрибуты и операции класса.

Панель инструментов диаграммы Классов

Если на вашей панели инструментов показаны не все кнопки, щелкните на ней правой кнопкой мыши и в появившемся меню выберите пункт Customize (Настроить). Откроется диалоговое окно, с помощью которого можно добавить на панель любую из кнопок, перечисленных в таблице

Практика 9. Операции над классами.

Работа с классами

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

Rose предоставляет ряд возможностей по детализации классов. Каждому классу можно дать имя, определить его стереотип, указать видимость, а также задать несколько других параметров.

Добавление классов

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

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

Поместить новый класс на диаграмму Классов можно следующим образом:

Нажмите кнопку Class (Класс) панели инструментов.

Создание класса-наполнителя

Класс-наполнитель (instantiated class) является параметризованным классом, аргументы которого име­ют фактические значения. В частности, в рассмотренном выше примере мы имеем дело со списком некоторых элементов. Определив значение аргумента, мы получим список сотрудников. В соответст­вии с нотацией UML, имя аргумента класса-наполнителя заключается в угловые скобки (< >)

Для добавления класса-наполнителя:

· Нажмите кнопку Instantiated Class панели инструментов.

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

· Введите имя класса с аргументами, заключив их в угловые скобки (< >).

Добавление утилиты класса

Утилита класса (class utility) — это совокупность операций. Например, в вашей системе может быть со­вокупность математических функций (квадратный корень, кубический корень и т.д.), которые исполь­зуются всей системой и не слишком хорошо подходят для какого-либо конкретного класса. Эти функции можно собрать вместе и объединить в утилиту класса, которая будет использоваться другими классами системы.

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

Утилита класса выглядит на диаграмме как класс "с тенью":

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

· Нажмите кнопку Class Utility (Утилита класса) панели инструментов.

· Щелкните мышью на диаграмме там, где будет находиться новый класс.

· Введите его имя.

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

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

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

 

· С помощью одного из описанных выше методов добавьте класс на диаграмму Классов или в браузер.

· Откройте окно спецификации класса.

· В поле Туре (Тип) укажите MetaClass (Метакласс).

· Нажмите ОК.

Именование классов

Каждому классу модели Rose необходимо дать уникальное имя. Большинство организаций имеет собст­венные соглашения по именованию классов. В общем случае используются существительные в единст­венном числе. В системе обработки данных о сотрудниках может быть класс Employee (Сотрудник) и класс Position (Должность). Мы не будем называть их Employees (Сотрудники) и Positions (Должности).

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

Несмотря на то, что название ListOfEmployeesThatAreOnProbation (Список сотрудников, проходя­щих испытательный срок) хорошо описывает назначение класса, оно слишком сложное. Имя Emp- loyeeList (Список сотрудников) будет в данном случае лучшим вариантом.

Используемый для именования классов регистр символов определяется обычно организацией. Если, например, ваш класс соответствует списку пользователей, вы можете назвать его employeelist, EmployeeList, Employeelist или EMPLOYEELIST. Таким образом, компания может придерживаться своих соглашений по именованию. Важно только, чтобы принятый подход применялся ко всем классам модели.

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

· Выделите класс в браузере или на диаграмме классов.

· Введите его имя.

Практика 10. Типы классов.

Пограничные классы

Пограничными классами (boundary classes) называются такие классы, которые расположены на границе системы со всем остальным миром. Они включают в себя формы, отчеты, интерфейсы с аппаратурой (такой, как принтеры или сканеры) и интерфейсы с другими системами. В UML пограничные классы обозначают следующим образом:

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

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

Изучение диаграмм Вариантов Использования поможет вам обнаружить пограничные классы.

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

Классы-сущности (entity classes) содержат информацию, хранимую постоянно. В нашей системе работы с данными о сотрудниках хорошим примером такого класса является класс Employee. Классы-сущности можно обнаружить в потоке событий и на диаграммах Взаимодействия. Они имеют наибольшее значе- ние для пользователя, и потому в их названиях часто применяют термины из предметной области. На языке UML классы-сущности представляют следующим символом:


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

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

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

В системе могут применяться и другие управляющие классы, общие для нескольких вариантов ис­пользования. Например, класс SecurityManager (Менеджер безопасности) может отвечать за конт­роль событий, связанных с безопасностью, а класс TransactionManager (Менеджер транзакций) заниматься координацией сообщений, относящихся к транзакциям с базой данных. Могут быть и дру­гие менеджеры для работы с такими элементами функционирования системы, как разделение ресур­сов, распределенная обработка данных и обработка ошибок.

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

Помимо упомянутых выше стереотипов, вы можете создавать и свои собственные. Для этого нуж­но ввести новый стереотип в поле Stereotype, после чего он будет доступен в текущей модели Rose. Разрешается добавлять стереотип для использования во всех моделях и даже создавать для него кноп­ки и пиктограммы панели инструментов.

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

· Откройте окно спецификации класса.

· В раскрывающемся списке выберите нужный стереотип или введите его сами.

Задание видимости класса

Параметр Visibility (Видимость) показывает, будет ли класс виден вне своего пакета. Вы можете ука­зать для класса одно из трех значений:

· Public (Открытый) Этот класс виден всем остальным классам системы.

· (98i) Protected, Private (Защищенный, закрытый) Класс может быть виден во вложенных в него классах, "друзьям" (friends) этого класса или из самого класса.

· Package or Implementation (Пакет или реализация) Класс может быть виден только из клас­сов того же пакета.

Для установки видимости класса:

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

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

· Установите параметр Export control (Контроль экспорта) в значение Public; Protected, Private или Implementation.

Задание множественности класса

Поле Cardinality (Множественность) позволяет указать, сколько у данного класса должно быть экземп­ляров. Например, в системе обработки информации о сотрудниках можно ожидать наличия множест­ва экземпляров у класса Employee: Джон Доу, Билл Смит и другие. Следовательно, множественность этого класса нужно определить как п.

Множественность управляющего класса обычно равна 1.

Во время работы приложения вам скорее всего понадобится только один экземпляр менеджера бе­зопасности.

Для задания множественности класса:

· Откройте окно спецификации класса.

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

· Укажите множественность в раскрывающемся списке или введите ее значение сами.

Задание требований к хранению класса

Строя модель, вы можете указать количество абсолютной или относительной памяти, которая, по ва­шему мнению, потребуется для каждого объекта класса. Для этой цели служит поле Space (Простран­ство) окна спецификации класса.

Это поле не применимо для утилит классов, утилит классов-наполнителей и утилит параметризо­ванных классов.

Для указания пространства класса:

· Откройте окно спецификации класса.

· Перейдите на вкладку Detail.

· В поле Space введите требования по хранению класса.

Задание устойчивости класса

В среде Rose на основе модели можно генерировать DDL (Data Definition Language — Язык Описа­ния Данных). DDL определяет структуру вашей базы данных.

При генерации DDL приложение Rose ищет устойчивые (persistent) классы. Поле Persistence окна спецификации класса применяется для определения этого параметра. Он может-принимать одно из следующих значений:

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

Transient (Временный) Информация, содержащаяся в объектах класса, не будет сохраняться после завершения работы приложения.

Это поле нельзя использовать для утилит классов, утилит параметризованных классов и утилит классов-наполнителей.

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

· Откройте окно спецификации класса.

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

· В области Persistence выберите пункт Persistent или Transient.

Задание параллелизма класса

Параллелизм (concurrency) позволяет описать, как будет вести себя класс в присутствии нескольких потоков управления. Для класса доступны четыре значения этого параметра:

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

· Guarded (Ограждающий) При наличии нескольких потоков управления класс будет вести себя, как ожидается, но чтобы классы различных потоков не мешали друг другу, они должны взаимо­действовать друг с другом.

· Active (Активный) Класс будет иметь свой собственный поток управления.

· Synchronous (Синхронный) При наличии нескольких потоков управления класс будет вести себя, как ожидается. Между ним и классами других потоков не требуется какого-то специального взаимодействия, так как класс может самостоятельно обрабатывать взаимные исключения.

Для указания параллелизма класса:

· Откройте окно спецификации класса.

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

· Установите переключатель Concurrency в значение, соответствующее требуемому паралле­лизму.

Просмотр атрибутов класса

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

Если нужно просмотреть атрибуты класса:

· Откройте окно спецификации класса.

· Перейдите на вкладку Attributes (Атрибуты). Здесь перечисляются атрибуты класса с указанием их видимости, стереотипа, имени, типа данных и значения по умолчанию.

Просмотр операций класса

В следующей главе подробно рассматриваются добавление, удаление и работа с операциями класса. Информация об операциях содержится в окне спецификации класса.

Если требуется просмотреть операции класса:

· Откройте окно спецификации класса

· Перейдите на вкладку Operations (Операции). Здесь перечисляются все операции класса, вклю­чая их видимость, стереотип, сигнатуру и тип возвращаемого значения.

Просмотр связей класса

В главе 7 подробно рассматриваются все типы связей, которые можно добавить к классу. Рассказыва­ется о методах задания и удаления связей, а также о вводе их подробного описания. В окне специфика­ции класса можно просмотреть связи, добавленные к классу.

Для просмотра связей класса:

· Откройте окно спецификации класса.

· Перейдите на вкладку Relations. Здесь перечисляются все связи, в которых участвует класс

Работа с пакетами

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

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

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

Другие пакеты могут называться Employee Maintenance (Работа с сотрудниками), Reporting (Под­готовка отчетов) и Error Handling (Обработка ошибок). Преимущество этого метода заключается в возможности повторного использования пакетов. Если внимательно подойти к группированию клас­сов, можно получить практически не зависящие друг от друга пакеты. Например, пакет Security мож­но использовать и в других приложениях.

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

Добавление пакетов

Очередным этапом разработки модели является добавление пакетов, Пакеты классов создают в Логи­ческом представлении браузера.

Для добавления на диаграмму Классов существующего пакета:

· Перетащите пакет на диаграмму из браузера.

· Поместить на диаграмму Классов новый пакет можно следующим образом:

· Нажмите кнопку Package (Пакет) панели инструментов.

· Щелкните мышью внутри диаграммы Классов, чтобы поместить туда пакет.

· Введите его имя.

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

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

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

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

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

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

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

Определив атрибуты, внимательно соотнесите их с соответствующими классами. Атрибут должен / соответствовать классу. Например, класс Сотрудник может содержать имя и адрес, но не должен / включать в себя сведения о выпускаемой компанией продукции. Для последних подошел бы класс 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 (Открыть спецификацию). Вы увидите окно спецификации атрибута класса.

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

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

Атрибуты могут иметь значения по умолчанию. Например, класс 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.

Операции реализации

Операции реализации (implementor operations) реализуют некоторую бизнес-функциональность. Такие операции можно найти, исследуя диаграммы Взаимодействия. Диаграммы этого типа фокусируются на бизнес-функциональности, и каждое сообщение диаграммы скорее всего можно соотнести с опера­цией реализации.

Необходимо, чтобы каждую операцию^ реализации можно было проследить до соответствующего требования. Это достигается на различных этапах моделирования. Операция выводится из сообще­ния на диаграмме Взаимодействия, сообщения выделяются из подробного описания потока событий, который создается на основе варианта использования, а последний — на основе требований. Возмож­ность проследить всю эту цепочку гарантирует, что каждое требование будет воплощено в коде, а каждый фрагмент кода реализует какое-то требование.

Операции управления

Операции управления (manager operations) управляют созданием и разрушением объектов. В эту катего­рию попадают конструкторы и деструкторы классов вручную создавать конструкторы и деструкторы классов.

Операции доступа

Атрибуты обычно бывают закрытыми или защищенными. Тем не менее другие классы иногда должны

просматривать или изменять их значения. Для этого предназначены операции доступа (access operati­ons).

Пусть, например, у нас имеется атрибут Salary класса Employee. Нам бы не хотелось, чтобы другие классы могли изменять этот атрибут.

Но мы добавляем к классу Employee две операции доступа: GetSalary и SetSalary. К первой из них, являющейся общей, могут обращаться остальные классы. Она получает значение атрибута Salary и возвращает его вызвавшему ее классу. Операция SetSalary также является общей, она помогает вы­звавшему ее классу установить новое значение атрибута Salary. Эта операция может содержать любые правила и условия проверки, которые необходимо выполнить, прежде чем изменить атрибут.

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

Создание операций Get и Set (получения и изменения значения) для каждого атрибута класса явля­ется промышленным стандартом.

Как и в случае операций управления, операции доступа не нужно вводить вручную. При генерации кода Rose автоматически создаст операции Get и Set для каждого атрибута класса.

Вспомогательные операции

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

Как и операции реализации, вспомогательные операции можно обнаружить на диаграммах После­довательности и Кооперат



Поделиться:


Последнее изменение этой страницы: 2016-04-18; просмотров: 250; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.191.237.228 (0.02 с.)