Под абстракцией понимается формирование представления о качестве или свойствах предмета, полученных путем мысленного удаления «несущественных» подробностей и оставления лишь тех, которые имеют непосредственное отношение к решаемой задаче.
В языках высокого уровня абстракция находит широкое применение, например, при использовании концепции «файла». Файлы абстрагируются от предметной области, конкретного носителя информации, реализуя долговременное постоянно доступное хранилище поименованных единиц – бит. Другим примером абстракции является развитие и совершенствование алгоритмических языков высокого уровня, в которых реализованы два важнейших метода абстракций: абстракции через параметризацию и абстракции через спецификацию.
Примером абстракции через параметризацию является концепция «функция», передаваемые параметры которой являются формальными, а фактические связываются с ними в момент использования такой абстракции. Программисты часто используют абстракцию через параметризацию, даже не замечая этого.
Абстракция через спецификацию позволяет абстрагироваться от процесса вычислений, описанных в теле процедуры, до уровня знаний лишь того, что данная процедура должна в итоге реализовать. Это достигается путем задания для каждой процедуры спецификации, описывающей эффект ее работы, после чего смысл обращения к данной процедуре становится ясным через анализ этой спецификации, а не самого тела процедуры. Абстракции через спецификацию реализуются, например, в виде библиотечных функций, широко используемых программистами.
Абстракции через параметризацию и через спецификацию являются мощными средствами создания программ. Они позволяют определить три различных типа абстракций: процедурную абстракцию, абстракцию данных и абстракцию через итерацию.
Процедурная абстракция объединяет в себе методы абстракции через параметризацию и через спецификацию, позволяя абстрагировать отдельную операцию или событие. Процедура выполняет преобразование входных аргументов в выходные. Процедурная абстракция имеет спецификацию, состоящую из заголовка и описания функции, выполняемой процедурой. Реализация процедуры должна выполнять действия, определенные в спецификации.
Абстракция данных – это такая техника программирования, при которой устанавливаются определенные типы объектов (как основного, так и специального применения) в качестве основных базовых для применения. Результатом ее применения будет легкая отладка, лучшая поддержка и лучшая структура программы. Определенные типы затем можно использовать так же удобно, как и встроенные типы, поскольку компилятор С++ проверяет соответствие используемых типов.
Использование абстракции через параметризацию и спецификацию проиллюстрируем на примере программы стека чисел с использованием функций push() и pop(), рассмотренных в разделе 10 (пример 4). Модифицируем ее для строковых данных
Пример 1
// Primer12_1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<iostream.h>
#include<string.h>
const int MAXSIZE = 20;
enum boolean { FALSE, TRUE };
struct Stack // Структура, описывающая стек
{
char s[MAXSIZE];
int top;
};
void Reset(Stack * stk) // Очистить стек
{
stk -> top = 0;
}
void Push(char c, Stack * stk) // Поместить символ в стек
{
stk->s[stk->top++] = c;
}
char Pop(Stack * stk) // Извлечь символ из стека
{
return (stk->s[—stk->top]);
}
boolean Empty(Stack * stk) // Проверка, пустой ли стек
{
return (boolean)(stk->top == 0);
}
boolean Full(Stack * stk) // Проверка переполнения стека
{
return (boolean)(stk->top == MAXSIZE – 1);
}
int main(int argc, char* argv[ ])
{
char * ptr="Stroka simvolov";
Stack *q = new Stack;
Reset(q);
for (int i=0; i< (int)strlen(ptr); i++) Push(*(ptr+i),q);
for (i=0; i< (int)strlen(ptr); i++) cout<<Pop(q);
cout<<endl;
return 0;
}
Этот фрагмент содержит функции работы со стеком и может быть использован при моделировании стека строковых данных. Здесь абстракция через параметризацию представлена в виде набора функций, абстракция через спецификацию – в виде использования стандартных функций, абстракция данных – в виде структуры Stack, созданной пользователем.
Абстракция итерации (итератор) – является некоторым обобщением итерационных методов, имеющихся в большинстве языков программирования. Они позволяют пользователям выполнять итерации для произвольных типов данных. Итератор удобен, эффективен и сохраняет абстракцию через спецификацию. Он вызывается как процедура, создающая множество различных результатов. Модуль, использующий итератор, будет содержать некоторую структуру организации цикла. В языке С++ абстракция итерации реализуется операторами while, do-while, for.