суббота, 5 декабря 2009 г.

7.8. Абстракция данных и скрытие информации

Обычно классы скрывают детали своей реализации от клиентов класса. В качестве примера скрытия информации рассмотрим структуру данных, называемую стек.
Представьте сбе стек в виде стопки тарелок. Когда тарелка ставится на стопку, она всегда помещается на ее вершину (это называется поместить в стек pushing onto the stack), а когда тарелка убирается из стопки, то всегда убирается тарелка с ее вершины (это называется вытолкнуть из стека popping off the stack). Стеки известны как структуры данных типа последним вошел первым вышел (last-in, first-outLIFO)последний элемент, помещенный (вставленный) в стек, является первым элементом, вы­талкиваемым (удаляемым) из стека.
Программист может создать класс стек и скрыть от его клиентов ре­ализацию стека. Стеки можно легко реализовать с помощью массивов и других способов (таких как связные списки смотри главу 15 «Структуры данных»). Клиенту класса стек не нужно знать, как реализован стек. Кли­енту только надо знать, что когда он разместил элементы данных в стеке, то к ним можно обращаться только в последовательности последним вошел первым вышел. Такой подход называется абстракция данных, а классы С++ определяют абстрактные типы данных (АТД). Хотя может оказаться, что пользователь знает детали реализации класса, но он может писать программу, не обращая внимания на эти детали. Это означает, что какой-то класс, например, тот, который реализует стек и его операции push (поместить) и pop (вытолкнуть), можно заменить другой его версией, не затрагивая остальной части системы, пока не изменен открытый интерфейс этого класса.
Задача языка высокого уровня создать представление, удобное для использования программистом. Не существует единственного приемлемого стандартного представления и это одна из причин того, что существует так много языков программирования. Объектно-ориентированное программиро­вание на С++ дает еще одно представление.
Большинство языков программирования делает акцент на действия. В этих языках данные существуют для поддержки действий, необходимых про­грамме. Так или иначе, данные «менее интересны», чем действия. Данные в этих языках «негибки». Существует всего несколько встроенных типов данных и создание программистом своих собственных новых типов данных представляет определенные трудности.
Этот взгляд изменился с появлением С++ и объектно-ориентированного стиля программирования. С++ повышает значение данных. Основная дея- тельность при работе с С++ заключается в создании новых типов данных (т.е. классов) и представлении взаимодействия между объектами этих типов данных.
Для продвижения в этом направлении среда языков программирования нуждается в формализации некоторых записей, относящихся к данным. Мы рассматриваем формализацию как запись абстрактных типов данных (АТД). АТД уделяют сейчас так же много внимания, как структурному програм­мированию два десятилетия назад. АТД не заменяют структурное програм­мирование. Скорее, АТД обеспечивают дополнительную формализацию, ко­торая может улучшить процесс разработки программ.
Что такое абстрактный тип данных? Рассмотрим встроенный тип int. В голову приходит целое число в математике, однако int в компьютере это не то же самое, что целое в математике. В частности, компьютерные значения int обычно жестко ограничены по размеру. Например, на 32-раз­рядной машине значение int может быть ограничено диапазоном от +2 мил­лиардов до -2 миллиардов. Если результат вычислений выходит из этого диапазона, происходит ошибка и машина реагирует каким-либо машинно- ориентированным способом, включая возможность получения «втихомолку» неправильного результата. Для математических целых чисел этой проблемы не существует. Таким образом, компьютерная запись int на самом деле лишь приблизительно соответствует реально существующим целым числам. То же самое справедливо и по отношению к числам с плавающей десятичной запятой float.
Приближением является даже тип char; значения char обычно пред­ставляют собой 8-битовые образы, ничего общего не имеющие с символами, которые они отображают, такими как заглавная буква Z, строчная z, знак доллара ($), цифра (5) и т.д. Значения типа char в большинстве компьютеров жестко ограничены по сравнению с диапазоном реально существующих сим­волов. 7-битовый набор символов ANSI обеспечивает представление лишь 127 различных значений символов. Это совершенно неадекватно представ­лению таких языков как японский и китайский, которые требуют тысяч символов.
Существует точка зрения, что встроенные типы данных, обеспечиваемые такими языками программирования, как С++, на самом деле являются толь­ко аппроксимациями или моделями понятий и поведения реального мира. Мы взяли для иллюстрации этой точки зрения int, но вы можете рассмотреть и другие примеры. Типы, подобные int, float, char и т.д. это примеры абстрактных типов данных. По существу, они представляют собой способы представления реально существующих понятий с некоторым допустимым уровнем точности внутри компьютерной системы.
Абстрактные типы данных на самом деле охватывают два понятия, а именно, представление данных и операции, которые разрешены над этими данными. Например, запись int определяет в С++ операции сложения, вы­читания, умножения, деления и модуля, но деление на нуль не определено; эти разрешенные операции выполняются способом, чувствительным к пара­метрам машины, таким, как размер фиксированного слова используемой ком­пьютерной системы. Другим примером является запись отрицательных целых чисел, для которых операции и представление данных ясны, но операция вычисления квадратного корня из отрицательного числа не определена. В С++ программист для реализации абстрактных типов данных использует классы.

Комментариев нет:

Отправить комментарий