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

Лекция 6. Види та методи абстракції в програмуванні. Абстракция через параметризацию

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

х*х+у*у

В ней описаны вычисления, в процессе которых квадрат зна­чения, хранящийся в некоторой переменной х, складывается о квадратом значения, хранящегося в переменной у. С другой сто­роны, выражениеlambda

λх, у:int. (х *х +у *у)

описывает набор вычислений, в процессе которых возводится в квадрат значение, хранимое в некоторой целочисленной пере­менной (к полученному результату мы временно ссылаемся как к x) и этот результат добавляется к квадрату значения, хранимого в другой целочисленной переменной, временно называемой нами у. В этом выражении мы называем х и у формальными параметрами, а выражение х*х+у*у - телом выражения. Мы производим вычисления, связывая формальные параметры с аргументами и вычисляя затем все выражение. Например,х,у:int. (х *х +у*у) (w, z)эквивалентноw*w +z*z

В более привычном представлении мы можем заменить приве­денное выше выражениеlambdaна

squares = proc (х, у: int) returns (int)

return(х *х+ у*у)

end

а замену формальных параметров —на фактические и вычисление выражения можем выполнять через обращение к процедуреsquares (w, z).

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

Абстракция через параметризацию является важным средством повышения универсальности программ. Программаsort, сорти­рующая произвольный массив чисел, полезнее той, которая может работать только с конкретным массивом целых чисел. Дальней­шее абстрагирование позволяет еще больше обобщить программу. Например, мы можем определить абстракциюsort, которая ра­ботает над массивами как целых, так и действительных чисел или даже вообще над различными массивоподобными структурами.

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

Абстракция через спецификацию

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

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

Рассмотрим, например, процедуруsqrtна рис. 1.3.Поскольку в процедуре имеется спецификация, мы можем игнорировать тело процедуры. Обращение видаcallу := sqrt(х) будет иметь сле­дующий смысл: «Если при вызове процедуры х больше 0,то после выполнения процедуры у есть приближение квадратного корня из х». Отметим, что начальные и конечные условия позволяют нам не упоминать о значении у для случая, когда х не больше 0.

При анализе спецификации для уяснения смысла обращения к процедуре мы придерживаемся двух чечких правил:

1.После выполнения процедуры можно считать, что конечное условие выполнено.

2.Можно ограничитьсятолькотеми свойствами, которые под­разумевает конечное условие.

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

sqrt = proc (coef : real) returns (real)

%requirescoef>0

% effects возвращает приближение квадратного корня, из coel

ans: real = coef/2.0;

i : int := 1

while i<7 do

ans := ans - ((ans * ans — coef)/(2.0 * ans))

i:=i+1

end

return (ans)

end sqrt

Рис. 1.3. Процедураsqrt

Второе правило уточняет, что мы на самом деле абстрагиро­вались от тела процедуры, позволив себе не обращать внимания -на несущественную информацию. Именно это «забывание инфор­мации» и отличает абстракцию от декомпозиции. Анализируя тело процедуры sqrt,пользователи данной процедуры могут извлечь для себя большое количество информации, не следующее из ко­нечного условия, например, что sqrt (4)возвратит результат +2. Однако в спецификации мы говорим, что подобная информация о возвращаемом результате игнорируется. Этим мы утверждаем, что процедура sqrtесть абстракция, представляющая собой на­бор всех вычислений, при котором вычисляется «приближение квадратного корня из х».

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