Читаем Основы объектно-ориентированного программирования полностью

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

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

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

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

Типичным примером этого является порождение 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. Это - случай излишней спецификации, ограничивающей свободу реализации компонентов потомками класса.

Правило языка

Правило Утверждений Переобъявления, так как оно сформулировано, является концептуальным руководством. Как преобразовать его в безопасное и проверяемое правило языка?

Перейти на страницу:

Похожие книги

Основы информатики: Учебник для вузов
Основы информатики: Учебник для вузов

Учебник состоит из двух разделов: теоретического и практического. В теоретической части учебника изложены основы современной информатики как комплексной научно-технической дисциплины, включающей изучение структуры и общих свойств информации и информационных процессов, общих принципов построения вычислительных устройств, рассмотрены вопросы организации и функционирования информационно-вычислительных сетей, компьютерной безопасности, представлены ключевые понятия алгоритмизации и программирования, баз данных и СУБД. Для контроля полученных теоретических знаний предлагаются вопросы для самопроверки и тесты. Практическая часть освещает алгоритмы основных действий при работе с текстовым процессором Microsoft Word, табличным редактором Microsoft Excel, программой для создания презентаций Microsoft Power Point, программами-архиваторами и антивирусными программами. В качестве закрепления пройденного практического курса в конце каждого раздела предлагается выполнить самостоятельную работу.

Вадим Васильевич Лысенко , Лариса Александровна Малинина , Максим Анатольевич Беляев

Зарубежная компьютерная, околокомпьютерная литература / Прочая компьютерная литература / Книги по IT
Об интеллекте
Об интеллекте

В книге "Об интеллекте" Джефф Хокинс представляет революционную теорию на стыке нейробиологии, психологии и кибернетики и описывающую систему "память-предсказание" как основу человеческого интеллекта. Автор отмечает, что все предшествующие попытки создания разумных машин провалились из-за фундаментальной ошибки разработчиков, стремившихся воссоздать человеческое поведение, но не учитывавших природу биологического разума. Джефф Хокинс предполагает, что идеи, сформулированные им в книге "Об интеллекте", лягут в основу создания истинного искусственного интеллекта - не копирующего, а превосходящего человеческий разум. Кроме этого книга содержит рассуждения о последствиях и возможностях создания разумных машин, взгляды автора на природу и отличительные особенности человеческого интеллекта.Книга рекомендуется всем, кого интересует устройство человеческого мозга и принципы его функционирования, а также тем, кто занимается проблемами разработки искусственного интеллекта.

Джефф Хокинс , Джеф Хокинс , Сандра Блейксли , Сандра Блэйксли

Зарубежная компьютерная, околокомпьютерная литература / Технические науки / Прочая компьютерная литература / Образование и наука / Книги по IT