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

164 Глава 8

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

Констатация одного и того же факта двумя различными спосо­бами дает возможность читателям лучше понять спецификацию. Это позволяет избежать неверного понимания и сокращает об­щее время изучения спецификации. С этой точки зрения удачным примером может служить спецификация процедуры indexes, при­веденная на рис. 8.2.

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

pv = proc (inc, r: real, n: int) returns (value: real)

requires inc > 0 & r •> 0 & n :> 0.

effects Возвращает имеющееся значение годового дохода для inc за пе­риод n лет в проценте прироста без риска величиной г.

То есть value == inc+ (inc/(l +г)+...+ (inc/(l + г)"~'). Например, pv (100, .10,3) = 100+ 100/1.1 + 100/1.21

Для читателей, недостаточно хорошо знакомых с финансовыми вопросами, нелегко будет понять фразу «имеющееся значение». И с этой точки зрения вторая строка, «т. е.», представляет для них безусловный интерес. Вторая часть, «например», может быть использована читателями для подтверждения правильности своего понимания.

Если читатели извлекают пользу из подобной избыточности, то важно сделать так, чтобы вся подобная информация была ка­ким-либо образом помечена с этой точки зрения. Хорошим спо­собом является использование вводных слов и оборотов типа «например» или «т. е.».

Избыточность не сокращает число ошибок в спецификации. Она делает их более очевидными и дает возможность читателю их обнаружить. Рассмотрим, например,

too.cold = proc (temp: int) returns (b: bool)

effects b = true, если temp < 0 градусов по Фаренгейту; в противном случае b = false.

too.cold = proc (temp; int) returns (b: bool)

effects b = true, если temp < 0 градусов по Фаренгейту; в противном случае b = false. То есть b == true в точности в том случае, когда temp не больше, чем точка замерзания воды при нормальной температуре и давлении.

Спецификации

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

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

billion = proc ( ) returns (b: int)

effects Возвращает целое число значением в один биллион. billion = proc ( ) returns (b: int) effects Возвращает целое число значением в один биллион, т. е. 10°.

Как американские, так и английские читатели найдут первую спе­цификацию абсолютно безошибочной. К сожалению, они интер­претируют ее совершенно по-разному, поскольку в Соединенных Штатах биллион есть 10", а в Великобритании биллион есть 10".

8.3. Почему именно спецификации?

Спецификации важны для достижения требуемой модульности программы. Абстракция используется для декомпозиции про­граммы на модули. Однако взятая в отдельности абстракция яв­ляется малопонятной. Без какого-либо описания мы не можем ни сказать, что она из себя представляет, ни отличить ее от одной из своих реализаций. В качестве такого описания и выступает спецификация.

Спецификация описывает соглашение между разработчиками и пользователями. Разработчик соглашается написать модуль, который относится к заданному набору спецификаторов. Поль­зователь соглашается не полагаться на знания о том, какой именно член набора используется, т. е. не предполагать ничего такого, что не было бы указано в спецификации. Такое соглашение поз­воляет разделить анализ реализации от собственно использова­ния программы. Спецификации дают возможность создавать ло­гические основы, позволяющие успешно «разделять и властво­вать».

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

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