Разнообразие отношений отношения между множествами отношение «входит в состав» отношения объектов и их множеств.

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

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

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

Пусть есть два объекта А и В и связь между ними. Чтобы А мог послать В сообщение, В должен быть в каком-то смысле видим для А.

Перечислим следу­ющие четыре способа обеспечить видимость :

– сервер глобален по отношению к клиенту;

– сервер (или указатель на него) передан клиенту в качестве параметра операции;

– сервер является частью клиента;

– сервер локально порождается клиентом в ходе выполнения какой-либо операции.

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

Пример. Рассмотрим класс объектов, управляющих температурой в теплице Controller. Пусть он имеет атрибут h класса Heater (нагреватель).

class Controller {

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

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

КЛАССЫ

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

Класс – это множество объектов, имеющих общую структуру и общее поведение. Любой конкретный объект является экземпляром класса.

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

– маргаритка – цветок;

– роза – (другой) цветок;

– красная и желтая розы – розы;

– лепесток является частью обоих видов цветов;

– пчелы опыляют цветы и питаются их нектаром.

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

Известны три основных типа отношений между классами. Во-первых, это отношение "обобщение/специализация" (общее и частное), т.е. иерархия "является". Розы являются цветами, что значит: розы являются специализированным частным случа­ем, подклассом более общего класса "цветы". Во-вторых, это отношение "целое/часть", т.е. иерархия "имеет". Например, лепестки являются частью цветов. В-третьих, это семантические, смысловые отношения, ассоциации. Например, пчелы ассоциируются с цветами.

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

– ассоциация;

– агрегация;

– обобщение;

– зависимость;

– инстанцирование.


























Давайте обсудим 1.Приведите примеры отношений между: двумя объектами; объектом и множеством объектов; двумя множествами объектов. 2.В каких отношениях могут быть только объекты некоторых видов? В каких отношениях могут находиться любые объекты? 3.Как можно наглядно изобразить отношения объектов? 4.Приведите примеры пар объектов, имена отношений которых изменяются, когда меняются местами имена объектов. ??








Бабушка прислала Ивану посылку с яблоками и грушами. Некоторые из этих плодов были большими, остальные – маленькими. По цвету плоды тоже различались: часть плодов была жёлтого цвета, остальные – зелёного. Среди плодов не было ни маленьких груш, ни маленьких зелёных яблок. Яблок было 25, а груш – 17. Больших плодов было 32. Жёлтых плодов было 28. Зелёных яблок было на 2 больше, чем зелёных груш. Иван угостил этими плодами своих друзей. Больше всего ребятам понравились большие жёлтые яблоки. Сколько было таких яблок? Давайте обсудим?? Решение








Так как больших плодов было 32, то среди них было 15 больших яблок (32-17). Всего яблок было 25, значит, маленьких яблок 10, причём все они были жёлтого цвета. Фрукты, 42 Яблоки, 25 Большие,15 Жёлтые Зелёные Маленькие, 10 Жёлтые, 10 Груши, 17 Большие, 17 ЖёлтыеЗелёные


Если жёлтых плодов 28, то зелёных – 14. А так зелёных яблок на 2 больше, чем зелёных груш, то из уравнения х+х+2=14 получаем, что зелёных яблок 8, а груш 6. Фрукты, 42 Яблоки, 25 Большие,15 Жёлтые, 7 Зелёные, 8 Маленькие, 10 Жёлтые, 10 Груши, 17 Большие, 17 Жёлтые, 9 Зелёные, 6 Ответ: больших жёлтых яблок было 7.


Самое главное Отношение – это взаимная связь, в которой находятся какие-либо объекты. Отношения могут связывать: два объекта; объект и множество объектов; два множества. Объект может рассматриваться как единое целое либо «распадаться» на более мелкие объекты.




1.Приведите примеры отношений между: двумя объектами; объектом и множеством объектов; двумя множествами объектов. 2.В каких отношениях могут быть только объекты некоторых видов? В каких отношениях могут находиться любые объекты? 3.Как можно наглядно изобразить отношения объектов? 4.Приведите примеры пар объектов, имена отношений которых изменяются, когда меняются местами имена объектов. Давайте обсудим??


5. В детском саду 52 ребёнка. Каждый из них любит конфеты или мороженое. Половина детей любит конфеты, а 20 человек – конфеты и мороженое. Сколько детей любит мороженое? Сколько детей любит только мороженое? Давайте обсудим?? 20, любят К и М 26, любят К?, любят М?, любят только М?, любят только К 52

28. Между двумя первыми понятиями существует некоторое отношение. Между третьим и одним из четырёх, приведённых ниже, - такое же (аналогичное) отношение. Укажите нужное понятие:

29. Какую связь отражают каждая схема отношений?

30. Запишите отношения между парами объектов, представленными на рисунках.

31. Приведите 2-3 примера пар объектов, имена отношений которых не изменяются, когда меняются местами имена объектов.

32. Установите соответствие.

33. Приведите примеры.

34. Определите отношения между понятиями и изобразите эти отношения в виде кругов Эйлера по образцу.

35. Составьте пирамиды понятий по образцу.

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

37. Каждый из 35 шестиклассников является читателем по крайней мере одной из двух библиотек: школьной и районной. Из них 25 человек берут книги в школьной библиотеке, 20 – в районной.
Схематически это можно представить так:

38. Каждый ученик в классе изучает по крайней мере один из двух языков: английский или французский. Английский язык изучают 25 человек, французский – 27 человек, оба языка – 18 человек.
Изобразите это схематически и ответьте на вопросы.

39. Решите задачу, используя круги Эйлера или схему состава.
В летнем лагере отдыха 86 семиклассников. 8 из них не любят играть в компьютерные игры. 54 семиклассника предпочитают квесты, 62 – симуляторы. Сколько ребят с одинаковым удовольствием играют и в квесты, и в симуляторы?

40. Постройте схемы состава для следующих объектов.


{reklama}
41. Для каждой из приведённых пар «объект – его часть» запишите действие, которое можно выполнять со всем объектом, и действие, которое можно выполнять с его частью.

42. Для каждой пары объектов укажите связывающее их отношение.

43. Придумайте примеры отношений «является элементом множества», «входит в состав», «предшествует» и представьте их с помощью схем.

44. Решите задачу, используя схему состава.
В салоне небольшого самолёта летят 42 пассажира. Некоторые из них москвичи, остальные иногородние. Среди москвичей 9 мужчин. Некоторые из пассажиров артисты, но ни одна из иногородних женщин не является артисткой. Всего иногородних мужчин 18. Из них 13 – не артисты. Среди пассажиров, не являющихся артистами, 16 мужчин и 11 женщин. 6 москвичей не артисты.
Разберитесь, пожалуйста, с пассажирами: кто есть кто?

45. Решите задачу, используя круги Эйлера или схему состава.
Бабушка прислала Ивану посылку с яблоками и грушами. Некоторые из этих плодов были большими, остальные – маленькими. По цвету плоды тоже различались: часть плодов была жёлтого цвета, остальные – зелёного. Среди плодов не было ни маленьких груш, ни маленьких зелёных яблок. Яблок было 25, а груш – 17. Больших плодов было 32. Жёлтых плодов было 28. Зелёных яблок было на 2 больше, чем зелёных груш. Иван угостил этими плодами своих друзей. Больше всего ребятам понравились большие жёлтые яблоки. Сколько было таких яблок?

46. Разгадайте кроссворд «Отношения объектов и их множеств».

47. Состав семьи.
а) По улице идут два сына и два отца. Всего 3 человека. Может ли так быть?
Да. Сын, его отец и его дедушка.

б) В одной многодетной семье у каждого из пяти сыновей было три сестры. Сколько всего детей было в этой семье?
8 (5 братьев и 3 сестры)

в) У трёх маляров был брат Иван, а у Ивана братьев не было. Может ли так быть?
Да. Маляры были сёстрами Ивана.


Человек может рассказать не только о свойствах объекта, но и об отношениях , в которых этот объект находится с другими объектами .
Например:
«Иван - сын Андрея»;
«Эверест выше Эльбруса»;
«Винни Пух дружит с Пятачком»;
«21 кратно 3»;
«Кострома такой же старинный город, как и Москва»;
«Текстовый процессор входит в состав программного обеспечения компьютера».

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

Отношения могут существовать не только между двумя объектами, но и между объектом и множеством объектов, например:
«Дискета является носителем информации»;
«Камчатка - это полуостров (является полуостровом)».

В каждом из этих предложений описано отношение «является элементом множества» .

Отношение может связывать два множества объектов, например:
«Колеса входят в состав автомобилей»;
«Бабочки - это насекомые (являются разновидностью насекомых)».

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

Пусть про населенные пункты А, Б, В, Г, Д и Е известно, что некоторые из них соединены железной дорогой: населенный пункт А соединен железной дорогой с населенными пунктами В, Г и Е, населенный пункт Е - с населенными пунктами В, Г и Д .

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

Имена некоторых отношений изменяются, когда меняются местами имена объектов, например : «выше» - «ниже», «приходится отцом» - «приходится сыном». В этом случае направление отношения обозначают стрелкой на схеме отношений.

Так, на рис. 1.3 каждая стрелка направлена от отца к его сыну и поэтому отражает отношение «приходится отцом», а не «приходится сыном». Например: «Андрей приходится отцом Ивану».

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

Такие отношения , как «приходится сыном», «соединен железной дорогой», «покупает», «лечит» и т. д. , могут связывать только объекты некоторых видов . А в отношениях «входит в состав» и «является разновидностью» могут находиться любые объекты .

Коротко о главном

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

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

Вопросы и задания

1. Назовите имя отношения в каждом приведенном предложении. Какое имя можно будет дать отношению, если имена объектов в предложении поменять местами? В каких парах имя отношения при этом не изменится?
а) Колобок поет песню Лисе.
б) Конек-Горбунок помогает Ивану.
в) В Москве есть Манежная площадь.
г) Пилюлькин лечит Сиропчика.
д) Страшила путешествует вместе с Элл и.

2. Для каждой пары объектов укажите соответствующее отношение.

3. Какую связь отражает каждая схема отношений на рис. 1.4-1.8? Выберите правильный ответ из следующих вариантов:
«является разновидностью»;
«входит в состав»;
«является условием (причиной)»;
«предшествует».




Разновидности объектов и их классификация



Из двух множеств , связанных отношением «является разновидностью» , одно является подмножеством другого . Например, множество попугаев является подмножеством множества птиц, множество натуральных чисел является подмножеством множества целых чисел.

Схему отношения «является разновидностью» мы будем называть схемой разновидностей (рис. 1.9). Такие схемы используются в учебниках, каталогах и энциклопедиях для описания самых разных объектов, например растений, животных, сложных предложений, транспортных средств и т. д.

На схеме разновидностей имя подмножества всегда располагается ниже имени включающего его множества.

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

Важно понимать , что сами по себе объекты не делятся ни на какие множества и подмножества . Например , арбузу совершенно «безразлично», относят его к семейству тыквенных растений, к подмножеству полосатых или шарообразных объектов. Подмножества объектов выделяет и обозначает человек, потому что ему так удобнее усваивать и передавать информацию. Дело в том, что человек одновременно может концентрировать свое внимание лишь на 5-9 объектах. Для упрощения работы с множеством объектов его делят на несколько частей; каждую из этих частей опять делят на части; те, в свою очередь, еще раз и т. д. Деление большого множества на подмножества происходит не стихийно, а по некоторым признакам его объектов.

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

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

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

Можно предложить следующую классификацию объектов, с которыми взаимодействует пользователь в операционной системе Windows (рис. 1.10).


Коротко о главном

Схема разновидностей - это схема отношений «является разновидностью» между множествами и подмножествами объектов.

У объектов подмножества есть дополнительные признаки, кроме тех, которые есть у объектов множества, включающего данное подмножество.

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

Вопросы и задания

1. Для каждого из указанных подмножеств назовите множество, с которым оно связано отношением «является разновидностью» (назовите общее имя, отвечающее на вопрос «Что это такое?»):
а) местоимение;
б) запятая;
в) джойстик;
г) параллелограмм;
д) ратуша;
е) басня;
ж) капилляр.

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

3. Выберите из списка имена девяти множеств, связанных отношениями «является разновидностью». Составьте схему разновидностей:
яблоня;
хвойное дерево;
сосна;
пихта;
дерево;
лиственное дерево;
яблоко;
ствол;
фруктовое дерево;
береза;
дуб;
лиственница;
корень;
желудь.

4. Используя предложенную классификацию паралле-лограммов, опишите свойства квадрата, наследующего их сразу у двух предков - прямоугольника и ромба. Какими дополнительными свойствами обладает квадрат:
а) по отношению к прямоугольнику;
б) по отношению к ромбу?

5. В каждом пункте перечислены объекты, сгруппированные по классам. Например: стол, компьютер, лук / корова, ручка, кастрюля / село, знамя, перо - это существительные, классифицированные по родам. Определите основания классификаций:
а) ель, сосна, кедр, пихта / береза, осина, липа, тополь;
б) картофель, лук, огурцы, помидоры / яблоки, апельсины, груши, мандарины;
в) рожь, тишь, ложь, рысь / пшеница, тишина, истина, кошка;
г) рубашка, пиджак, платье, сарафан / пальто, шуба, плащ, штормовка;
д) волк, медведь, лиса, лось / корова, собака, кошка, лошадь.

6. Предложите свою классификацию компьютерных объектов «файл» и «документ».

Практическая работа №2
«Работаем с объектами файловой системы»

1. Откройте окно Мой компьютер . Просмотрите файлы и папки, расположенные на диске С: .

2. Воспользуйтесь кнопками Вперед и Назад на панели инструментов Обычные кнопки для перемещения между ранее просмотренными объектами.

3. Выберите в меню Вид команды: Эскизы страниц, Плитка, Значки, Таблица. Проследите за изменениями в отображении папок и файлов. Найдите на панели инструментов Обычные кнопки кнопку, обеспечивающую быстрое изменение вида содержимого папок.

4. С помощью кнопки Папки отобразите в левой части окна панель Обозревателя Папки . С ее помощью еще раз просмотрите файлы и папки, расположенные на диске С: . Проследите за изменениями, происходящими в правой части окна.

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

6. Откройте собственную папку. В ней должны быть вложенные папки Документы, Заготовки_6, Заготовки_7, Презентации и Рисунки. Просмотрите содержимое этих папок.

7. Папка Заготовки_6 содержит файлы, которыми вы пользовались при выполнении работ компьютерного практикума в пошлом году. Так как эта папка вам больше не нужна, удалите ее (например, командой контекстного меню).

8. Папки Документы, Презентации и Рисунки содержат ваши прошлогодние работы. Их хотелось бы сохранить.

Создайте в собственной папке папку Архив. Для этого переведите указатель мыши в чистую область окна собственной папки и щелкните правой кнопкой мыши (вызов контекстного меню). Выполните команду [Создать-Папку] .

Поочередно переместите папки Документы, Презентации и Рисунки в папку Архив. Для этого:
1) выделите папку Документы и, удерживая нажатой левую кнопку мыши, перетащите папку Документы в нанку Архив;
2) откройте контекстное меню панки Презентации, выполните команду Вырезать. Откройте папку Архив и с помощью контекстного меню вставьте в нее папку Презентации;
3) вырежьте папку Рисунки и вставьте ее в папку Архив с помощью команд строки меню.

9. С помощью контекстного меню переименуйте папку Заготовки_7 в Заготовки.

10. Убедитесь, что ваша папка имеет структуру, аналогичную приведенной ниже:

Связи

Семантика. Мы заимствуем понятие связи у Румбаха, который определяет его как "физическое или концептуальное соединение между объектами" . Объект сотрудничает с другими объектами через связи, соединяющие его с ними. Другими словами, связь - это специфическое сопоставление, через которое клиент запрашивает услугу у объекта-сервера или через которое один объект находит путь к другому.

На рис. 3-2 показано несколько разных связей. Они отмечены линиями и означают как бы пути прохождения сообщений. Сами сообщения показаны стрелками (соответственно их направлению) и помечены именем операции. На рисунке объект aController связан с двумя объектами класса DisplayItem (объекты a и b). В свою очередь, оба, вероятно, связаны с aView , но нам была интересна только одна из этих связей. Только вдоль связи один объект может послать сообщение другому.

Связь между объектами и передача сообщений обычно односторонняя (как на рисунке; хотя технически она может быть и взаимной). Как мы увидим в главе 5, подобное разделение прав и обязанностей типично для хорошо структурированных объектных систем [На самом деле организация объектов, показанная на рис. 3-2, встречается настолько часто, что ее можно считать типовым проектным решением. В Smalltalk аналогичный механизм известен как MVC, model/view/controller (модель/представление/контроллер). Как мы увидим в следующей главе, хорошо структурированные системы имеют много таких опознаваемых типовых решений]. Заметьте также, что хотя передаваемое сообщение инициализировано клиентом (в данном случае aController ), данные передаются в обоих направлениях. Например, когда aController вызывает операцию move для пересылки данных объекту а, данные передаются от клиента серверу, но при выполнении операции isUnder над объектом b, результат передается от сервера клиенту.

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

? Актер . Объект может воздействовать на другие объекты, но сам никогда не подвергается воздействию других объектов; в определенном смысле это соответствует понятию активный объект.

Рис. 3-2. Связи.

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

? Агент . Такой объект может выступать как в активной, так и в пассивной роли; как правило, объект-агент создается для выполнения операций в интересах какого-либо объекта-актера или агента.

На рис. 3-2 объект aController выступает как актер, объект a - как агент и объект aView - как сервер.

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

Абстракция нагрева имеет достаточно четкое поведение, что дает нам право на описание такого класса. Сначала определим тип, значение которого задает прошедшее время в минутах.

// Число прошедших минут typedef unsigned int Minute;

Теперь опишем сам класс TemperatureRamp , который по смыслу задает функцию времени от температуры:

class TemperatureRamp { public:

TemperatureRamp(); virtual ~TemperatureRamp(); virtual void clear(); virtual void bind (Temperature, Minute); Temperature TemperatureAt (Minute);

protected: ... };

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

На самом деле в смысле поведения нам надо нечто большее, чем просто зависимость температуры от времени. Пусть, например, известно, что на 60-й минуте должна быть достигнута температура 250?F, а на 180-й - 150?F. Спрашивается, какой она должна быть на 120-й минуте? Это требует линейной интерполяции, так что требуемое от абстракции поведение усложняется.

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

class TemperatureController { public:

TemperatureController(Location); ~TemperatureController(); void process(const TemperatureRamp&); Minute schedule(const TemperatureRamp&) const;

private: ... };

Тип Location был определен в главе 2. Заметьте, что мы не ожидаем наследования от этого класса и поэтому не объявляем в нем никаких виртуальных функций.

Операция process обеспечивает основное поведение этой абстракции; ее назначение - передать график изменения температуры нагревателю, установленному в конкретном месте. Например, объявим:

TemperatureRamp growingRamp; TemperatureController rampController(7);

Теперь зададим пару точек и загрузим план в контроллер::

growingRamp.bind (250, 60); growingRamp.bind(150, 180); rampController.process(growingRamp);

В этом примере rampController - агент, ответственный за выполнение температурного плана, он использует объект growingRamp как сервер. Эта связь проявляется хотя бы в том, что rampController явно получает growingRamp в качестве параметра одной из своих операций.

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

Видимость. Пусть есть два объекта А и в и связь между ними. Чтобы А мог послать сообщение в, надо, чтобы в был в каком-то смысле видим для А. Мы можем не заботиться об этом на стадии анализа, но когда дело доходит до реализации системы, мы должны обеспечить видимость связанных объектов.

В предыдущем примере объект rampController видит объект growingRamp , поскольку оба они объявлены в одной области видимости и потому, что growingRamp передается объекту rampController в качестве параметра. В принципе есть следующие четыре способа обеспечить видимость.

Сервер глобален по отношению к клиенту.

Сервер (или указатель на него) передан клиенту в качестве параметра операции.

Сервер является частью клиента.

Сервер локально порождается клиентом в ходе выполнения какой-либо операции.

Какой именно из этих способов выбрать - зависит от тактики проектирования.

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

Последовательный - семантика пассивного объекта обеспечивается в присутствии только одного активного процесса.

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

Синхронный - семантика пассивного объекта обеспечивается в присутствии многих потоков управления; взаимное исключение обеспечивает сервер.

Все объекты, описанные в этой главе, были последовательными. В главе 9 мы рассмотрим остальные варианты более подробно.

Агрегация

Семантика. В то время, как связи обозначают равноправные или "клиент-серверные" отношения между объектами, агрегация описывает отношения целого и части, приводящие к соответствующей иерархии объектов, причем, идя от целого (агрегата), мы можем придти к его частям (атрибутам). В этом смысле агрегация - специализированный частный случай ассоциации. На рис. 3-3 объект rampController имеет связь с объектом growingRamp и атрибут h класса Heater (нагреватель). В данном случае rampController - целое, a h - его часть. Другими словами, h - часть состояния rampController . Исходя из rampController , можно найти соответствующий нагреватель. Однако по h нельзя найти содержащий его объект (называемый также его контейнером), если только сведения о нем не являются случайно частью состояния h .