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

Абстракция

Процесс абстракции может быть рассмотрен как некоторое обобщение. Он озволяет нам забыть об информации и, следова­тельно, рассматривать различные предметы так, как если бы они были эквивалентны. Мы выполняем это в надежде упростить наш анализ, отделяя существенные атрибуты от несущественных. Од­нако при этом важно знать, что критерий такого отделения во многом зависит от контекста. В контексте школьного курса мы учимся абстрагировать от (8/3)*3 и 5+3к понятию, представ­ленному числом 8.В дальнейшем мы узнаем, что при работе на большинстве вычислительных машин такая абстракция приводит к неприятностям.

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

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

Млекопитающие

... Приматы Грызуны ...

Обезьяна Человек

Рис. 1.1.Иерархия абстракций.

Иерархия абстракций, показанная на рис. 1.1,относится к вполне определенной области зоологии, однако она приложима также и к другим областям этой науки. Более машинно-ориенти­рованным примером, весьма полезным при составлении большей части программ, является концепция «файла». Файлы абстраги­рованы от конкретного носителя, реализуя долговременное и по­стоянно доступное хранилище поименованных единиц. Операци­онные системы отличаются по способам работы с файлами. На­пример, структура имен файлов может меняться от системы к си­стеме. Изменяется также и способ их размещения на устройствах внешней памяти.

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

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

found := false found := false

i :== lowbound (a) i := highbound (a)

while i<highbound (a) + 1 do while i>lo-wbound (a) - 1 do

if a [i] = e then z := i if a [i]=e then z := i

found := true found := true

end end

i:= i+ 1 i:= I - 1

end end

Рис. 1.2.Два фрагмента программы.

На уровне абстракции, определенном использованным языком вы­сокого уровня, очевидно, что приведенные фрагменты отличаются друг от друга: если е присутствует в а, то первый фрагмент оты­скивает индекс его первого вхождения, а второй —индекс по­следнего вхождения. Первая программа устанавливаетiвhigh-bound(а) + 1,а вторая —вlowbound (1) — 1.Обе программы, однако, были написаны для выполнения одной и той же функции: установить вfoundзначениеfalse, если е отсутствует в а, а в про­тивном случае установить вfoundtrueи в z—индекс вхождения е в а. Если нам необходимо выполнение именно этого требования, то становится очевидным, что приведенные фрагменты программ не находятся на требуемом уровне абстракции.

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

found := is_in (a, e)

if found then z := index_of (a, e) end

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

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

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

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