Пакет в языке Ада представляет собой конструкцию, которую программист может использовать для определения абстрактных данных, Большинство экспертов рассматривают эту возможность как основной вклад языка Ада в решение задачи разработки программного обеспечения с наименьшими затратами, большей надежностью, гибкостью и верифицируемостью. Пакет дает нам возможность связать отчетливо выраженный набор спецификаций для работы со структурой данных (или с классом структур данных) с некоторыми (скрытыми) подробностями реализации.
Перед тем как приступить к обсуждению и разбору конкретных примеров, мы выделим два важных класса пакетов в языке Ада. Мы будем называть их пакетами-владельцами и пакетами-преобразователями. Пакеты-преобразователи могут использоваться для реализации чисто абстрактных типов данных, а пакеты-владельцы - для реализации более обобщенных видов менеджеров типа.
Пакеты в языке Ада могут быть использованы для следующих функций:
Таким образом, для каждого пакета-владельца или пакета-преобразователя имеется приватная и открытая части (также называемые видимой и невидимой частями). Открытая часть непосредственно доступна программе пользователя через:
Первый из этих механизмов представляет собой важное новшество, внесенное языками, подобными языку Ада. Использование его настоятельно рекомендуется. Второй из этих механизмов использовать нежелательно. Его применение ведет к появлению труд-ночитаемых и трудноотлаживаемых программ и является "вредным наследием" блочно-структурированных языков, подобных Алголу-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.
Поскольку структура пакета обеспечивает четкое разделение на приватную и видимую части (спецификации), то приватная часть пакета может выполняться отдельно от видимой. [В этой вводной части сознательно рассматриваются некоторые второстепенные детали.] Это означает, что приватная часть может быть заменена на другую часть (когда появятся лучшие или более правильные идеи реализации) без изменения оставшейся части программы.
В следующем разделе мы приведем больше доводов и подробностей, касающихся пакетов, рассмотрев скелетную структуру одного достаточно жизненного примера с использованием пакетов. Мы также мотивируем необходимость наличия набора взаимосвязанных задач.