- •1.Введение
- •1.1.Декомпозиция и абстракция
- •1.2.Абстракция
- •1.2.1.Абстракция через параметризацию
- •1.2.2.Абстракция через спецификацию
- •1.2.3.Виды абстракций
- •3.Процедурная абстракция
- •3.2.Спецификации
- •3.3.Спецификации процедурных абстракций
- •3.4.Реализация процедур
- •3.5.Более обобщенные процедуры
- •3.6.Создание процедурных абстракций
- •3.7.Заключение
- •4.Абстракции данных
- •4.1.Спецификации для абстракций данных
- •4.2.1.Реализация на языке clu
- •4.2.2.Замечания по поводу операций up и down
- •4.3.Использование абстракций данных
- •4.4.Реализация полиномов
- •4.5.Пояснения для понимания реализаций
- •4.5.1.Функция абстракции
- •4.5.2.Инвариант представления
- •4.6.3.Сохранение инварианта представления
- •4.5.4.Изменяемые представления
- •4.6.Параметризованные абстракции данных
- •4.7.Списки
- •4.8.Упорядоченные списки
4.5.Пояснения для понимания реализаций
В этом разделе мы рассмотрим два информационных блока! функцию абстракции и инвариант представления, которые особенно полезны для понимания реализации абстракции данных. Эти информационные блоки должны включаться в реализацию как комментарии. Кроме того, мы поговорим о корректности реализаций и изменяемых представлений.
4.5.1.Функция абстракции
Любая реализация абстракции данных должна определять, как представляются объекты, принадлежащие к этому типу. Выбирая представление, тот, кто занимается реализацией, учитывает связь между объектами представления и абстрактными объектами. Предполагается, что определенные объекты представления будут соответствовать определенным абстрактным объектам. Например, на рис. 4,5наборы intsetпредставляются массивами, элементы которых соответствуют элементам набора,
Эта взаимосвязь может быть определена функцией, которая называется функцией абстракции.Эта функция отображает объекты представления в абстрактные объекты:
А : rep -f £ф
Здесь ^ обозначает набор абстрактных объектов. Для каждого объекта представления г, А (г) является абстрактным объектом а (: £4-,который представляет г.
Например, функция абстракции для реализации intsetотображает массив array [int 1в набор intset.На рис. 4.8показаны отображения некоторых точек функции абстракции. Заметим, что А
intset
Рис. 4.8.Пример функции абстракции.
может отображать различные элементы в один, т. е. различным объектам представления может соответствовать один и тот же абстрактный элемент из Например, II:1,2]и [1:2,1] представляют один набор intset {1, 2}.В том, что функция абстракции часто отображает различные элементы в один, нет ничего удивительного, так как процесс абстракции отбрасывает не относящуюся к делу информацию. В нашем примере такая информация — это расположение элементов в массиве.
Функция абстракции —это важнейшая информация о реализации. Она определяет конкретное представление, т. е. то, каким образом объекты представления реализуют абстрактные объекты. Эта функция должна быть обязательно представлена в комментариях реализации. Описывая функцию реализации, мы иногда сталкиваемся с проблемой, связанной с тем, что, если спецификация типа неформальная, область изменения функции абстракции не может быть точно определена. Сейчас мы будем преодолевать эту Проблему с помощью неформального описания «типичного» абстрактного объекта. Когда (в гл. 10)мы будем обсуждать формальные спецификации, то увидим, что они дают нам возможность довольно точно определять области изменения для функций абстракций.
Для определения функции абстракции прежде всего определяем типичный элемент абстрактного типа. Это дает нам возможность говорить об абстрактных объектах. Затем можем определить функцию абстракции в терминах этого типичного объекта. Например, для наборов intsetмы можем дать следующее описание:
%Типичный набор intsetесть: {х1, ...хп}
Здесь для описания наборов intsetиспользуем понятие математического набора, точно так же, как делали это в спецификации intset.Затем пишем
%Функция абстракции есть%А (г) = \r [ill low (r) < i < high (r)},
где \x lp (x)}есть набор всех таких х, что р (х) имеет значениеtrue.
В качестве другого примера рассмотрим полиномы. Мы решаем представлять полином массивом, в котором i-йэлемент содержит i-йкоэффициент, если этот коэффициент не относится к нулевым коэффициентам справа или слева от значащих членов полинома. Это представление описываем следующим образомэ
%Типичный полином есть:Сц-{- Cix+ 02^+ ... %Функция абстракции для коэффициента Ciесть%с( = r [i ],если low (r) sg i ^ high (г) % = 0в противном случае
Эта функция абстракции определена только для массивов с неотрицательной нижней границей. Функции абстракции часто имеют заданные области определения, как, например, в рассматриваемом случае (об этом мы будем говорить в следующем разделе).
Функция абстракции, в частности, удобна тем, что устраняет двусмысленности в интерпретации представления. Например, предположим, что с помощью массивов мы реализуем стеки. Мы можем выбирать, каким образом увеличивать массив, когда в стек добавляется новый элемент. Этот наш выбор будет отражен в функции абстракции. Если мы решаем увеличивать старший индекс массива и по этому индексу записывать элемент, то функция абстракции будет следующая:
%Типичный стек—это последовательность [е1, ...,еп], где%еп —элемент со старшим индексом%Функция абстракции есть%А (г) = [r [low (r)], ..., r [high (r)]]
Если мы решаем уменьшать младший индекс и по этому индексу записывать элемент, то
% А (r) = [r [high (r)], ..., r How (r) 1]
Заметим, что реализации стеков, о которых мы только что говорили, используют одно и то же представление, которое интерпретируется, однако, по-разному.