Корректность предложения rescue
Формальное определение корректности класса выдвигает два требования к компонентам класса. Первое (1) требует, чтобы процедуры создания гарантировали корректную инициализацию - выполнение инварианта класса. Второе (2) напрямую относится к нашему обсуждению, требуя от каждой программы, запущенной при условии выполнения предусловия и инварианта класса, выполнения в завершающем состоянии постусловия и инварианта класса. Диаграмма, описывающая жизненный цикл объекта, отражает эти требования:
Рис. 12.3. Жизнь объекта
Формально правило (2) говорит:
3.
Для каждой экспортируемой программы
{prer (xr) and INV} Bodyr {postr (xr) and INV}
Для простоты позвольте в дальнейшем рассмотрении игнорировать аргументы
Пусть
{ ? } Rescuer { ? }
с заменой знаков вопроса соответствующими утверждениями. (Полезно, перед дальнейшим чтением постараться самостоятельно задать эти утверждения.)
Рассмотрим, прежде всего, предусловие для
Поэтому остается единственная возможность - предусловие для
Для ленивого создателя
Что можно сказать о постусловии
Отсюда следует правило, в котором уже больше нет знаков вопросов:
Правило корректности для включающего отказ предложения rescue
4.
{True} Rescuer {INV}
Похожие рассуждения дают правило для
Правило корректности для включающего повтор предложения rescue
5.
{True} Retryr {INV and prer }
Четкое разделение ролей
Интересно сравнить формальные роли тела и предложения
{prer and INV} Bodyr {postr (xr) INV}
{True} Rescuer {INV}
Входное утверждение сильнее для
Выходное утверждение также сильнее для
Эти правила отражают разделение ролей между предложением do и предложением rescue. Задача тела обеспечить выполнение контракта программы, не управляя непосредственно исключениями. Задача rescue - управлять обработкой исключениями, возвращая управление либо телу программы, либо вызывающей программе. Но в обязанности
