Объектно-ориентированное программирование

компонентой типа Date. Пользователь может выбрать конкретную дату для детального исследования— в этом случае управление передается соответствующей компонентеDate. КомпонентаPlan Manager должна уметь распечатывать меню питания на планируемый период. Наконец, пользователь может попросить компонентуPlan Manager сгенерировать список продуктов на указанный период.

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

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

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

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

Изучив различные сценарии, команда разработчиков в конечном счете решает, что все

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

(рис. 2.3).Компонента Greeterвзаимодействует только с Plan Managerи Recipe Database.

Компонента Plan Manager  «зацепляется» только сDate, а та в свою очередь— сMeal. КомпонентаMeal обращается кRecipe Manager и через посредство этого объекта к конкретным рецептам.

Рис. 2.3. Взаимосвязь между компонентами программы IIKH

2.6.4. Диаграммы взаимодействия

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

 

На рис. 2.4 показана часть диаграммы взаимодействия для программыIIKH. Время движется сверху вниз. Каждая компонента представлена вертикальной линией.

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

Благодаря наличию оси времени диаграмма взаимодействия лучше описывает последовательность событий в процессе работы программы. Поэтому диаграммы

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

Рис. 2.4. Пример диаграммы взаимодействия

2.7. Компоненты программы

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

2.7.1. Поведение и состояние

Мы уже видели, что компоненты характеризуются своим поведением, то есть тем, что они должны делать. Но компоненты также хранят определенную информацию. Возьмем, к примеру, компоненту-прототипRecipe из программыIIKH. Можно представить ее себе как пару «поведение—состояние».

∙Поведение компоненты — это набор действий, ею осуществляемых. Полное описание поведения компоненты иногда называют протоколом. Например, в протоколе, поддерживаемом компонентойRecipe, значится, что она осуществляет редактирование инструкций по приготовлению блюд, отображает их на экране, распечатывает рецепты.

∙Говоря о состоянии компоненты, имеют в виду ее внутреннее содержание. ДляRecipe состояние включает в себя ингредиенты и инструкции по приготовлению блюд. Состояние не является статическим и может изменяться с течением времени. Например, редактируя текст, пользователь изменяет состояние рецепта.

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

2.7.2. Экземпляры и классы