13.5 приватные дочерние модулиПриватные дочерние модули ( private child units ) предназначены для ограничения видимости в иерархических библиотеках. Такие 164 165 Ада 95. Введение в программирование Глава 13.Структура программы и раздельная компиляция
проблемы возникают при разработке больших программных систем, в которых необходимо ограничить видимость для клиента. В Аде 83 в этом плане невидимым было тело субмодуля, которое компилировалось отдельно. Однако субмодуль подлежал перекомпиляции при изменениях в телах модулей более высокого уровня иерархии. В Аде 95 такая проблема решается путем использования дочерних модулей, которые являются полностью приватными для своих родителей. Пример: package A is type FFA is private; private type FFA is new Base; end A; package A . X is - - дочерний пакет от А X1.X2.X3: exception; end A.X ; - - дочерний пакет от А package A.Y is type FFY is ... ; function Zzy ( Y1 : FFY ) return Ffy ; procedure Tty ( Y2 , Y3 : in FFA ); end A. Y ; procedure A . Т ( T1, T2 : out Float ); - - дочерняя процедура private package A. U is - - приватный дочерний пакет end A . U ; private package A. V is - - приватный дочерниий пакет end A.V; В данном примере родительский пакет А содержит тип FFA , который используется во всей программе. Система содержит три общих ( публичных ) дочерних модуля : пакеты А . X , А . Y и процедуру А . Т . Кроме того, в подсистеме имеются два приватных дочерних модуля - пакеты А . U и А . V . Приватный дочерний модуль может быть определен в любой точке дочерней иерархии. Правила видимости при этом такие же как и для общих дочерних модулей, за исключением следующих особенностей : • приватный дочерний модуль видим только только внутри поддерева иерархии, корнем которой является его родительский модуль; • видимая часть приватного дочернего модуля может иметь доступ к приватной части его родителя. ( Про этом невозможен прямой экспорт информации о приватном типе к пользователю, потому что это не в его видимости. Также невозможен косвенный экспорт через общие модули ). В нашем примере, так как приватный дочерний модуль есть прямой дочерний модуль пакета А , пакет А . U видим в телах А, А . Y и А . Т ( модуль А . X тела не имеет ) , а также видим в обоих телах и спецификации пакета А . V . Но он невидим вне А и пользовательский пакет не может иметь доступ к А . U вообще. При построении иерархических библиотек разрешается использовать настраиваемые модули. Любой родительский модуль может иметь настраиваемые дочерние модули. При этом настраиваемый родительский модуль может иметь только настраиваемые дочерние модули. Для настраиваемого родительского модуля его настраивамый дочерний модуль настраивается в любой точке его видимости в обычном порядке. Настраиваемый родительский модуль должен конкретизироваться раньше своих дочерних модулей. П Пример настраиваемого пакета А : generic type Base is delta < >; N : integer; package A is end A; MM A. R-
166 167 Ада 95. Введение в программирование Глава 13.Структура программы и раздельная компиляция generic package A . X is end A . X ; Конкретизация пакетов А и А . X : With A; package N_A is new A(100, Float); With A . X ; package N_A. N_X is new N_A . X ; Очевидно, что иерархические системы библиотек в Аде 95 являются мощным средством построения больших программных систем из компонентов подсистем. Ш СОВЕТЫ:————————————————————————— * Используйте дочерние библиотечные модули, если новый библиотечный модуль является логическим расширением имеющейся абстракции. * Если новый библиотечный модуль есть независимый, то есть вводит новую абстракцию, которая зависит только частично от существующей, то инкапсулируйте новую абстракцию в раздельный библиотечный модуль. * Используйте дочерний библиотечный пакет для реализации подкомпонент системы. * Используйте публичные дочерние модули для всех частей подсистемы, которые должны быть видимыми при использовании подсистемы. * Используйте дочерние библиотечные пакеты для управления видимостью частей подсистемы. * Используйте приватные дочерние пакеты для всех описаний, которые не должны быть использованы вне подсистемы. * Используйте дочерние модули для представления различных видов явления для разных пользователей ( клиентов ). * Используйте дочерние пакеты вместе обычных пакетов для представления различных видов абстракций. |
| Оглавление| |