Предусловия и статус экспорта
Предусловия и статус экспорта
Возможно, вы заметили необходимость дополнительного требования, не отраженного в принципе обоснованности предусловия. Для того чтобы клиент мог проверить предусловие, оно не должно использовать закрытые свойства класса, недоступность которых отражена в статусе экспорта.
Рассмотрим следующую ситуацию:
-- Предупреждение: это неправильный класс, только в целях иллюстрации.
class SNEAKY feature
tricky is
require
accredited
do
...
end
feature {NONE}
accredited: BOOLEAN is do ... end
end
Спецификация для tricky устанавливает, что любой вызов этой процедуры должен удовлетворять условию, выраженному булевой функцией accredited. Но при экспорте класса эта функция для клиентов является закрытой, поэтому у них нет способа проверить выполнимость условия перед вызовом tricky. Очевидно, подобная ситуация неприемлема.
Причина, по которой принцип Обоснованности предусловия не покрывает подобные ситуации, в том, что это методологический принцип, а мы нуждаемся в правиле языка, заставляющем компилятор контролировать решение проблемы, не полагаясь на разработчиков.
Это правило учитывает все возможные ситуации экспорта, а не только случаи доступности всем клиентам (tricky) или полной недоступности (accredited). Как отмечалось, при обсуждении проблемы скрытия информации, компонент класса можно сделать доступным для некоторых клиентов, явно перечислив их в feature предложении, например feature {A, B, ... }, определяющего доступность только для классов A, B, ... и их потомков. Сформулируем правило языка:
Правило Доступности предусловия
Каждый компонент, появляющийся в предусловии программы, должен быть доступен каждому клиенту, которому доступна сама программа.
В соответствии с этим правилом каждый клиент, способный вызвать программу, способен проверить ее предусловие. По этому правилу класс SNEAKY является коварным, некорректно построенным, поскольку экспортирует tricky с недоступным предусловием. Нетрудно превратить этот класс в правильно построенный, изменив статус экспорта у accredited. Если tricky появится с предложением feature в форме feature {A, B, C}, то accredited должна экспортироваться, по меньшей мере, клиентам A, B, C, появляясь в той же группе feature, что и tricky. Можно задать для accredited собственное feature-предложение в одной из форм: feature {A, B, C}, feature {A, B, C, D, ...} или просто feature. Любое нарушение этого правила приведет к ошибке в период компиляции. Класс SNEAKY, например, будет забракован компилятором.
Подобного правила нет для постусловий. Не является ошибкой в постусловии ссылаться на компоненты, закрытые или экспортируемые избранным клиентам. Просто это означает, что описание эффекта выполнения программы содержит некоторые свойства, непосредственно не используемые клиентом. Подобная ситуация имеет место в процедуре put класса STACK2:
put (x: G) is
-- Добавить элемент x на вершину
require
not full
do
...
ensure
... Другие предложения...
in_top_array_entry: representation @ count = x
end
Последнее предложение в постусловии устанавливает, что элемент массива с индексом count содержит последний втолкнутый в стек элемент. Это свойство реализации, хотя put обычно доступно (экспортируется всем клиентам), массив representation является закрытым. Но ничего ошибочного в постусловии нет. Оно просто включает наряду со свойствами, полезными для клиентов ("Другие предложения"), свойство, имеющее смысл только для тех, кто знаком с полным текстом класса. Такие закрытые предложения не будут появляться в краткой форме класса - документации, предназначенной для авторов клиентских модулей.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Статус подключений
Статус подключений Внутренне PHP имеет три статуса подключения:При нормальном выполнении сценария активно состояние NORMAL. Если во время загрузки страницы пользователь нажал кнопку STOP, активным становится состояние ABORTED. Если сценарий выполняется дольше отведенного ему
О сомнительной пользе экспорта испорченных продуктов
О сомнительной пользе экспорта испорченных продуктов Когда администрация президента Обамы решила прибегнуть к интеллектуальной помощи интернета для усовершенствования американской демократии, она не ожидала, что возникнет столько проблем. Когда работающие на Обаму
Статус
Статус После регистрации ICQ, постоянно будет гостить в вашей области уведомлений (она находится в правой части Панели задач) в виде специального значка. В момент подключения к Интернету вместо значка появится изображение цветка. Если лепестки цветка зеленые, то
1.7.1 Состояние и статус стандартов
1.7.1 Состояние и статус стандартов IAB периодически публикует информацию о работе над протоколами. Стадии разработки определяют текущее состояние протокола:? Experimental (экспериментальный)? Proposed (предлагаемый)? Draft (черновик)? Standard (стандарт)Некоторые протоколы маркируются как
Статус нахождения в Skype
Статус нахождения в Skype В нижней части окна программы вы можете изменить свой статус нахождения в Skype. Большинство опций этого меню интуитивно понятны (рис. 5.23). Часть из них можно установить самому, а некоторые изменяет программа:? например, статус автоматически
Автоматизация импорта и экспорта
Автоматизация импорта и экспорта Назначение спецификации – сохранение параметров импорта или экспорта данных, необходимых программе Access для повторения той или иной операции без участия мастера. Причем в спецификации можно изменить имя исходного или конечного файла
Предусловия
Предусловия Частичные функции являются неустранимым фактом процесса проектирования ПО, отражающим очевидное наблюдение: не каждая операция применима ко всем объектам. Но они также являются и потенциальным источником ошибок: если функция f из X в Y является частичной, то
Архитектурная роль селективного экспорта
Архитектурная роль селективного экспорта Селективный экспорт это не просто удобство, а неотъемлемая часть ОО-архитектуры. Он позволяет группе концептуально связанных классов обеспечить друг другу доступ ко всем своим компонентам, скрыв их от остального мира в
Статус экспорта процедур создания
Статус экспорта процедур создания Для двух процедур создания, объявленных в классе POINT1, предложение feature имело вид feature {NONE}. Это означает, что эти процедуры закрыты для обычных вызовов, но остаются открытыми для порождающих вызовов. Только что представленные два примера
Статус универсальных операций
Статус универсальных операций Последние комментарии частично прояснили вопрос о статусе универсальных операций clone, copy, equal, is_equal, deep_clone, deep_equal.Эти операции не являются языковыми конструкциями, невзирая на их фундаментальную значимость для практики. Они поставляются
Предусловия и постусловия
Предусловия и постусловия Первое использование утверждений - семантическая спецификация программ. Программа - это не просто часть кода, она задает реализацию функции, входящей в спецификацию АТД. Задачу, выполняемую функцией, необходимо выразить точно, как в интересах
Предусловия
Предусловия Предусловия выражают ограничения, выполнение которых необходимо для корректной работы функции. Здесь:[x]. put не может быть вызвана, если стек заполнен;[x]. remove и item не могут быть применены к пустому стеку.Предусловия применяются ко всем вызовам программы, как
Абстрактные предусловия
Абстрактные предусловия Правило ослабления предусловий может оказаться чересчур жестким в случае, когда наследник понижает уровень абстракции, характерный для его предка. К счастью, есть легкий обходной путь, полностью согласующийся с теорией.Типичным примером этого
Форматы экспорта, поддерживаемые Flash
Форматы экспорта, поддерживаемые Flash Все форматы экспорта графики, поддерживаемые Flash, приведены в табл. 21.1. Из этой таблицы видно, что Flash может экспортировать графику как в векторные, так и в растровые форматы. В последнем случае вся векторная графика
Параметры форматов экспорта
Параметры форматов экспорта В этом разделе описываются параметры различных графических форматов, в которые Flash может экспортировать наше изображение, а также диалоговые окна, позволяющие настраивать эти параметры. Эти окна появляются после того, как мы зададим имя