Введение в программирование - Учебное пособие (Корочкин А. В.)

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 являются мощным средством построения больших программных систем из ком­понентов подсистем.

Ш СОВЕТЫ:—————————————————————————

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

*  Если новый библиотечный модуль есть независимый, то есть вводит новую абстракцию, которая зависит только частично от существующей, то инкапсулируйте новую абстракцию в раздельный библиотечный модуль.

*  Используйте дочерний библиотечный пакет для реализации подкомпонент системы.

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

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

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

*  Используйте дочерние модули для представления различных видов явления для разных пользователей ( клиентов ).

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