Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
41
Добавлен:
23.03.2015
Размер:
395.78 Кб
Скачать

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]

Заметим, что реализации стеков, о которых мы только что го­ворили, используют одно и то же представление, которое интер­претируется, однако, по-разному.

Соседние файлы в папке POSIBNIK