Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Практика 8. Работа с классами↑ Стр 1 из 9Следующая ⇒ Содержание книги
Поиск на нашем сайте
Практика 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 operations). Пусть, например, у нас имеется атрибут 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 с.) |