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

Заключение

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

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

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

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

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

Лекция 8. Абстракція даних Абстракции данных

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

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

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

С другой стороны, предположим, что мы включаем операции в тип следующим образом:

абстракция данных =<объекты, операции>

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

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

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

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

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

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

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