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

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

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

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

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

3.3.Спецификации процедурных абстракций

Спецификация процедуры состоит из заголовка и описания функции, выполняемого процедурой.Заголовоксодержит имя про­цедуры, номер, порядок и типы входных и выходных параметров. Кроме этого, выходные параметры могут, а входные должны быть поименованы. Например, заголовок для процедурыremove,dupisесть

remove_dupls ==proc(a:array[int]) а заголовок для процедурыsqrtестьsqrt ==proc(x:real)returns(rt:real)

Информация в заголовке чисто синтаксическая; она описывает «форму» процедуры. Это аналогично описанию «формы» математи­ческой функции:

Г:integer ->integer

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

На рис. 3.2приводится шаблон спецификации для процедуры. Семантическая часть спецификации состоит из трех предложе­ний —requires(требует),modifies(модифицирует) иeffects(эф­фекты). Эти предложения должны появляться в указанном ниже порядке, однако предложенияrequiresиmodifiesобязательными не являются.

рпагпе = proc (...)returns (..,)

requires %этот оператор задает необходимые требованияmodifies %этот оператор идентифицирует все модифицируемые входные

%данные

effects %этот оператор описывает выполняемые функции

Рис. 3.2.Шаблон спецификации для процедурных абстракций.

Предложениеrequiresзадает ограничения, накладываемые на абстракцию. Предложениеrequiresнеобходимо в том случае, если процедура является частичной, т. е. если ее поведение для некоторых входных значений недетерминировано. Если же про­цедура глобальна, т. е. ее поведение определено для всех вход­ных значений, то предложениеrequiresможет быть опущено. В этом случае единственными требованиями, предъявляемыми при обращении к процедуре, являются требования, указанные в заголовке, т. е. число и типы аргументов. Операторmodifiesзадает список имен входных параметров, модифицируемых про­цедурой. Если входные параметры не указаны, то это предло­жение может быть опущено. Наконец, предложениеeffectsопи­сывает работу процедуры со значениями, не охваченными пред­ложениемrequires. Оно определяет выходные значения и модифи­кации, производимые над входными параметрами, перечислен­ными в спискеmodifies. Предложениеeffectsсоставляется исходя из предположения, что требования предложенияrequiresудов­летворены. Однако в том случае, когда требования в предложе­нииrequiresне удовлетворены, о поведении процедуры ничего не сообщается.

concat = proc (а., Ь: string) returns (ab: string)

effectsпо возвратуabесть новая строка, содержащая символы из а (в том порядке, в котором они расположены в а), за которыми следуют символы изb(в том порядке, в котором они расположены в Ь),remove_dupls =proc(a:array [int])

modifiesа

effectsУдаляет из массива а все повторяющиеся элементы. Нижняя гра^ ница а остается без изменений, однако порядок следования оста­вшихся элементов может измениться. Если, например, перед вы­зовом а == [1: 3, 13, 3, 6],то по возвращению массив а имеет ниж­нюю границу, равную 1,и содержит три элемента 3, 13и 6,распо­ложенных в некоторой неопределенной последовательности.search ==proc(a:array[int], х:int)retunis(i;int)requiresмассив а упорядочен по возрастанию.

effectsЕсли элемент х принадлежит массиву а, то возвращается значе­ниеiтакое, что а [i ] =х; в противном случае значениеiна еди­ницу больше, чем значение верхней границы массива а.

Рис. 3.3.Спецификация процедурной абстракции.

На рис. 3.3приведено несколько спецификаций. Процедураconcatне модифицирует входные переменные, а процедура ге-move_duplsизменяет входной массив, что отмечено в предложе­нииmodifies. Отметим, что в спецификации процедурыremove.dupisдается пример. Наличие примеров облегчает понимание спецификации, и их рекомендуется использовать во всех подхо­дящих случаях.

Процедурыconcatиremove_duplsявляются общими процеду­рами, поскольку их спецификации не содержат предложенийrequires. Процедураsearchявляется частичной; она выполняет свои функции только в том случае, если входной массив отсорти­рован. Отметим, что предложениеeffectsничего не говорит о результате работы процедуры в том случае, когда входной мас­сив не отсортирован. В этом случае составитель процедуры может выбрать любой подходящий для него вариант; например, про­цедураsearchможет в этом случае возвращать индекс, выходящий за границы массива, или индекс, лежащий в пределах границ, но не содержащий х, или даже зацикливаться.

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

Соседние файлы в папке Б. Лисков