Лекции по информатике (984119), страница 28
Текст из файла (страница 28)
с технологической позиции воплощает нисходящук> точку зрения на ЛТД как на набор операций, но не как на множество оперируемых обьектов. В языке программирования такое определение оформляется как специальная синтаксическая конструкция -- часть программы, которая называется классом (в языках Симула 67 и Сопспггеп1, Раэса1), кластером (С1Х), формой (А11»1<аг<1), ъ<одулем (Мо<1п1а, Епс!1<1), определением (Меэа), пакетоъл 1Ада), капсулой (Кпеве1).
Семантическая роль этой конструкщли, ее содержимое и взаимодействие с другими частями программы в разных языках могут быть существенно разными. В саъюй развитой форме в определение АТД входят следующие четыре части: 1. внешность (видимая часть, сопряжение, интерфейс), содержащая имя определяемого типа (понятия), имена операций с указанием типов их аргументов и значений и т. пб '2.
абстрактное описание операций и обьектов, с которыми они работают, средствами некоторого язьпса спецификаций, допускающего, в частности, формулирование свой<.тв; 3. конкретное (логическое) описание этих операций на обычном распространенном языке программирования предыдущего поколения: 4. описание связи между 2 и 3, обьясняющее, в каком смысле часть 3 корректно представляет часть 2.
В наиболес развитой форме <л1Д присутствуют в исследовательских языках А1р1<аг<1, СЕС', и, конечно же, в полноценных средах обьектно-ориентированного программирования, поглотивгпих А"ГД в качестве неотьемлемой составной части. 7.2.1 Методы абстракции в языках программирования Процесс, абстракции может быть рассмотрен как некоторое обобгцение ~21).
Он позволяет нам забыть об информации и, следовательно, рассматривать различные предметы так, .как если бы они были эквивалентны. Мы выполняем это в надежде упростить наш анализ, отделяя существенные атрибуты от несущественных. Однако при этом важно знать, что критерий такого отделения во многоь< зависит от контекста. В контексте школьного курса, мы учимся абстрагировать от (8<<3)» 3 и 5 + 3 к понятию, представленному числоъл 8. В дальнейшем мы узнаем, что при работе на большинстве вычислительных машин такая абстракция приводит к неприятностям ~40~. Например, рассмотрим структуру, приведенную на рисунке.
Понятием здесь является «млекопитающие». Все млекопитаклцие обладак>т определенными оощими характеристиками. Например, .все женские особи этого класса вырабатывая>т молоко, На таком уровне абстракции мы фокусируемся именно на этих общих характеристиках и игнорируем раз- личи.я между существующими видами млекопитающих.
Иерархия абстракций Г .* Н )илсаты Грызуны Обезьяны Человек 1осп1с1: =Га1не 1:= 1ожЬоппс1(а) Мп1е 1 < ЫдЬЬоппс1(а) + 1 с1о 11 а[1] = е СЬеп х:= 1 1оппс1: =огне епс1 1:=1+1 епс1 1оппс1:=Ка1ве 1: = 1йдЬЬоппс1[а) тл Ь11е 1 > 1отсЬоппс1(а) — 1 с1о 11 а[1] = е СЬеп х:= 1 1оппс1: =огне епс1 1:=1 — 1 епс1 На уровне абстракции, определенном использованным языком высокого уровня, очевидно, что приведенные фрагменты отличаются друт от друга: если е присутствует в а, На нижнем уровне абстракции мы сосрссдоточиваем свое внимание на конкретных представителях семейства млс;копитающих.
В этом случае мы можем абстрагироваться, рассматривая не отдельных представителей или даже особей, а группы родственных особей, например, приматов или грызунов. Здесь опять мы рассматриваем общие характеристики, например тот факт, что все приматы носят своих детенышей, а не отличия между, скажем, человеком и шилспанзе.
Эти отличия остаются существенными и на, более низких уровнях абстракции, Эта иерархия относится к вполне определенной области зоологии, однако она приложима также и к другим областям этой науки. Более машинно-ориентированным примером, весьма полезным при составлении большей части программ, является концепция файла. Файлы абстрагированы от конкретного носителя, реализуя долговременное и постоянно доступное хранилище поименованных единиц. Операционные системы отличаются по способам работы с файлалси.
Например, структура имен файлов может меняться от системы к системе. Изменяется также и способ их размещения на устройствах внешней памяти. В данном разделе мы рассмотрим различные виды абстракций и общие принципы применения их в программах. Наиболее существенным достижением в этой области является на сегодняшний день развитие языков высокого уровня. Имея дело непосредственно с конструкциями языка высокого уровня, а не с различными наборами машинных инструкций, в которые данные конструкции лсогут быть трапслированы, .программист существенно упрощает свой труд. В последние годы программистов перестал удовлетворять уроьепь абстракции, достигаемый в программах, написанных даже на языке высокого уровня.
Рассмотрим фрагмент программы линейного поиска: то первый фрагмент отыскивает индекс его первого вхождения, .а второй - индекс последнего вхождения. Первая программа устанавливает т', в ЕгЕд66оыиЕ(а) + 1, а вторая- в ЕоьвЕюиисЕ(а) — 1. Обе программы, однако, были написаны для выполнения одной и той же функции: установить в Евин значение Еа1ве, если е отсутствует в а, а в противном случае установить в ЕоипсЕ багие и в з индекс вхождения е в а. Если нам необходимо выполнение именно этого требования, то становится очевидным, что приведенные фрагменты программ не находятся на требуемом уровне абстракции. Одним из подходов к репюнию такой проблемы является создание языков более высокого уровня, реализованных на базе некоторого фиксированного набора относительно обобщенных универсальных структур данных и мощном наборе примитивов, используемых для манипуляции с ними.
Например, рассмотрим язык, в котором имеются примитивы ьэ ш и пнЕех оЕ, позволяющие осуществлять соответствующие операции над массивами. Тогда рассматриваемая задача легко реализуется следующим образом: ЕошЫ: — 1а ш (а, е) ЕЕ Еоцпс1 СЬеп х г= паек оЕ (а, е) ешЕ Недостатком такого подхода является предположение о том, что разраГютчик языка включит в него большинство абстракций, которые могут понадобиться пользователю.
Предвидеть все возможные ситуации довольно затруднительно. Однако, даже если это и удалось бы сделать, получившийся язык содержал бы столь много встроенных абстракций, что работа. с пим стала бы невозможной. Альтернативой может быть создание таких языковых механизмов, которые позволяют программисту создавать свои собственные абстракции по мере необходимости. Е1аиболее распространенным механизмом такого рода является использование процедур. Разделяя в программе тело процедуры и обращения к ней, язык высокого уровня реализует тем самым два важных метода абстракции: абстрпкцпл через парал~етрпзацию и абсшЕяил1 ил через спсцпфпкацит 7.2.1.1 Параметризационный метод Абстракция через параметризацию позволяет нам, используя параметры, представить фактически неограниченный набор различных вычислений одной программой, которая есть абстракция всех этих наборов ~40).
Рассмотрим следующий текст программы: х~х+уэр В ней описаны вычисления., в процессе которых квадрат значения некоторой переменной х складывается с квадратом значения переменной у. О другой стороны, выражение Л Лх, р: ЕпЕ. (х * я. + и ~ р) описывает набор вычислений, в процессе которых возводится в квадрат значение, хранимое в некоторой целочисленной переменной (к полученному результату мы временно ссылаемся как к г) и этот результат добавляется к квалрату значения, хранимого в другой целочислешюй переменной, временно называемой нами у. В этом выражении мы называем х и у формальными параметрами, а выражение т, ~ х + д ~ у-телом выражения. Мы производим вычисления, связывая формальные параметры с аргументами и вычисляя затем все выражение. Например, т,у: гЫ.(аа ~ х+ и ~ у)(и, в) эквивалентно и>э гв+ в -.
В более привычном представлении мы можем заменить приведенное выпю выражение Л на ас1нагеэ — ргос (х, у: >пс) геФпгпв (п>1) ге1пгп (х * х - у~у) епс1 а замену формальных параметров — на фактические и вычисление выражения можем выполнять через обращение к процедуре: вс1цагеэ(вчи) Программисты часто используют абстракцию через параметризацию, даже не замечая этого. Например, предположим, что нам необходима процедура, которая сортирует массив целых чисел а. В далысейшем, вероятно, понадобится отсортировать некоторый другой массив, возможно, в другом месте этой же программы. Однако маловероятно, что каждый такой массив будет иметь имя а,.
Мы, следовательно, используем абстракцию через параметризацию, обобщая этим процедуру и делая ее более универсальной. Абстракция через параметризацию является важным средством повышения универссальности програмль Программа вогК(), сортирующая произ»ольный массив чисел, полезнее той, которая может раск>тать только с конкретным массивом целых чисел. Дальнейшее абстрагирование позволяет еще болыпе обобщить программу. Например, мы можем определить абстракцию вог1(), .которая работает над массивами как целых, так и действительных чисел или даже вообще над различными массивонодобными структурами. Абстракция через параметризацию весьма полезное средство. Она не только позволяет относительно просто описывать сюлыпое (даже бесконечное) число вычислений, но и является легко и эффективно реализуемой на языках программирования.