13.4 иерархические библиотекиВ Дде 95 концепция использования библиотечных модулей для построения больших и сложных программных систем получила дальнейшее развитие в виде механизма иерархических библиотек.
161 Глава О.Структура программы и раздельная компиляция Иерархические библиотеки основываются на ведении понятия родительского ( parent ) и дочернего ( child ) модулей. Дочерние модули в свою очередь могут быть либо публичными ( ( public child ), либо приватными ( private childe ). A.BZ Имя дочернего библиотечного модуля является составным и определяет его позицию в иерархии библиотеки. Например, Р.С - имя дочернего модуля, для которого модуль Р является родительским. На рис . 13.1 представлено дерево иерархии библиотечных модулей. A.BZ.M A.BZ.M.E1 А.ВХ.С1 А.ВХ.С2 A.BZ.M.E2 Рис. 13.1 Если дочерний библиотечный модуль Р.С описан в контексте with, то он рассматривается как модуль, находящийся в его родительском модуле Р, и для него сохраняются правила именования и види- 163 162 Ада 95. Введение в программирование Глава О.Структура программы и раздельная компиляция
мости как для вложенных модулей, несмотря на то, что модуль Р.С является самостоятельным библиотечным модулем Добавление нового дочернего модуля Р.Х не требует немедленной перекомпиляции существующих библиотечных модулей. Использование иерархии библиотек позволяет решить многие проблемы, существовавшие в Аде 83. Например, создание пакетов, работающих с общим личным типом, или расширение ресурсов существующего пакета. Такие проблемы либо не решаются в Аде 83, либо требуют соответствующих изменений в программе и перекомпиляции модулей. П Пример 1. Имеется пакет VEC для работы с векторами. Ресурсы пакета -приватный тип Vector и две функции Sum и Sub. package VEC is type Vector is private; function Sum (VA, VB : Vector ) return Vector ; function Sub (VA, VB : Vector) return Vector; private type Vector is array (1.. 20 ) of float; end VEC; Mult для Необходимо добавить к пакету еще подпрограмму умножения векторов. Это можно сделать: • путем изменения спецификации пакета VEC, добавив в него спецификацию процедуры Mult; • путем создания дочернего пакета VEC.MLT. Первый подход потребует перекомпиляции не только самого модуля , но и всех модулей, зависящих от него. Второй , основанный на механизме иерархических библиотек, гораздо эффективнее. package VEC.MLT is function Mult (VA, VB : Vector) return Float; end VEC.MLT. Так как пакет VEC.MLT является дочерним для пакета VEC , то в нем приватный тип Vector доступен и может использоваться в подпрограмме Mult. Правила видимости для дочерних библиотечных пакетов: • дочерний библиотечный пакет декларируется внутри области видимости определения его родительского модуля после его спецификации; • приватная часть спецификации и тело дочернего пакета "видят" приватную часть родительского модуля. П Пример 2. package BOX is type Data is private ; private end BOX; - - дочерний пакет package BOX.ZIP is type Result is private; private end BOX.ZIP; В силу того, что пакет BOX.ZIP является дочерним пакетом для пакета BOX, при определении в нем приватного типа Result можно использовать тип Data . Клиенты пакета BOX ( модули использу-ющиее этот пакет ) не требуют перекомпиляции, если дочерний пакет изменяется; новые дочерние модули могут быть добавлены без изменения существующих клиентов. |
| Оглавление| |