|
Программирование >> Структурное программирование
Заметим, что реализации функций getFirstName и getLastName возвращают клиенту класса постоянные указатели на символьные строки. Если клиент желает сохранить копию имени или фамилии, он должен скопировать динамически распределенную область памяти объекта класса Employee после того, как получит от объекта постоянный указатель на символьную строку. Заметим, что можно также реализовать getFirstName и getLastName так, что от клиента будет требоваться передавать каждой функции массив символов и его размер. Тогда функции могли бы копировать имя и фамилию в массив символов, который передал им клиент. 7.8. Абстракция данных и скрытие информации Обычно классы скрывают детали своей реализации от клиентов класса. В качестве примера скрытия информации рассмотрим структуру данных, называемую стек. Представьте сбе стек в виде стопки тарелок. Когда тарелка ставится на стопку, она всегда помещается на ее вершину (это называется поместить в стек - pushing onto the stack), a когда тарелка убирается из стопки, то всегда убирается тарелка с ее вершины (это называется вытолкнуть из стека - popping off the stack). Стеки известны как структуры данных типа последним вошел - первым вышел (last-in, first-out - LIFO) - последний элемент, помещенный (вставленный) в стек, является первым элементом, выталкиваемым (удаляемым) из стека. Программист может создать класс стек и скрыть от его клиентов реализацию стека. Стеки можно легко реализовать с помощью массивов и других способов (таких как связные списки - смотри главу 15 Структуры данных ). Клиенту класса стек не нужно знать, как реализован стек. Клиенту только надо знать, что когда он разместил элементы данных в стеке, то к ним можно обращаться только в последовательности последним вошел - первым вышел. Такой подход называется абстракция данных, а классы С-Ь-Ь определяют абстрактные типы данных (АТД). Хотя может оказаться, что пользователь знает детали реализации класса, но он может писать программу, не обращая внимания на эти детали. Это означает, что какой-то класс, например, тот, который реализует стек и его операции push (поместить) и pop (вытолкнуть), можно заменить другой его версией, не затрагивая остальной части системы, пока не изменен открытый интерфейс этого класса. Задача языка высокого уровня - создать представление, удобное для использования программистом. Не существует единственного приемлемого стандартного представления и это одна из причин того, что существует так много языков программирования. Объектно-ориентированное программирование на С-Ы- дает еще одно представление. Большинство языков программирования делает акцент на действия. В этих языках данные существуют для поддержки действий, необходимых программе. Так или иначе, данные менее интересны , чем действия. Данные в этих языках негибки . Существует всего несколько встроенных типов данных и создание программистом своих собственных новых типов данных представляет определенные трудности. Этот взгляд изменился с появлением C-t-t- и объектно-ориентированного стиля программирования. С-Ы- повышает значение данных. Основная дея- тельность при работе с C-I-+ заключается в создании новых типов данных (т.е. классов) и представлении взаимодействия между объектами этих типов данных. Для продвижения в этом направлении среда языков программирования нуждается в формализации некоторых записей, относящихся к данным. Мы рассматриваем формализацию как запись абстрактных типов данных (АТД). АТД уделяют сейчас так же много внимания, как структурному программированию два десятилетия назад. АТД не заменяют структурное программирование. Скорее, АТД обеспечивают дополнительную формализацию, которая может улучшить процесс разработки программ. Что такое абстрактный тип данных? Рассмотрим встроенный тип int. В голову приходит целое число в математике, однако int в компьютере - это не то же самое, что целое в математике. В частности, компьютерные значения int обычно жестко ограничены по размеру. Например, на 32-разрядной машине значение int может быть ограничено диапазоном от -1-2 миллиардов до -2 миллиардов. Если результат вычислений выходит из этого диапазона, происходит ошибка и машина реагирует каким-либо машинно-ориентированным способом, включая возможность получения втихомолку неправильного результата. Для математических целых чисел этой проблемы не существует. Таким образом, компьютерная запись int на самом деле лишь приблизительно соответствует реально существующим целым числам. То же самое справедливо и по отношению к числам с плавающей десятичной запятой float. Приближением является даже тип char; значения char обычно представляют собой 8-битовые образы, ничего общего не имеющие с символами, которые они отображают, такими как заглавная буква Z, строчная z, знак доллара ($), цифра (5) и т.д. Значения типа char в большинстве компьютеров жестко ограничены по сравнению с диапазоном реально существующих символов. 7-битовый набор символов ANSI обеспечивает представление лишь 127 различных значений символов. Это совершенно неадекватно представлению таких языков как японский и китайский, которые требуют тысяч символов. Существует точка зрения, что встроенные типы данных, обеспечиваемые такими языками программирования, как С-Ь-Ь, на самом деле являются только аппроксимациями или моделями понятий и поведения реального мира. Мы взяли для иллюстрации этой точки зрения int, но вы можете рассмотреть и другие примеры. Типы, подобные int, float, char и т.д. - это примеры абстрактных типов данных. По существу, они представляют собой способы представления реально существующих понятий с некоторым допустимым уровнем точности внутри компьютерной системы. Абстрактные типы данных на самом деле охватывают два понятия, а именно, представление данных и операции, которые разрешены над этими данными. Например, запись int определяет в С-Ь-Ь операции сложения, вычитания, умножения, деления и модуля, но деление на нуль не определено; эти разрешенные операции выполняются способом, чувствительным к параметрам машины, таким, как размер фиксированного слова используемой компьютерной системы. Другим примером является запись отрицательных целых чисел, для которых операции и представление данных ясны, но операция вычисления квадратного корня из отрицательного числа не определена. В С-Ь-Ь программист для реализации абстрактных типов данных использует классы. Новые АТД, созданные в средах С++, могут быть собственностью отдельных людей, небольших групп или компаний. АТД можно помещать в стандартные библиотеки классов с целью их широкого распространения. Это не способствует стандартизации, хотя фактически вопрос о стандартизации возникает. В полном объеме значение С++ будет реализовано лишь тогда, когда станут широко доступны важные и стандартизированные библиотеки классов. Необходимы формальные процедуры поддержки разработки стандартизированных библиотек. В Соединенных Штатах такая стандартизация часто осуществляется при участии ANSI - Американского Национального Института Стандартов. ANSI непрерывно развивает стандартную версию С++. Независимо от того, каким образом в конце концов появляются эти библиотеки, читатель, который знает С++ и объектно-ориентированное программирование, будет готов овладеть достоинствами быстрой компонентно-ориентированной разработки программного обеспечения благодаря возможностям библиотек АТД. 7.8.1. Пример: абстрактный тип данных массив Мы обсуждали массивы в главе 4. Массив - это не более чем указатель и некоторая область памяти. Если программист осторожен и нетребователен, для выполнения операций с массивами достаточно этих примитивных знаний. Существует много операций, которые хотелось бь1 выполнять с массивами, однако они не встроены в С++. С помощью классов С++ программист может создать АТД массив, который предпочтительнее сырых массивов. Класс массив (такой класс будет создан в главе 8) может обеспечивать ряд новых полезных возможностей, таких как проверка диапазона индексов; произвольный выбор диапазона индексов; присваивание массива; ввод и вывод массива; массивы, которые знают свой размер. Недостаток здесь заключается в том, что мы создаем заказной, нестандартный тип данных, который не доступен точно в таком виде в большинстве реализаций С++. Впрочем, использование С++ и объектно-ориентированного программирования быстро возрастает. Решающим моментом является то, что работы по профессиональному программированию развиваются в направлении крупномасштабной стандартизации и распространения библиотек классов для более полной реализации потенциала объектной ориентации. С++ имеет небольшой набор встроенных типов. Абстрактные типы данных расширяют базу языка программирования. Замечание по технике программирования 7.8 Программист имеет возможность создавать новые типы, используя формализм классов. Эти новые типы можно применять так же, как и встроенные типы данных. Поэтому С++ является расширяемым языком. Несмотря на возможность легко расширять его с помощью новых типов, базовый язык сам по себе остается неизменным.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |