- •Информационная модель предметной области
- •Моделирование задач на эвм
- •Преобразование информации при решении задачи на эвм
- •Понятие о данных
- •Абстрактные структуры данных
- •Классификация структур данных
- •14101954
- •Абстракция
- •Лекция 6. Види та методи абстракції в програмуванні. Абстракция через параметризацию
- •Абстракция через спецификацию
- •Виды абстракций
- •Лекция 7. Процедурна абстракція. Специфікація процедурної абстракції. Процедурная абстракция
- •Спецификации
- •Спецификации процедурных абстракций
- •Реализация процедур
- •Более обобщенные процедуры
- •Создание процедурных абстракций
- •Заключение
- •Лекция 8. Абстракція даних Абстракции данных
- •Спецификации для абстракций данных
- •Реализация на языке clu
- •Замечания по поводу операций up и down
- •Использование абстракций данных
- •Лекция 9. Реалізація абстракції даних. Функція абстракції. Функція інваріант подання.
- •Функция абстракции
- •Инвариант представления
- •Сохранение инварианта представления
- •Изменяемые представления
- •Параметризованные абстракции данных
- •Будем искать решение нашей задачи в виде цикла, имеющего следующий вид:
Лекция 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есть абстракция, представляющая собой набор всех вычислений, при котором вычисляется «приближение квадратного корня из х».