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

102 Глава 4

equal = proc (si, s2: intset) returns (bool) effects Возвращает значение true, если si и s2— один и тот же объект intset.

similar =^ргос (si, s2: intset) retunis (bool)

effects Возвращает значение true, если si и s2 содержат одинаковые эле­менты.

сору = ргос (s: intset) returns (intset) effects Возвращает новый объект intset, содержащий те же элементы, что и s

Рис. 4.19. Спецификации операций equal, copy и similar для наборов целых чисел intset.

equal = proc (si, s2: cvt) returns (bool) return (si = s2) % используется rep$equal end equal

similar = proc (si, s2: Intset) returns (bool) return (subset (si, s2) cand subset (s2, si)) end similar

% subset — это внутренняя программа, которая возвращает значение true, если % si принадлежит s2. subset = proc (si, s2: cvt) returns (bool) i; int := rep$low (si) while i (== rep$high (si) do

if— member (up (s2), si ti]) then return (false) end i := i+ I end end subset

copy = proc (s: cvt) returns (cvt) return (rep$copy (s)) end copy

Рис. 4.20. Реализации операций equal, similar ii copy для наборов целых чисел intset.

4.10. Заключение

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

Кроме того, мы обсуждали некоторые важные аспекты реали­заций типов данных. В общем случае не все объекты типа пред­ставления являются законными представлениями абстрактных объектов; инвариант представления определяет законные пред­ставления. Функция абстракции определяет значение представле-ння, устанавливая отображение законных объектов представления в абстрактные объекты. Инвариант представления и функция абстракции должны быть включены как комментарии в реализа­цию. Они полезны при. начале реализации, так как Вынуждают того) кто осуществляет реализацию, ясно выразить ва'е предполо-

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

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

И наконец, мы рассмотрели некоторые аспекты, которые необ­ходимо иметь в виду при конструировании типов данных. Необ­ходимо тщательно обдумать, должен ли тип быть изменяемым или нет, а также то, какие операции он должен иметь, чтобы они обеспечивали потребности пользователя. Мы также обсуждали индукцию типа данных и как она используется для доказатель­ства свойств объектов, а также обсуждали необходимость обеспе­чить для типа операции equal и copy.

Выгоды локальности и возможности модификаций относятся к абстракциям данных так же, как и к процедурам. Эти выгоды могут быть получены только в случае, когда мы имеем абстрак­цию через спецификацию. Локальность требует, чтобы представ­ление можно было модифицировать только внутри реализации типа. Если модификации могут осуществляться где-то еще, мы не можем установить корректность реализации, исследуя только текст ее программы. Например, мы не можем гарантировать ло­кально, что инвариант представления будет сохранен, и не можем использовать индукцию типа данных как надежное средство. Возможность модификаций требует еще большего: все доступы к представлению должны осуществляться только внутри реали­зации типа. Если доступ осуществляется в каком-то другом мо­дуле, мы не можем заменить реализацию, никак не повлияв при этом на этот другой модуль.

Таким образом, необходимо, чтобы доступ к представлению был разрешен только в реализации типа. Полезно было бы иметь язык программирования, учитывающий это ограничение, так как в противном случае ограниченный доступ является еще одним свойством, которое должно быть доказано. Язык CLU обеспечи­вает это ограничение при помощи контроля типов во время ком­пиляции.

Дополнительная литература

Morris, James Н., Jr., 1973. Types are not sets. In Conference Record of ACM Symposium on Principles of Programming Languages, pp. 120—124.

Hoare, С. A. R., 1972. Proof of correctness of data representations. Acta In-formatica 1 (1): 271—281. Reprinted in Programming Methodology. A Collection of Articles by Members of IFIP WG2.3, edited by David Cries (New Yorkt Springer-Verlag), 1978.

Упражнения 4.1. Реализуйте процедуру

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

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