- •4.9.1. Изменяемость
- •4.9.2. Классы операций
- •98 Глава 4
- •4.9.3. Полнота
- •100 Глава 4
- •4.9.5. Операции egual, similar и copy
- •102 Глава 4
- •104 Глава 4
- •5. Исключительные ситуации
- •108 Глава 5
- •110 Глава 5
- •6.2.1. Сигнализация об исключительных ситуациях
- •5.2.2. Обработка исключительных ситуаций
- •112 Глава 5
- •5.2.3. Предложение resignal
- •6.2.4. Необрабатываемые исключительные ситуации
- •114 Глава 5
- •6.2.3. Предложение resignal
- •5.2.4. Необрабатываемые исключительные ситуации
- •116 Глава 5
- •118 Глава 5
- •118 Глава 5
- •120 Глава 5
- •122 Глава 5
- •124 Глава 5
- •128 Глава 6
- •130 Глава 6
- •6.2.1. Реализация итераторов
- •6.2.2. Использование итераторов
- •132 Глава 6
- •134 Глава 6
- •136 Глава 6
- •138 Глава 6
- •140 Глава 7
- •142 Глава 7
- •7.2. Абстракция данных
- •144 Глава 7
- •146 Глава 7
- •148 Глава 7
- •150 Глава 7
- •7.4. Генераторы
- •162 Глава 7
- •154 Глава 7
- •156 Глава 7
- •162 Глава 8
- •164 Глава 8
- •166 Глава 8
- •168 Глава 8
- •170 Глава 9
- •172 Глава 9
- •174 Глава 9
- •176 Глава 9
- •9.1.3. Пример
- •178 Глава 9
- •180 Глава 9
- •182 Глава 9
- •184 Глава 9
- •186 Глава 9
- •188 Глава 9
- •190 Глава 9
- •192 Глава. 9
- •194 Глава 9
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 Возвращает полином, являющийся результатом
