Абстрактные предусловия

Абстрактные предусловия

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

Типичным примером этого является порождение BOUNDED_STACK от универсального класса стека (STACK). Процедура занесения в стек элемента (put) в порожденном классе имеет предусловие count <= capacity, где count - текущее число элементов в стеке, capacity - физическая емкость накопителя.

В общем понятии стека нет понятия емкости. Поэтому создается впечатление, будто при переходе к BOUNDED_STACK предусловие приходится усилить (от бесконечной емкости перейти к конечной). Как выстроить структуру наследования, не нарушая правило Утверждения Переобъявления?

Ответ становится очевиден, если мы ближе познакомимся с требованиями к клиенту. То, что нужно сохранить или ослабить, не обязательно является конкретным предусловием, как оно видится в реализации поставщика (реализация это его забота), но касается предусловия, как оно видится клиенту. Пусть процедура put класса STACK имеет вид:

put (x: G) is

-- Поместить x на вершину.

require

not full

deferred

ensure

...

end

где функция full всегда возвращает ложное значение, а значит, стек по умолчанию никогда не бывает полным.

full: BOOLEAN is

-- Заполнено ли представление стека?

-- (По умолчанию, нет)

do Result := False end

Тогда в BOUNDED_STACK достаточно переопределить full:

full: BOOLEAN is

-- Заполнено ли представление стека?

-- (Да, если число элементов равно емкости стека)

do Result := (count = capacity) end

Предусловие, такое как not full, включающее свойство, которое переопределяется потомками, называется абстрактным (abstract) предусловием.

Такое использование абстрактных предусловий для соблюдения правила Утверждения Переобъявления может показаться обманом, однако это не так. Несмотря на то, что конкретное предусловие фактически становится более сильным, абстрактное предусловие не меняется. Важно не то, как реализуется утверждение, а то, как оно представлено клиентам в интерфейсе класса (краткой или плоско-краткой форме). Предваренный условием вызов

if not s.full then s.put (a) end

будет корректен независимо от вида STACK, присоединенного к s.

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

[x]. ограниченный стек является стеком;

[x]. в стек всегда можно добавить еще один элемент.

Если предпочесть первое свойство и допускать порождение BOUNDED_STACK от STACK, мы должны согласиться с тем, что общее понятие стека включает предположение о невозможности в ряде случаев выполнить операцию put, абстрактно выраженное запросом full.

Было бы ошибкой включить в виде постусловия подпрограммы full в классе STACK выражение Result = False или (придерживаясь рекомендуемого стиля, эквивалентный ему) инвариант not full. Это - случай излишней спецификации, ограничивающей свободу реализации компонентов потомками класса.
Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

5.17 АБСТРАКТНЫЕ ОБРАЩЕНИЯ К ФАЙЛОВЫМ СИСТЕМАМ

Из книги Архитектура операционной системы UNIX автора Бах Морис Дж

5.17 АБСТРАКТНЫЕ ОБРАЩЕНИЯ К ФАЙЛОВЫМ СИСТЕМАМ Уайнбергером было введено понятие «тип файловой системы» для объяснения механизма работы принадлежавшей ему сетевой файловой системы (см. краткое описание этого механизма в [Killian 84]) и в позднейшей версии системы V


1. Абстрактные структуры данных

Из книги Информатика и информационные технологии: конспект лекций автора Цветкова А В

1. Абстрактные структуры данных Структурированные типы данных, такие как массивы, множества, записи, представляют собой статические структуры, так как их размеры неизменны в течение всего времени выполнения программы.Часто требуется, чтобы структуры данных меняли свои


17. Абстрактные структуры данных

Из книги Информатика и информационные технологии автора Цветкова А В

17. Абстрактные структуры данных Структурированные типы данных, такие как массивы, множества, записи, представляют собой статические структуры, так как их размеры неизменны в течение всего времени выполнения программы.Часто требуется, чтобы структуры данных меняли свои


R.10.3 Абстрактные классы

Из книги Справочное руководство по C++ автора Страустрап Бьярн

R.10.3 Абстрактные классы Абстрактные классы дают средство для представления в языке общих понятий, таких, например, как фигура, для которых могут использоваться только конкретные их варианты, например, круг или квадрат. Кроме того абстрактный класс позволяет задать


Абстрактные классы

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Абстрактные классы В данный момент базовый класс Employee скомпонован так, что он может поставлять своим потомкам защищенные члены-переменные, а также два виртуальных метода (GiveBonus() и DisplayStats()), которые могут переопределяться производным классом. Все это хорошо, но данный


Интерфейсы и абстрактные поставщики данных

Из книги Человеческий фактор в программировании автора Константин Ларри Л

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


44 Абстрактные объекты

Из книги Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT автора Фролов Александр Вячеславович

44 Абстрактные объекты В фантастическом фильме «Темная звезда», являющемся классикой андеграунда, смелый лейтенант Дулитл пытается прочитать лекцию по феноменологии умной бомбе, готовой разнести себя вместе с кораблем. «Вселенная — это абстракция, — поспешно


Абстрактные классы

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

Абстрактные классы Виртуальные методы могут быть объявлены как чисто виртуальные. Для этого после описания метода указывается специальный спецификатор (= 0). Он означает, что описанные методы не определены.Класс в котором определен хотя бы один чисто виртуальный метод


Лекция 6. Абстрактные типы данных (АТД)

Из книги Язык программирования Си для персонального компьютера автора Бочков C. О.

Лекция 6. Абстрактные типы данных (АТД) Чтобы объекты играли лидирующую роль в архитектуре ПО, нужно их адекватно описывать. В этой лекции показывается, как это делать. Если вам не терпится окунуться в глубины объектной технологии и подробно изучить множественное


Предусловия

Из книги C++ для начинающих автора Липпман Стенли

Предусловия Частичные функции являются неустранимым фактом процесса проектирования ПО, отражающим очевидное наблюдение: не каждая операция применима ко всем объектам. Но они также являются и потенциальным источником ошибок: если функция f из X в Y является частичной, то


Предусловия и постусловия

Из книги Описание языка PascalABC.NET автора Коллектив РуБоард

Предусловия и постусловия Первое использование утверждений - семантическая спецификация программ. Программа - это не просто часть кода, она задает реализацию функции, входящей в спецификацию АТД. Задачу, выполняемую функцией, необходимо выразить точно, как в интересах


Предусловия

Из книги автора

Предусловия Предусловия выражают ограничения, выполнение которых необходимо для корректной работы функции. Здесь:[x]. put не может быть вызвана, если стек заполнен;[x]. remove и item не могут быть применены к пустому стеку.Предусловия применяются ко всем вызовам программы, как


Предусловия и статус экспорта

Из книги автора

Предусловия и статус экспорта Возможно, вы заметили необходимость дополнительного требования, не отраженного в принципе обоснованности предусловия. Для того чтобы клиент мог проверить предусловие, оно не должно использовать закрытые свойства класса, недоступность


Абстрактные имена типов

Из книги автора

Абстрактные имена типов В разделах 3.8.1 и 3.8.2 рассматривались объявления, в которых типам присваиваются идентификаторы для последующего использования. Однако иногда возникает необходимость специфицировать некоторый тип данных без присвоения ему идентификатора и без


6. Абстрактные контейнерные типы

Из книги автора

6. Абстрактные контейнерные типы В этой главе мы продолжим рассмотрение типов данных, начатое в главе 3, представим дополнительную информацию о классах vector и string и познакомимся с другими контейнерными типами, входящими в состав стандартной библиотеки С++. Мы также


Абстрактные методы

Из книги автора

Абстрактные методы Методы, предназначенные для переопределения в подклассах, объявляются с ключевым словом abstract и называются абстрактными. Данные методы являются виртуальными, но ключевое слово virtual использовать не нужно. Например: type Shape = class private x,y: integer; public