
- •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→A
ЗдесьAобозначает набор абстрактных объектов. Для каждого объекта представления г, А (г) является абстрактным объектом а є A -,который представляетr.
Например, функция абстракции для реализацииintsetотображает массивarray[int 1в наборintset. На рис. 4.8показаны отображения некоторых точек функции абстракции. Заметим, что А может отображать различные элементы в один, т. е. различным объектам представления может соответствовать один и тот же абстрактный элемент из Например, II:1,2]и [1:2,1] представляют один наборintset {1, 2}.В том, что функция абстракции часто отображает различные элементы в один, нет ничего удивительного, так как процесс абстракции отбрасывает не относящуюся к делу информацию. В нашем примере такая информация — это расположение элементов в массиве.
Рис. 4.8.Пример функции абстракции.
Функция абстракции —это важнейшая информация о реализации. Она определяет конкретное представление, т. е. то, каким образом объекты представления реализуют абстрактные объекты. Эта функция должна быть обязательно представлена в комментариях реализации. Описывая функцию реализации, мы иногда сталкиваемся с проблемой, связанной с тем, что, если спецификация типа неформальная, область изменения функции абстракции не может быть точно определена. Сейчас мы будем преодолевать эту Проблему с помощью неформального описания «типичного» абстрактного объекта. Когда (в гл. 10)мы будем обсуждать формальные спецификации, то увидим, что они дают нам возможность довольно точно определять области изменения для функций абстракций.
Для определения функции абстракции прежде всего определяем типичный элемент абстрактного типа. Это дает нам возможность говорить об абстрактных объектах. Затем можем определить функцию абстракции в терминах этого типичного объекта. Например, для наборовintsetмы можем дать следующее описание:
%Типичный наборintsetесть: {х1, ...хп}
Здесь для описания наборов intsetиспользуем понятие математического набора, точно так же, как делали это в спецификацииintset. Затем пишем
%Функция абстракции есть%А (г) =\r[illlow(r) < i <high(r)},
где\xlp(x)} есть набор всех таких х, что р (х) имеет значениеtrue.
В качестве другого примера рассмотрим полиномы. Мы решаем представлять полином массивом, в котором i-йэлемент содержит i-йкоэффициент, если этот коэффициент не относится к нулевым коэффициентам справа или слева от значащих членов полинома. Это представление описываем следующим образомэ
%Типичный полином есть:Сц-{-Cix+ 02^+ ... %Функция абстракции для коэффициентаCiесть%с( =r[i ],еслиlow(r) sgi ^high (г) % = 0в противном случае
Эта функция абстракции определена только для массивов с неотрицательной нижней границей. Функции абстракции часто имеют заданные области определения, как, например, в рассматриваемом случае (об этом мы будем говорить в следующем разделе).
Функция абстракции, в частности, удобна тем, что устраняет двусмысленности в интерпретации представления. Например, предположим, что с помощью массивов мы реализуем стеки. Мы можем выбирать, каким образом увеличивать массив, когда в стек добавляется новый элемент. Этот наш выбор будет отражен в функции абстракции. Если мы решаем увеличивать старший индекс массива и по этому индексу записывать элемент, то функция абстракции будет следующая:
%Типичный стек—это последовательность [е1, ...,еп], где%еп —элемент со старшим индексом%Функция абстракции есть%А (г) =[r[low(r)], ...,r[high(r)]]
Если мы решаем уменьшать младший индекс и по этому индексу записывать элемент, то
% А (r) = [r [high (r)], ..., r How (r) 1]
Заметим, что реализации стеков, о которых мы только что говорили, используют одно и то же представление, которое интерпретируется, однако, по-разному.