Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

1vendrov_a_m_proektirovanie_programmnogo_obespecheniya_ekonom

.pdf
Скачиваний:
114
Добавлен:
14.05.2016
Размер:
14.05 Mб
Скачать

Методические аспекты проектирования ПО

171

компонентом исходного кода;

компонентом времени выполнения (run time);

исполняемым компонентом.

Компонент обеспечивает физическую реализацию набора интерфейсов.

Между элементами объектной модели существуют различные виды связей. К основным типам связей относятся связи ассоциа­

ции, зависимости и обобщения.

семантическая связь между

Ассоциация (association) это

классами. Ее изображают на диаграмме классов в виде обыкно­

венной линии (рис. 2.39). Ассоциация отражает структурные свя­

зи между объектами различных классов.

Company

Employs

Person

Рис. 2.39. Ассоциация

Агрегация (aggregation) представляет собой форму ассоциации

— более сильный тип связи между целым (составным) объектом и его частями (компонентными объектами).

Существуют четыре возможных семантики для агрегации:

1)агрегация типа «Безраздельно обладает»;

2)агрегация типа «Обладает»;

3)афегация типа «Включает»;

4)афегация типа «Участник».

Афегация типа «Безраздельно обладает» устанавливает следу­ ющее:

между компонентными объектами и их составными объек­ тами установлено отношение зависимости по существова­ нию (следовательно, удаление составного объекта распрост­ раняется вниз по иерархии отношения, так что связанные компонентные объекты также удаляются);

афегация транзитивна (если объект С\ является частью объекта В\, а 51 — частью У41, тогда С\ является частью У41Л*

афегация асимметрична (нерефлексивна) (если объект В\ яв­ ляется частью объекта У41, ТО объект ^41 не является частью

В\);

афегация стационарна (если объект В\ является частью объ­ екта А\, то он не может быть частью объекта Ai (/ ^ 1)).

172

Глава 2

Агрегация типа «Обладает» поддерживает первые три свой­ ства агрегации «Безраздельно обладает», к которым относятся:

зависимость по существованию;

транзитивность;

асимметричность.

Агрегация типа «Включает» слабее, чем афегация типа «Об­ ладает», она поддерживает транзитивность и асимметричность.

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

Язык UML обеспечивает офаниченную поддержку афега­ ции. Сильная форма афегации является в UML композицией. В композиции составной объект может физически содержать ком­ понентные объекты. Компонентный объект может принадлежать только одному составному объекту. Композиция языка UML в большей или меньшей степени соответствует афегациям типа «Безраздельно обладает» и «Обладает».

Слабая форма афегации в UML называется просто агрегаци­ ей. При этом составной объект физически не содержит компоне­ нтный объект. Один компонентный объект может обладать нес­ колькими связями ассоциации или афегации. Иначе говоря, аг­ регация в языке UML соответствует афегациям типа «Включает» и «Участник».

Афегация изображается линией между классами с ромбом на стороне целого объекта (рис. 2.40). Сплошной ромб представля­ ет композицию (рис. 2.41).

Whole

\о>

Part

 

Рис 2.40. Агрегация

 

Whole

 

Part

Рис 2.41. Композиция

Методические аспекты проектирования ПО

173

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

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

Связи можно уточнить с помощью имен связей или ролевых имен. Имя связи — это обычно глагол или глагольная фраза, опи­ сывающая, зачем она нужна. Например, между классом Person (человек) и классом Company (компания) может существовать ассоциация. Если человек является сотрудником компании, ас­ социацию можно назвать «employs» (нанимает) (см. рис. 2.39).

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

Для уточнения роли, которую ифает каждый класс в связях ассоциации или афегации, применяют ролевые имена (рис. 2.42). Возвращаясь к примеру с классами Person и Company, мож­ но сказать, что класс Person ифает роль сотрудника класса Company. Ролевые имена — это обычно имена существительные или основанные на них фразы, их показывают на диафамме ря­ дом с классом, ифающим соответствующую роль. Как правило, пользуются или ролевым именем, или именем связи, но не обои­ ми сразу. Как и имена связей, ролевые имена не обязательны, их дают, только если смысл связи не очевиден.

Мощность (multiplicity) показывает, как много объектов участ­ вует в связи. Мощность — это число объектов одного класса, свя-

Company +Employer +Employee Person

Рис 2.42. Ролевые имена

174

Глава 2

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

В языке UML приняты следующие нотации для обозначения мощности.

 

Значения мощности

Мощность

Значение

Много

О

Нуль

1

Один

0..*

Нуль или больше

1..*

Один или больше

0..1

Нуль или один

1..1

Ровно один

Например, при разработке системы регистрации курсов в университете можно определить классы Course (учебный курс) и Student (студент). Между ними установлена связь, означающая посещение курсов студентами. Если один студент может посе­ щать от нуля до четырех курсов, а на одном курсе могут занимать­ ся от 10 до 20 студентов, то на диаграмме классов это можно изоб­ разить следующим образом (рис. 2.43).

Course

Student

0..4 10..20

Рис 2.43. Мощность связи

Частным случаем ассоциации является ассоциация-класс (Association class), которая обладает как свойствами класса, так и свойствами ассоциации. Ассоциация-класс - это место, где хра­ нятся относящиеся к ассоциации атрибуты и операции. Экземп­ лярами ассоциации-класса являются связи, у которых есть не

Методические аспекты проектирования ПО

175

только ссылки на объекты, но и значения атрибутов. Ассоциациякласс подобна связи с атрибутами в модели «сущность-связь».

Допустим, что имеются два класса, Student и Course, и воз­ никла необходимость добавить атрибут Grade (оценка). В таком случае возникает вопрос, в какой класс надо его добавить. Если поместить его внутри класса Student, то придется вводить его для каждого посещаемого студентом курса, что слишком сильно уве­ личит размер этого класса. Если же поместить его внутри класса Course, то придется задавать его для каждого посещающего этот курс студента.

Чтобы решить эту проблему, можно создать ассоциациюкласс. В этот класс следует поместить атрибут Grade, относящий­ ся к связи между курсом и студентом. Нотация UML для ассоци­ ации-класса представлена на рис. 2.44.

Course

Student

0..4 i 10..20

Grade

Рис 2.44. Ассоциация-класс

Ассоциация-класс определяет дополнительное ограничение, согласно которому двум участвующим в ассоциации объектам может соответствовать только один экземпляр ассоциации-клас­ са. Диаграмма на рис. 2.44 не допускает, чтобы студент мог полу­ чать по курсу более чем одну оценку. Если необходимо, чтобы та­ кое допускалось, то ассоциацию-класс Grade следует преобразо­ вать в обычный класс, связанный ассоциациями с классами Student и Course.

Зависимость (dependency) — связь между двумя элементами модели, при которой изменения в спецификации одного элемен­ та могут повлечь за собой изменения в другом элементе. Зависи­ мость — слабая форма связи между клиентом и сервером (клиент зависит от сервера и не имеет знаний о сервере). Зависимость изображается пунктирной линией, направленной от клиента к серверу (рис. 2.45).

176

Глава 2

Client I

^ Supplier

Рис 2.45. Зависимость

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

Обобщение (generalization) — связь «тип-подтип» реализует ме­ ханизм наследования (inheritance). Большинство объектно-ори­ ентированных языков непосредственно поддерживают концеп­ цию наследования. Она позволяет одному классу наследовать все атрибуты, операции и связи другого. В языке UML связи насле­ дования называют обобщениями и изображают в виде стрелок от класса-потомка к классу-предку (рис. 2.46).

student

name address studentiD

+get tuitionO

+add scheduleO

•b delete scheduie()

FulitimeStudent

ParttimeStudent

graduate

maxNumCourses

Рис 2.46. Обобщение

Методические аспекты проектирования ПО

177

Общие атрибуты, операции и/или связи отображаются на верхнем уровне иерархии.

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

2.5. УНИФИЦИРОВАННЫЙ ЯЗЫК МОДЕЛИРОВАНИЯ UML

Унифицированный язык моделирования UML^ (Unified Mo

Language) представляет собой язык для определения, представле­ ния, проектирования и документирования программных систем, организационно-экономических систем, технических систем и других систем различной природы. UML содержит стандартный набор диаграмм и нотаций самых разнообразных видов.

UML — это преемник того поколения методов объектноориентирозанного анализа и проектирования, которые появи­ лись в конце 1980-х и начале 1990-х годов. Создание UML фак­ тически началось в конце 1994 г, когда Гради Буч и Джеймс Рамбо начали работу по объединению их методов Booch и ОМТ (Object Modeling Technique) под эгидой компании Rational Software. К концу 1995 г. они создали первую спецификацию объединенного метода, названного ими Unified Method, версия 0.8. Тогда же в 1995 г к ним присоединился создатель метода OOSE (Object-Oriented Software Engineering) Ивар Якобсон. Та­ ким образом, UML является прямым объединением и унифика­ цией методов Буча, Рамбо и Якобсона, однако дополняет их но­ выми возможностями. Главными в разработке UML были следу­ ющие цели:

предоставить пользователям готовый к использованию вы­ разительный язык визуального моделирования, позволяю­ щий им разрабатывать осмысленные модели и обменивать­ ся ими;

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

обеспечить независимость от конкретных языков програм­ мирования и процессов разработки.

^ Фаулер М., Скотт К. UML в кратком изложении. Применение стан­ дартного языка объектного моделирования: Пер. с англ. — М.: Мир, 1999.

178

Глава 2

обеспечить формальную основу для понимания этого языка моделирования (язык должен быть одновременно точным и доступным для понимания, без лишнего формализма);

стимулировать рост рынка объектно-ориентированных инструментальных средств;

интефировать лучший практический опыт.

UML находится в процессе стандартизации, проводимом OMG (Object Management Group) — организацией по стандарти­ зации в области объектно-ориентированных методов и техноло­ гий, в настоящее время принят в качестве стандартного языка моделирования и получил широкую поддержку в индустрии ПО. UML принят на вооружение почти всеми крупнейшими компа­ ниями ~ производителями ПО (Microsoft, IBM, Hewlett-Packard, Oracle, Sybase и др.). Кроме того, почти все мировые производи­ тели CASE-средств, помимо IBM Rational Software, поддержива­ ют UML в своих продуктах (Together (Borland), Paradigm Plus (Computer Associates), System Architect (Popkin Software), Microsoft Visual Modeler и др.). Полное описание UML можно найти на сайтах http://www.omg.org и http://www.rational.com.

Стандарт UML версии L1, принятый OMG в 1997 г., предла­ гает следующий набор диафамм:

• Структурные (structural) модели:

диафаммы классов (class diagrams) -- для моделирования ста­ тической структуры классов системы и связей между ними; диафаммы компонентов (component diagrams) — для модели­ рования иерархии компонентов (подсистем) системы; диафаммы размещения (deployment diagrams) — для модели­ рования физической архитектуры системы.

• Модели поведения (behavioral):

диафаммы вариантов использования (use case diagrams) — для моделирования бизнес-процессов и функциональных требо­ ваний к создаваемой системе;

диафаммы взаимодействия (interaction diagrams): диафаммы последовательности (sequence diagrams) и коопе­

ративные диафаммы (collaboration diagrams) — для моделиро­ вания процесса обмена сообщениями между объектами; диафаммы состояний (statechart diagrams) — для моделирова­ ния поведения объектов системы при переходе из одного сос­ тояния в другое;

Методические аспекты проектирования ПО

179

диафаммы деятельности (activity diagrams) — для моделирова­ ния поведения системы в рамках различных вариантов ис­ пользования, или потоков управления.

2 . 5 . 1 . ДИАГРАММЫ ВАРИАНТОВ ИСПОЛЬЗОВАНИЯ

Идея описания функциональных требований в виде вариан­ тов использования (use case) была сформулирована в 1986 г. Иваром Якобсоном. Эта идея была признана конструктивной и полу­ чила широкое одобрение. Впоследствии наиболее значительный вклад в решение проблемы определения сущности вариантов ис­ пользования и способов их описания внес Алистер Коберн^

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

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

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

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

Для наглядного представления вариантов использования применяются диафаммы вариантов использования. На рис. 2.47 показан пример такой диафаммы для банковской системы.

^ Коберн А. Современные методы описания функциональных требова­ ний к системам.: Пер. с англ. - М.: ЛОРИ, 2002.

180

Глава 2

Клиент

Изменить PIN-код

 

 

Просмотреть

Снять деньги со

 

баланс

счета

Сделать платеж

Кредитная система

Рис. 2.47. Пример диаграммы вариантов использования

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

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