2.2. Пакеты в языке Ада

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

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

Пакеты в языке Ада могут быть использованы для следующих функций:

  1. Указания набора разрешенных операций над одним или несколькими типами данных.
  2. Реализации тела, состоящего из операций, определенных в первом пункте.
  3. Сокрытия всех объектов, спецификаций и подробностей реализации, приведенных в п. 2, от пользователя, использующего операции, перечисленные в п. 1.

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

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

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

      procedure ОР1(х: in строка, у: out строка);
   

то эта операция может быть вызвана из программы пользователя следующим образом:

      Shoe_Mgr.ОР1("baby shoes", new_shoe_style);
   

Видимая пользователю спецификация ОР1 (плюс дополнительный комментарий к ОР1) описывает функциональный интерфейс с ОР1, т. е. описывает то, какие действия выполняет операция ОР1 над входными аргументами. Однако подробности работы операции ОР1 скрыты от пользователя в приватной части пакета. Другими словами, методы, посредством которых происходит работа ОР1, являются скрытыми. Изменяемые данные внутри пакета также доступны только косвенно. В частности, если Shoe_Mgr есть пакет-владелец, то в качестве приватной части может выступать база данных, которая обновляется в результате вызова ОР1. Доступ к этой базе данных может быть только косвенный, через ОР1 или через какую-либо другую видимую операцию, определенную для Shoe_Mgr.

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

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

назад оглавление вперед
Рейтинг ресурсов "Весь Екатеринбург"