Уточнение наследования классов

Уточняя определения классов и операций, стараемся увеличить степень наследуемости: чем больше классов находятся в отношении наследования, тем меньше функций, реализующих операции этих классов, необходимо будет запрограммировать.

 

Для увеличения степени наследуемости следует:

- Перестроить классы и операции.

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

- Использовать делегирование операций, когда наследование семантически некорректно.

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

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

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

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

- Операция может быть определена не во всех классах некоторой группы классов; можно тем не менее вынести её в их общий суперкласс, переопределив её в подклассах как пустую там, где она не нужна.

Использование делегирования операций можно пояснить на следующем примере (рис. 3.12). Класс стек близок классу список, причём операциям стека push и pop соответствуют очевидные частные случаи операций списка add и remove. Если реализовать класс стек как подкласс класса список, то придётся применять вместо операций push и pop более общие операции add и remove, следя за их параметрами, чтобы избежать записи или чтения из середины стека; это неудобно и чревато ошибками. Гораздо лучше объявить класс список телом класса стек (делегирование), обращаясь к операциям списка через операции стека.

б)
а)

Рис. 3.12. Реализация стека с использованием наследования (а)

и делегирования (б)

 

При этом, не меняя класса список, мы заменяем его интерфейс интерфейсом класса стек.

Разработка зависимостей

Зависимости – это «клей» объектной модели: именно они позволяют рассматривать модель как нечто целое, а не просто как множество классов.

Односторонние зависимости можно реализовать с помощью ссылок (указателей) (рис. 3.13). При этом, если кратность зависимости равна единице, ей соответствует один указатель, если кратность больше единицы, то множество указателей.

 

 

Рис. 3.13. Реализация односторонней зависимости

 

На рисунке 3.14 показан способ реализации двусторонней зависимости с помощью указателей.

 

Рис. 3.14. Реализация двусторонней зависимости

 

На рисунке 3.15 показан способ реализации зависимости с помощью таблицы (как в реляционных базах данных).

 

 

Рис. 3.15. Реализация зависимости с помощью таблицы

 

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

 

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

 

1. Диаграммы потоков данных и их составляющие.

2. Описание операций в функциональной модели подсистемы.

3. Разработка архитектуры системы.

4. Разбиение системы на модули.

5. Выявление асинхронного параллелизма.

6. Распределение модулей и подсистем по процессорам и задачам.

7. Управление хранилищами данных.

8. Реализация управления программным обеспечением.

9. Понятие пограничных ситуаций и их виды.

10. Виды архитектур прикладных систем.

11. Разработка объектов (классов), составляющих систему.

12. Оптимизация разработки объектной модели.

13. Уточнение наследования классов.

 

 

 
 

4. Сравнительный анализ



OCUMENT_ROOT"]."/cgi-bin/footer.php"; ?>