Назад к абстрактным типам данных
Назад к абстрактным типам данных
Насыщенные утверждениями отложенные классы хорошо подходят для представления АТД. Прекрасный пример - отложенный класс для стеков. Мы уже описывали процедуру put, сейчас приведем возможную версию полного описания этого класса.
indexing
description:
"Стеки (распределительные структуры с дисциплиной Last-in, First-Out), %
%не зависящие от выбора представления"
deferred class
STACK [G]
feature -- Доступ
count: INTEGER is
-- Число элементов.
deferred
end
item: G is
-- Последний вставленный элемент.
require
not_empty: not empty
deferred
end
feature - Отчет о статусе
empty: BOOLEAN is
-- Стек пустой?
do
Result := (count = 0)
end
full: BOOLEAN is
-- Стек заполнен?
deferred
end
feature - Изменение элемента
put (x: G) is
-- Втолкнуть x на вершину.
require
not full
deferred
ensure
not_empty: not empty
pushed_is_top: item = x
one_more: count = old count + 1
end
remove is
-- Вытолкнуть верхний элемент.
require
not empty
deferred
ensure
not_full: not full
one_less: count = old count - 1
end
change_top (x: T) is
-- Заменить верхний элемент на x
require
not_empty: not empty
do
remove; put (x)
ensure
not_empty: not empty
new_top: item = x
same_number_of_items: count = old count
end
wipe_out is
-- Удалить все элементы.
deferred
ensure
no_more_elements: empty
end
invariant
non_negative_count: count >= 0
empty_count: empty = (count = 0)
end
Этот класс показывает, как можно реализовать эффективную процедуру, используя отложенные: например, процедура change_top реализована в виде последовательных вызовов процедур remove и put. (Такая реализация для некоторых представлений, например, для массивов, может оказаться не самой лучшей, но эффективные потомки класса STACK могут ее переопределить.)
Если сравнить класс STACK со спецификацией соответствующего АТД, приведенной в лекции 6, то обнаружится удивительное сходство. Подчеркнем, в частности, соответствие между функциями АТД и компонентами класса, и между пунктом PRECONDITIONS и предусловиями процедур. Аксиомы представлены в постусловиях процедур и в инварианте класса.
Добавление операций change_top, count и wipe_out в данном случае несущественно, так как они легко могут быть включены в спецификацию АТД (см. упражнение У6.8). Отсутствие явного эквивалента функции new из АТД также несущественно, так как созданием объектов будут заниматься процедуры-конструкторы в эффективных потомках этого класса. Остаются три существенных отличия.
Первое из них - это введение функции full, рассчитанной на реализации с ограниченным числом элементов стека, например, на реализацию массивами. Это типичный пример ограничения, которое несущественно на уровне спецификации, но необходимо для разработки практических систем. Отметим однако, что это отличие между АТД и отложенным классом можно легко устранить, включив в спецификацию АТД средства для охвата ограниченных стеков. При этом общность не будет потеряна, так как некоторые реализации (например, с помощью списков) могут реализовывать full тривиальными процедурами, всегда возвращающими ложь.
Второе отличие, отмеченное при обсуждении разработки по контракту, состоит в том, что спецификация АТД полностью аппликативна (функциональна), она включает функции без побочных эффектов. А отложенный класс, несмотря на его абстрактность, является императивным (процедурным), например put определена как процедура, изменяющая стек, а не как функция, которая берет в качестве аргумента один стек и возвращает другой.
Наконец, как тоже уже отмечалось, механизм утверждений недостаточно выразителен для некоторых аксиом АТД. Из четырех аксиом стеков
Для всех x: G, s: STACK [G],
1
item (put (s, x)) = x
2
remove (put (s, x)) = s
3
empty (new)
4
not empty (put (s, x))
все, кроме (2), имеют прямые эквиваленты среди утверждений. (Мы предполагаем, что для (3) процедуры-конструкторы у потомков обеспечат выполнение условия empty). Причины таких ограничений уже были объяснены и были намечены возможные пути их преодоления - языки формальных спецификаций IFL.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Назад к процессам и потокам
Назад к процессам и потокам Так же как и дом занимает некоторый участок земли в жилом массиве, так и процесс занимает некоторый объем памяти компьютера. Аналогично тому, как и обитатели в доме могут свободно войти в любую комнату, в которую пожелают, потоки в процессах все
Кнопки Вперед и Назад
Кнопки Вперед и Назад Чтобы заблокировать кнопки Вперед и Назад в Internet Explorer, создайте параметр типа DWORD ·NoNavButtons· со значением 1 в разделе HKCUSoftwarePoliciesMicrosoftInternet
Назад в будущее
Назад в будущее Введение Могло ли действительно пройти четыре года с тех пор, как я написал четырнадцатую главу этой серии? Действительно ли возможно, что шесть долгих лет прошли с тех пор как я начал ее? Забавно, как летит время когда вы весело его проводите, не так ли?Я не
96. Не применяйте memcpy или memcmp к не-POD типам
96. Не применяйте memcpy или memcmp к не-POD типам РезюмеНе работайте рентгеновским аппаратом (см. рекомендацию 91). Не используйте memcpy и memcmp для копирования или сравнения чего-либо структурированного более, чем обычная память.ОбсуждениеФункции memcpy и memcmp нарушают систему типов.
Доступ к пользовательским типам Web-методов
Доступ к пользовательским типам Web-методов В заключительном примере этой главы мы с вами выясним, как строить Web-сервисы, предлагающие доступ к пользовательским типам, а также к более "экзотическим" типам из библиотек базовых классов .NET. Для примера мы создадим новый
Доступ к типам DataSet ADO.NET
Доступ к типам DataSet ADO.NET Чтобы завершить создание нашего Web-сервиса XML, вот вам еще един Web-метод, который возвращает DataSet с данными таблицы Inventory базы данных Cars, созданной при изучении ADO.NET в главе 22.// Получение списка всех машин из таблицы Inventory.[WebMethod(Description = "Возвращает
2.10 MySQL 5 FAQ по таблицам и типам памяти
2.10 MySQL 5 FAQ по таблицам и типам памяти Questions and Answers2.10.1: Имеются ли любые новые типы памяти в MySQL 5.1?MySQL 5.1 представляет alpha-версию нового типа памяти Falcon.Также имелись значительные усовершенствования существующих типов памяти, в частности для NDB, который формирует основание MySQL
36 Назад к истокам
36 Назад к истокам Что же все-таки хотят пользователи? И как можно об этом узнать? Разработчикам программного обеспечения рекомендуется производить такие системы, которые хотят получить их клиенты и покупатели, — системы, более «ориентированные на пользователя». В любой
ГОЛУБЯТНЯ: Назад в будущее
ГОЛУБЯТНЯ: Назад в будущее Автор: Сергей ГолубицкийЗавершаем тематику Rockbox — альтернативной операционной системы для цифровых джукбоксов Archos, iRiver и iPod.После установки ROCKbox H300 Experimental, специализированного порта для iRiver H340, алгоритм которой мы разобрали на прошлой неделе,
13-я КОМНАТА: Назад в будущее
13-я КОМНАТА: Назад в будущее Автор: Владимир ГуриевПонятно, почему писателям и читателям эта схема так симпатична. Поколения читателей привыкли к приключенческим романам, в которых если и найдется конюх, то обязательно лишенный наследства. И писателям особо голову ломать
9.7. Назад в прошлое
9.7. Назад в прошлое Одним из преимуществ компьютерной графики является возможность возвращать изображение в исходное состояние, независимо от количества проделанных операций. Но это не всегда возможно, то есть если вы закрыли создаваемое изображение, предварительно
Xfce: назад в будущее?
Xfce: назад в будущее? LinuxFormat #110 (октябрь 2008)Зададимся вопросом: чего мы хотим от интегрированной рабочей среды? Богатства и гибкости настроек? Их простоты и прозрачности? На все эти вопросы я ответил бы положительно, хотя в качестве главного фактора выделил бы сквозной
Назад, в Ялту
Назад, в Ялту Суть решения Кэтколл (Catcall), - смысл этого понятия мы поясним позднее, - в возвращении к духу Ялтинских соглашений, разделяющих мир на полиморфный и ковариантный (и спутник ковариантности - скрытие потомков), но без необходимости обладания бесконечной