Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответник на госы.docx
Скачиваний:
120
Добавлен:
08.02.2015
Размер:
1.89 Mб
Скачать

5.4. Абстракция данных.

"Абстракция данных" - популярная и в общем неверно определяемая техника

программирования. Фундаментальная идея состоит в разделении несущественных

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

корректного ее использования.

Такое разделение может быть выражено через специальный "интерфейс",

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

Типичный пример такого интерфейса :

- множество функций, которые могут иметь доступ к структурам

данных, посредством которых представлена "абстракция".

Одна из причин неполноты общепринятого определения состоит в том, что

любая языковая конструкция, поддерживающая абстракцию данных будет выражать

только некоторые аспекты фундаментальной идеи при недостаточности

выражения других. Например:

1. Упрятывание интерфейсов - Возможность спецификации интерфейсов,

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

необходимости знать детали реализации.

2. Конструирование интерфейсов - Возможность спецификации

интерфейсов, поддерживающих и навязывающих определенные соглашения

по использованию абстракций.

Примеры включают перегрузку знаков операций и динамическую типизацию.

3. Конкретизация - Возможность создания и инициализации

одного или более "экземпляров" (переменных объектов копий версий)

одной абстракции.

4. Локализация - Возможность упрощения реализации абстракции, принимая

во внимание, что весь доступ к ней направляется через ее интерфейс.

Примеры включают упрощение правил видимости и соглашений по вызову внутри

реализации.

5. Программная среда - Возможность поддержки разработки программм,

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

абстракции; библиотеки абстракций; отладчики, позволяющие программисту

работать в терминах абстракции.

6 Эффективность - Некоторая конструкция языка должна быть

"достаточна эффективна" для того, чтобы быть полезной.

Предполагаемая сфера применения - важный фактор для определения,

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

эффективность конструкций определяет насколько свободно они

могут использоваться в данной программею Эффективность должна

рассматриваться в трех разных контекстах : при компиляции,

связывании и выполнении.

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

делался на 2 и 3 аспектах, то есть на тех возможностях, которые позволяют

программисту обеспечивать элегантные и эффективные интерфейсы к абстракции.

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

новые типы, называемые "классами". Члены класса доступны только функциям

из явно объявленного набора. Просто упрятывание информации может быть

достигнуто, например, так :

class data_type

{ // описание данных

/* список функций, которые могут

использовать описания данных

("дружественные" функции) */

};

где только "дружественные функции (*1) могут иметь доступ к переменным

класса d a t a _ t y p e в том виде как они определены в описании данных.

В качестве альтернативы и часто более элегантно можно определить тип

данных, в котором множество функций, имеющих доступ к переменным класса,

само является составной частью самого типа:

class object_type {

/* описания, используемые

для реализации object_type */

public:

/* описания, специфицирующие

интерфейс с object_type */

};

Одна очевидная не нетривиальная цель многих современных проектов

языков программирования состоит в том, чтобы дать возможность

пользователю определять "абстрактные типы данных" с характеристиками

подобным характеристикам фундаментальных типов данных языка.

Ниже мы покажем, как добавляется тип данных c o m p l e x в язык С

и при этом к комплексным переменным могут применяться обычные

арифметические операции. Например :

complex a, x, y, z;

a = x/y + 3*z;

Идея представления объекта черным ящиком в дальнейшем поддерживается

механизмом иерархического конструирования классов из других классов.

Например:

class shape { ... };

class circle : shape { ... };

Класс shape в добавление к тому, что он используется как класс shape

может быть использован просто как circle. Говорят что класс circle есть

производный класс (*2) с классом shape в качестве своего базового класса.

Имеется возможность отсрочить разрешение типа объектов, имеющих общие

базовые классы до времени выполнения. Это позволяет манипулировать

объектами разных типов некоторым общим образом.