Языки программирования. Практический сравнительный анализ


Языки программирования. Практический сравнительный анализ - стр. 211


В приведенном там решении находящиеся в очереди объекты хранятся в статическом массиве фиксированной длины. Это и неудобно (какая длина нужна?) и ненадежно (массив можно испортить - очередь не является целостным объектом). Приходится полностью моделировать выделение и освобождение памяти для объектов из очереди.

Ада позволяет, во-первых, защитить очередь от нежелательного доступе, сделать ее инкапсулированным объектом; во-вторых, легко справиться с неограниченностью очереди.

Все это можно  сделать с помощью подходящего пакета с двумя операциями "в_очередь" и "из_очереди".

Напишем сначала спецификацию пакета.

package  очередь is

type  клиент is  array (1..200) of  CHARACTER;

- - пусть для определенности нужно "обслуживать" тексты

- - длиной 200 символов; позже покажем, как можно

- - настраивать пакет на нужный тип клиента.

procedure  в_очередь(х : in клиент);

procedure  из_очереди (х : out  клиент);

end очередь;

Здесь пока знакомо все. Ключевой момент  - реализация нашего пакета, а именно представление очереди. Так как количество стоящих в ней клиентов может изменяться в широких пределах, будем представлять очередь списком записей типа

type очередник is

                     record

                  тело: клиент;

                  связь: на_очередника;

                end record ;

Тип на_очередника можно ввести объявлением

        type на_очередника is  access очередник;

Ключевое слово access  (доступ) указывает, что это именно ссылочный тип.

"Очередник" будет у нас динамическим объектом, создаваемым для каждого нового клиента по мере его прибытия.

В Аде динамические объекты, как обычно, создаются с помощью ГЕНЕРАТОРОВ, а доступ к вновь созданным динамическим объектам обеспечивается взаимодействием квазистатических и динамических объектов  ССЫЛОЧНЫХ ТИПОВ.

Основная идея состоит в том, что можно объявить тип Р ссылок на объекты другого типа S. После этого становится возможно не только обычным образом объявлять объекты типа S (т.е.


- Начало -  - Назад -  - Вперед -