Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
44
Добавлен:
23.03.2015
Размер:
884 Кб
Скачать
☆

108 Глава 5

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

Такой метод может быть получен через обобщение процедур. Вместо того чтобы иметь одну область определения, мы разделим область определения D на некоторое число подмножеств, объеди­нение которых дает D:

D=DoU^U...UDn

Каждое подмножество «особо» в том смысле, что процедура ведет себя по-разному на каждом из них. Например, для опера­ции choose мы можем разделить область определения на два под­множества:

Do = ^все непустые наборы^ Di == {пустой набор}

Если аргумент принадлежит Do, процедура choose, как и раньше, возвращает выбранное целое число. Если аргумент при­надлежит Di, также осуществляется возврат из процедуры, но так, что пользователь оповещается о возникшей проблеме. Как мы уже отмечали, невозможно оповестить пользователя, исполь­зуя целое число, так как любое целое число является потенциаль­ным результатом для какого-то аргумента из Do. Следовательно, необходим другой метод оповещения.

Мы обеспечим оповещение, имея различные области изменения для каждого подмножества области определения и придав различ­ным случаям различные имена. Произвольно дадим случаю аргумента из Do имя «обычный». Имена для других случаев могут быть выбраны тем, кто определяет процедуру. Таким образом, имеем р: do —>- обычный (ro) di -»- ИМЯ1 (ri)

Dn -^ имя„ (Rn)

где имя^, ..., имяц — имена «исключительных» ситуаций, соот­ветствующих аргументам, принадлежащим Di,... Dn соответ­ственно, а Но, ... Rn описывает число, порядок и типы резуль­татов, возвращаемых в каждом случае. Имя^ ..., имяп называются исключительными ситуациями. Например, имеем

choose: Do ->• обычный (int) Di ->- empty ( )

. где Pi пусто, так как в этом случае пользователю не возвращается никакого результата.

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

р 5.1. Спецификации

Л Чтобы специфицировать процедуры, которые вызывают исклю­чительные ситуации, добавим в спецификацию предложение signals:

signals % здесь приводится список имен и результатов исключительных ситуаций

Это предложение — часть заголовка. Оно следует за пред­ложением returns. Если исключительных ситуаций не имеется, оно может быть опущено. Исключительные ситуации должны быть разделены запятыми, а их результаты (если такие имеются) должны быть заключены в скобки. Например, предложение

choose = proc (i: intset) returns (int) signals (empty)

говорит о том, что процедура choose может вызывать исключи­тельную ситуацию empty и что в этом случае не возвращается никакого результата. Предложение же

search = proc (a: array [int], х: int) returns (ind: int) signals (not-in, duplicate (indi: int))

говорит о том, что процедура ^earch может вызывать две исклю­чительные ситуации: not-in /(без результата) и duplicate (ре­зультат—целое число). Имя indi вводится для ссылок на этот результат в остальной части спецификации.

Как и раньше, секция effects должна определять поведение процедуры для всех фактических аргументов, отвечающих пред­ложению requires. Так как это поведение включает в себя исключи­тельные ситуации, секция effects должна определять, что приводит к вызову каждой исключительной ситуации и что делает про­цедура в каждом таком случае. Если процедура сигнализирует об исключительной ситуации для аргументов, принадлежащих D;, возможные значения аргументов, принадлежащие D,, не должны Напутствовать в предложении requires. Завершение процедуры оповещением об исключительной ситуации — это один из нор­мальных режимов работы этой процедуры.

Соседние файлы в папке POSIBNIK