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

4.1.Спецификации для абстракций данных

Точно так же, как и для процедур, значение типа не должно задаваться никакой его реализацией. Вместо этого должна иметься определяющая его спецификация. Так как объекты типа исполь­зуются только вызовом операций, основная часть специфика­ции посвящена описанию того, что эти операции делают. Общий вид спецификации представлен на рис. 4.1.Он состоит из заго­ловка, определяющего имя типа и имена его операций, и двух главных секций —секции описания и секции операций.

dnarne = data type is %список операций Списание

%Здесь приводится описание абстракции данных Операции

%Здесь задаются спецификации для всех операцийend dnarne Рис. 4.1.Общий вид спецификации абстракции данных.

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

Всекции операцийсодержатся спецификации для всех опера­ций. Если операция —процедура, то ее спецификация будет процедурной спецификацией. (Операция также может быть аб­стракцией через итерацию. Об этом мы будем говорить в гл. 5.) В этих спецификациях могут использоваться концепции, вве­денные в секции описания. '

На рис. 4.2представлена' спецификация абстракции данныхintset.Наборы целых чисел intset —это неограниченные мно­жества целых чисел с операциями создания нового, пустого на­бора, проверки данного целого числа на принадлежность данному набору intsetи добавления или удаления элементов. Заметим, что в секции описания мы описали наборы целых чисел в терми­нах математических наборов. Там же мы отметили, что наборы целых чисел —изменяемые, и перечислили все изменяющие операции. В секции операций мы задали каждую операцию в тер-

минах математических наборов. Заметим, что спецификации опе­раций insertи deleteиспользуют обозначение Spo^,что указы­вает на значение sпри возврате из операции. Имя входного аргу­мента без квалификатора postвсегда обозначает значение при вы­зове операции.

intset = data type is create, insert, delete, member, size, choose Описание

Наборы целых чисел intset —это неограниченные математические множества целых чисел. Наборы целых чисел изменяемые: операции insertи deleteдо­бавляют и удаляют целые числа из набора,

Операции

create = proc ( ) returns (intset) effectsВозвращает новый, пустой набор intset

insert = proc (s: intset, x: int) modifies s

effectsДобавляет xк элементам s;после добавления —возврат,Spogt==s (J {x},где Spost—это набор вначений в sпри возврате изinsert.

delete == proc (s: intset, x: int)

modifies s effectsУдаляет xиз s(т. е, Spost = s — {x}).

member = proc (s: intset, x: int) returns (bool) effectsВозвращает значение true,если x ^ s,

size = proc (s: intset) returns (int) effectsВозвращает число элементов в s.

choose == proc (s: intset) returns (int) requiresнабор sне пуст.effectsВозвращает произвольный элемент s.

end intset Рис. 4.2.Спецификация типа данных intset.

В этой спецификации мы полагаемся на то, что читателю из­вестно, что такое математические наборы; в противном случае спецификация не будет понятна. В общем случае неформальное описание —слабое место неформальных спецификаций. Разумно, конечно, ожидать, что читатель знаком с определенными мате­матическими концепциями (например, с наборами, последователь­ностями и целыми числами), однако не все типы могут быть хо­рошо описаны в терминах таких концепций. Если концепции не­адекватны, мы должны описать тип настолько хорошо, насколько возможно, даже с использованием рисунков, но тем не менее все равно остается опасность, что читатель не поймет описания или истолкует его в другом, чем мы имели в виду, смысле. Как мы уви­дим в гл. 10,этой слабости можно избежать, если использовать формальные спецификации.

На рис. 4.3представлена спецификация типа данных poly. Полиномы poly —это неизменяемые полиномы с целыми коэффи­циентами. Предоставляются операции для создания одночленного полинома, для сложения, вычитания и умножения полиномов, а также для проверки двух полиномов на равенство.

poly == data type is create, degree, coeff, add, mul, sub, minus, equal Описание

Полиномы poly —это неизменяемые полиномы с целыми коэффициентами,Операции

create ==аргос (с, n: int) returns (poly) requiresп$г О

effectsВозвращает полином сх". Например,poly$create (6.3) == W poly$create (3.0) = 3 poly$create (0, 0) ==О

degree = proc (p: poly) returns (int)

effectsВозвращает степень p,т. e.наибольшую степень при ненулевом коэффициенте. Степень нулевого полинома равна 0.Например,poly$degree(х» + 1) = 2 poly$degree (17) =О

coeff = proc (p: poly, n: int) returns (int) requires n^- 0

effectsВозвращает коэффициент члена pсо степенью n. Возвращает 0,если nбольше степени р. Например,poly$coeff(x»+2х+ 1,4)=0poly$coeff(x»+ 2х+ 1,1)=2

add = proc (p, q: poly) returns (poly) effectsВозвращает полином, являющийся суммой полиномов р и q.

mul = proc (p, q: poly) returns (poly)

effectsВозвращает полином, являющийся произведением полиномов Р и Я-

sub = proc (p, q: poly) returns (poly) effectsВозвращает полином, являющийся разностью полиномов р и q«

minus = proc (p: poly) returns (poly)

effectsВозвращает полином, являющийся разностью полиномов zи р, где z —нулевой полином.

equal^= proc(р, q: poly) returns (bool)

effectsВозвращает значение true,если р и qимеют одинаковые коэф­фициенты при соответствующих членах, и значение false —в противном случае.

end poly Рис. 4.3.Неформальная спецификация абстракции данных для полиномов.

4.2.Реализация абстракций данных

Для реализации типа данных мы выбираем представление для объектов и реализуем операции в терминах этого представ­ления. Выбранное представление должно предоставлять возмож­ности для довольно простой и эффективной реализации всех операций. Кроме того, если некоторые операции должны выполняться быстро, представление должно предоставлять и эту воз­можность. Часто представление, обеспечивающее быструю ра­боту некоторых операций, приводит к тому, что другие операции выполняются медленно. В этом случае мы должны использовать несколько различных реализаций одного и того же типа.

Например, возможное представление для объекта intset — это массив целых чисел, где каждое целое число набора intset соответствует элементу массива. Мы должны решить —должен ли каждый элемент набора встречаться в массиве только один раз или же он может встречаться много раз. В последнем случае опе­рация insertбудет работать быстрее, однако операции delete и memberбудут выполняться медленнее. Если операция mem­berиспользуется часто, мы должны остановиться на первом слу­чае.

Заметим, что здесь мы говорим о двух разных типах: новом абстрактном типе intset,который мы реализуем, и массиве целых, который используется как представление. Каждая реализация будет иметь два таких типа:абстрактный типитип представ­ления (rep type).Предполагается, что с типом представления мы имеем дело только при реализации. Все, что мы можем делать с объектами абстрактного типа, —это применять к ним соответ­ствующие данному типу операции. Соблюдение этого ограниче­ния в языке CLUосуществляется с помощью контроля типов.

В следующем разделе мы рассмотрим, как реализовать аб­стракции данных на языке CLU,о том же, как реализовать типы на других языках, мы поговорим в гл. 7и 15.

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