Основы программирования

Основы объектно-ориентированного представления программных систем - Зависимость
Индекс материала
Основы объектно-ориентированного представления программных систем
Инкапсуляция
Модульность
Иерархическая организация
Объекты
Виды отношений между объектами
Видимость объектов
Общая характеристика классов
Виды отношений между классами
Наследование
Полиморфизм
Агрегация
Зависимость
Базис языка визуального моделирования
Предметы в UML
Отношения в UML
Диаграммы в UML
Механизмы расширения в UML
Статические модели объектно-ориентированных программных систем
Операции
Отношения в диаграммах классов
Деревья наследования
Динамические модели объектно-ориентированных программных систем
Действия в состояниях
Вложенные состояния
Диаграммы взаимодействия
Диаграммы последовательности
Актеры и элементы Use Case
Работа с элементами Use Case
Подпотоки
Пример диаграммы Use Case
Построение модели требований
Определение элементов Use Case
Уточнение модели требований
Кооперации и паттерны
Паттерн Наблюдатель
Паттерн Компоновщик
Паттерн Команда
Бизнес-модели
Все страницы
Зависимость

 

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

Наиболее часто зависимости показывают, что один класс использует другой класс как аргумент в сигнатуре своей операции. В предыдущем примере (на языке Ada 95) класс ГрафикРазворота появляется как аргумент в методах Обрабатывать и Запланировано класса КонтроллерУгла. Поэтому, как показано на рис. 9.16, КонтроллерУгла зависит от класса ГрафикРазворота.

 

Рис. 9.16. Отношение зависимости

 

Конкретизация

 

Г. Буч определяет конкретизацию как процесс наполнения шаблона (родового или параметризованного класса). Целью является получение класса, от которого возможно создание экземпляров [22].

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

В разных языках программирования родовые классы оформляются по-разному. Воспользуемся возможностями языка Ada 95, в котором впервые была реализована идея настройки-параметризации. Здесь формальные родовые параметры записываются между словом generic и заголовком пакета, размещающего класс.

Пример: представим родовой (параметризированный) класс Очередь:

generic

type Элемент is private;

package Класс_Очередь is

type Очередь is limited tagged private;

procedure Добавить (В_0чередь: in out Очередь;

элт: Элемент );

private

end Класс_0чередь;

У этого класса один формальный родовой параметр — тип Элемент. Вместо этого параметра можно подставить почти любой тип данных.

Произведем настройку, то есть объявим два конкретизированных класса — Оче-редьЦелыхЭлементов и ОчередьЛилипутов:

package Класс_ОчередьЦелыхЭлементов is new Класс_0чередь

(Элемент => Integer);

package Класс_ОчередьЛилипутов is new Класс_0чередь

(Элемент => Лилипут);

В первом случае мы настраивали класс на конкретный тип Integer (фактический родовой параметр), во втором случае — на конкретный тип Лилипут.

Классы ОчередьЦелыхЭлементов и ОчередьЛилипутов можно использовать как обычные классы. Они содержат все средства родового класса, но только эти средства настроены на использование конкретного типа, заданного при конкретизации.

Графическая иллюстрация отношений конкретизации приведена на рис. 9.17. Отметим, что отношение конкретизации отображается с помощью подписанной стрелки отношения зависимости. Это логично, поскольку конкретизированный класс зависит от родового класса (класса-шаблона).

 

Рис. 9.17. Отношения конкретизации родового класса

 

Контрольные вопросы

 

1.           В чем отличие алгоритмической декомпозиции от объектно-ориентированной декомпозиции сложной системы?

2.           В чем особенность объектно-ориентированного абстрагирования?

3.           В чем особенность объектно-ориентированной инкапсуляции?

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

5.           Каковы особенности объектно-ориентированной иерархии? Какие разновидности этой иерархии вы знаете?

6.           Дайте общую характеристику объектов.

7.           Что такое состояние объекта?

8.           Что такое поведение объекта?

9.           Какие виды операций вы знаете?

10.       Что такое протокол объекта?

11.       Что такое обязанности объекта?

12.       Чем отличаются активные объекты от пассивных объектов?

13.       Что такое роли объектов?

14.       Чем отличается объект от класса?

15.       Охарактеризуйте связи между объектами.

16.       Охарактеризуйте роли объектов в связях.

17.       Какие формы видимости между объектами вы знаете?

18.       Охарактеризуйте отношение агрегации между объектами. Какие разновидности агрегации вы знаете?

19.       Дайте общую характеристику класса.

20.       Поясните внутреннее и внешнее представление класса.

21.       Какие вы знаете секции в интерфейсной части класса?

22.       Какие виды отношений между классами вы знаете?

23.       Поясните ассоциации между классами.

24.       Поясните наследование классов.

25.       Поясните понятие полиморфизма.

26.       Поясните отношения агрегации между классами.

27.       Объясните нетрадиционные формы представления агрегации.

28.       Поясните отношения зависимости между классами.

29.       Поясните отношение конкретизации между классами.