Раздел 7.4 - Инкапсуляция

Рассмотренные нами примеры ``Figures'' и ``Critters'' излишне "открыты". Что имеется ввиду? В этих примерах всем пользователям (``публике'') разрешено видеть как именно определены типы внутри пакетов. Следовательно, любой пользователь имеет возможность просмотреть или изменить любые данные внутри такого пакета. Иногда это как раз то, что требуется. Но, чаще всего, это неприемлемо, так как усложняет внесение дальнейших изменений в реализацию.

В Ada имеется несколько механизмов, для того, чтобы ``скрыть'' от пользователей (``клиентов'') информацию о каком-то типе. Запрет доступа к информации для клиентов, которые не должны ее использовать, называется инкапсуляцией. Инкапсуляция делает сопровождение программ более удобным и повышает их надежность.

В уроке, в котором рассматривались типы, было показано, каким образом можно описать ``приватные'' типы в Ada. Это справедливо и для тэговых типов, поэтому их тоже можно описывать как ``private'', скрывая особенности реализации от пользователей. В языке Ada имеется несколько способов управления видимостью информации.

Наиболее общий способ сокрытия особенностей реализации состоит в том, что тип в разделе описаний пакета описывается, как ``tagged private'' (если нет необходимости, чтобы пользователь знал о родительском типе) или ``new имя_родительского_типа with private'' (если необходимо, чтобы пользователь знал о родительском типе). После каждого описания типа необходимо помещать описания подпрограмм, выполняющих операции над ним. В приватной части раздела описаний пакета помещается полное описание типа.

Вот еще один пример. Создадим тип с именем `File' , содержащий имя файла, и производный тип `Ada_File' , который кроме всего прочего, хранит информацию о том, был ли скомпилирован данный файл. Каждый из типов имеет подпрограмму ``View''. Вот как это будет выглядеть:

  package File_System is
    type File is tagged private;
    procedure View(F : File);

    type Ada_File is new File with private;
    procedure View(F : Ada_File);

  private
    type File is tagged
     record
       -- Строки будут рассмотрены далее
       Name : String(1..20);
     end record;

    type Ada_File is new File with
     record
       Compiled : Boolean := False;
     end record;
  end File_System;

Далеее необходимо создать тело пакета c подпрограммами:

  package body File_System is
    procedure View(F : File) is
    begin
      -- ...
    end View;

    procedure View(F : Ada_File) is
    begin
      -- ...
    end View;
  end File_System;

В общем случае, пакет в Ada может содержать внутри несколько типов. Раздел описаний пакета в этом случае будет содержать набор типов, описанных как ``tagged private'', или ``new Родительский_Тип with private'', а в приватной части раздела описаний пакета они будут описаны ``как положено''. В теле пакета будут находиться подпрограммы.


Упражнение:

Дана процедура Try_Stuff:

  with File_System;
  procedure Try_Stuff is
   My_Ada_File : File_System.Ada_File;
  begin
   -- Дописать.
  end Try_Stuff;

Допустим, в строке, содержащей комментарий ``Дописать'' необходимо присвоить свойству ``Compiled'' объекта My_Ada_File значение ``True''. Как это сделать?

  1. Заменить эту строку на My_Ada_File.Compiled := True;
  2. Заменить эту строку на Compiled := True;
  3. Этого нельзя сделать, руководствуясь материалом, представленным в разделе.

Вы можете также:

PREVIOUS Перейти к предыдущему разделу

NEXT     Перейти к следующему разделу

OUTLINE  Вернуться к содержанию Урока 7

David A. Wheeler (dwheeler@ida.org)

Перевод: Юрий Королев   Общая редакция перевода: Г.Ю. Сисюк

Исходная копия этого документа находится по адресу "http://www.adahome.com/Tutorials/Lovelace/s7s4.htm".

Исходная копия перевода размещена на сайте http://www.ada-ru.org