12.2  Абстракция

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

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

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

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

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

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

Абстракция данных – это такая техника программирования, при которой устанавливаются определенные типы объектов (как основного, так и специального применения) в качестве основных базовых для применения. Результатом ее применения  будет легкая отладка, лучшая поддержка и лучшая структура программы. Определенные типы затем можно использовать так же удобно, как и встроенные типы, поскольку компилятор С++ проверяет соответствие используемых типов.

Использование абстракции через параметризацию и спецификацию проиллюстрируем на примере программы стека чисел с использованием функций 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.