Ада-95. Компилятор GNAT

       

Пакеты как средство абстракции данных


Пакет в языке Ада представляет собой конструкцию, которая может использоваться для определения абстрактных данных.

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

Пакет предоставляет возможность связать отчетливо выраженный набор спецификаций для работы со структурой данных (или с классом структур данных) с некоторыми, возможно скрытыми, подробностями реализации.

При использовании пакетов для абстракции данных их можно разделить на два вида: пакеты-преобразователи и пакеты-владельцы.

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

Более точно это можно охарактеризовать следующим образом:

Пакет-преобразователь (невладелец) может обновлять только те данные, которые были переданы ему через формальные параметры.

Такой пакет не содержит внутри себя информацию о состоянии, относящуюся к этим данным.

Это означает, что пакет не может содержать внутри себя обновляемых данных.

Поскольку пакет-преобразователь "не владеет" никакой информацией о состоянии, каждая выполняемая им операция должна возвращать результат вызвавшей его программе.

Пакет-преобразователь не может "помнить" результаты предыдущих обращений к нему.

Простым примером пакета-преобразователя может служить пакет, который создает комплексные числа, производит операции над комплексными числами или осуществляет обе эти операции.

Пакет-владелец



"чувствителен к истории", поэтому он может "помнить" результаты предыдущих обращений к нему.

Пакет-владелец "владеет" некоторой информацией о состоянии.

Это означает, что пакет содержит внутри себя данные, которые могут быть обновлены в течение жизни этого пакета.

Таким образом, для выполнения операции пакету могут быть переданы данные через его формальные параметры.




Пакет- владелец после выполнения операции не должен обязательно возвращать результат вызвавшей его программе.

Примером пакета-владельца может служить пакет, который поддерживает для компилятора базовую таблицу активных файлов.

Следует заметить, что пакеты-преобразователи, как правило, используются для реализации абстрактных типов данных, которые предоставляют клиентской программе тип данных с помощью которого в ней могут быть описаны объекты (переменные) этого типа.

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

Причем, такой объект непосредственно не доступен для клиента, а манипуляция этим объектом осуществляется через подпрограммы, которые указаны в спецификации пакета.

Каждый пакет имеет приватную и открытую части (также называемые видимой и невидимой частями).

Открытая часть непосредственно доступна клиентской программе через:

явное указание перед программой имен пакетов, к которым должен осуществляться доступ (такое указание носит название списка with)


  • вложение пакета внутрь клиентской программы, делая этим видимую часть пакета локально доступной (что осуществляется согласно правилам, напоминающим правила видимости в языке Алгол)


  • Первый из этих механизмов представляет собой важное новшество, внесенное языками, подобными языку Ада.

    Использование его настоятельно рекомендуется.

    Второй из этих механизмов использовать нежелательно. Его применение ведет к появлению трудночитаемых и трудноотлаживаемых программ и является "вредным наследием" блочно-структурированных языков, подобных Алголу-60.

    В любом случае приватная часть пакета непосредственно недоступна для клиентской программы.

    Эта информация становится доступной только косвенным образом, посредством выполнения операций, указанных в информации об интерфейсе в видимой части.

    Поскольку структура пакета обеспечивает четкое разделение на приватную и видимую части (спецификации), то процесс разработки приватной части может осуществляться отдельно от видимой.

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


    Содержание раздела