Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
41
Добавлен:
23.03.2015
Размер:
395.78 Кб
Скачать

1.2.3.Виды абстракций

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

Например, абстракцию sqrtможно сравнить о операцией: она абстрагирует отдельное событие или задачу. Мы будем ссы­латься к абстракциям такого рода как кпроцедурным абстрак­циям.Отметим, что абстракция sqrtвключает в себя как абстрак­цию через параметризацию, так и абстракцию через специфика­цию.

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

Поведение объектов данных наиболее естественно представлятьвтерминах набора операций, применимых к данным объектам. Такой набор включает в себя операции по созданию объектов, получению информации от них и, возможно, их модификации. Например, операции pushи popпринадлежат к классу операций, имеющих смысл при работе со стеками, в то время как для работы с целыми числами используются обычные арифметические опера­ции. Таким образом,абстракция данных(илитип. данных)со­стоит из набора объектов и набора операций, характеризующих поведение этих объектов.

В качестве примера рассмотрим мультинаборы (multisets). Мультинаборы сходны с обычными наборами, за исключением того, что элемент может входить в мультинабор несколько раз. Опера­ции для работы с подобными мультинаборами включают в себя операции empty, insert, delete, number_ofи size.Эти операции создают пустой мультинабор, удаляют и добавляют в него эле­менты, вычисляют, сколько раз данный элемент входит в мульти­набор и сколько всего элементов содержится в мультинаборе. Данные операции могут быть реализованы в языке программиро­вания через соответствующие процедуры. Программисты, работаю­щие с мультинаборами, не должны беспокоиться о том, каким об­разом эти процедуры реализованы. Для них операции empty, insert, delete, number_ofи sizeявляются абстракциями, определя­емыми операторами типа

The size of the multi.set insert (s, e) is equal to size (s) + I (Размер мультинабора insert (s, e)равен размеру size (s) + 1)

For all e, the number, of timese occurs in the multi_ set empty ( )is0. (Для всех eчисло вхождений eв пустой мультинабор empty ( ) равно 0.)

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

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

Далее мы покажем, как осуществлять декомпозицию про­граммы на базе абстракции через итерацию. Акцент будет делаться на абстракции данных. Мы считаем, что, хотя процедурные аб­стракции и абстракции через итерацию и играют существенную роль, организация процесса программирования начинается, как правило, с абстракции данных.

Последующие несколько глав посвящены трем перечисленным видам абстракций —что они из себя представляют, как описыва­ется их поведение и как происходит их реализация. Мы начнем с описания языка программирования CLU,специально созданного для работы по методике, описанной в данной книге, поддерживаю­щего каждый из описываемых видов абстракций. Абстракции на языке CLUреализуются сравнительно просто, поэтому в главах с 3по 6используется именно этот язык. В седьмой главе мы об­судим, как реализовать абстракции на языке Паскаль.

В последней части книги рассматривается использование абстракций при составлении программ. Обсуждаются этапы состав­ления программ, их проектирование и реализация. Книга вклю­чает в себя ряд практических советов, помогающих реилль проб­лемы, возникающие при составлении реальных программ.

Дополнительная литература

Boehnn, Barry W,, 1976. Software engineering. IEEE Transactions on Com­puters C-25 (12): 1226—1241.

Brooks, Frederick P., Jr., 1975. The Mythical Man-Month, Reading, Mass,.: Addison-Wesley Publishing Co.

Buxton, John M., Peter Naur, and Brian Randell (eds.), 1976. Software engi­neering concepts and techniques. In Proceedings of the NATO Conference (New York: Petrocelli/Charter).

Gries, David (ed.), 1978. Part 1: viewpoints on programming. In Programm­ing Methodology, A Collection of Articles by Members of IF IP W02.3 (New York: Springer-Verlag), pp. 7—74.

Упражнения

I.I.Опишите знакомую вам иерархию абстракции.1.2.Выберите написанную или используемую вами процедуру и рассмотрите, каким образом в ней реализована абстракция через спецификацию и через па­раметры.

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

Упражнения

2.1.Вычисление наибольшего общего делителя способом последовятельного вычитания (рис. 2.1)является недостаточно эффективным. Переделайте функциюgcdс использованием деления.2.2.Создайте процедуру с заголовком

тах = proc (a: array [int]) returns (int)

Процедура maxдолжна возвращать максимальное значение в а. Вы можете счи­тать, что массив а является непустым.

2.3.Проиллюстрируйте вызов процедуры gcdна рис. 2.1диаграммой по аналогии с рис. 2.5.

2.4.Массив, передаваемый в качестве аргумента процедуре remove, dupis на рис. 2.5,содержит дублирующие элементы 1и 3.Почему эти элементы не по­казаны на рис. 2,5,в?

2.5.Разработайте процедуру, которая определяет, является ли заданная символьная строка палиндромом. (Палиндром читается одинаково слева и справа, например «deed».) 2.6.Напишите процедуру с заголовком

combine =z proc (a: array [int 1, comb: proctype (int, int) returns (int)) returns (int)

Она должна объединять все элементы массива а, используя аргумент процедурыcomb.Например, combine (a, int$add)складывает все элементы массива а. Вы можете считать, что массив а содержит по крайней мере 2элемента.

2.7.Напишите процедуру, просматривающую поток и возвращающую из него последующее слово, где слово представляет собой любую комбинацию символов, исключая пробелы и разделители строк. Вы можете считать, что поток позиционцрован по первому символу слова.

2.8.Реализуйте процедуру, пропускающую пробелы в потоке. Она должна возвращать поток, позиционированный по первому символу, отличному от про­бела, или символу конца файла, если символы, отличные от пробела, отсутствуют,

Соседние файлы в папке POSIBNIK