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


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


   begin

      return первый /= null;

   end есть_клиенты;

end очередь;

Функция есть_клиенты нужна, чтобы можно было узнать о наличии клиентов (чтобы не возникало ИСКЛЮЧИТЕЛЬНОЙ СИТУАЦИИ "нет_клиентов"). Однако даже если бы мы сами не позаботились о проверке наличия клиентов (в процедуре "из_очереди"), то при попытке взять компоненту "тело" по ссылке null возникла бы предопределенная исключительная ситуация "неправильная_ссылка".

Обратите внимание: генератор "new очередник" работает в сущности с перекрытием. Создается объект типа "очередник" и ссылка на него именно того типа, который нужен по контексту! Ведь по самому генератору нельзя узнать, какого типа ссылка требуется (в принципе на объекты типа "очередник" могут ссылаться объекты разных ссылочных типов). Можно представить себе ЯП, где в генераторе указывается ссылочный тип (в нашем случае было бы "new на_очередника"). Тогда привлечение контекста не потребовалось бы. Но в таком случае при изменении левой части присваивания пришлось бы менять и генератор. Это понижает надежность при модификациях программ.

 Кроме того, вторая трактовка хуже соответствует сути генератора. Ведь его задача - создать объект типа "очередник", а ссылка нужна только для присваивания. Тем не менее, скажем, в Модуле-2 принята именно вторая трактовка прежде всего из-за простоты ее реализации.

Таким образом, мы познакомились со ссылочными типами в действии, когда они применяются для создания целостных динамических объектов (обратите внимание, таким объектом служит динамически создаваемая и уничтожаемая очередь клиентов, состоящая также из динамических объектов/.

Вопрос. Через какое имя доступны атрибуты нашего динамического объекта?

Ответ. Через имя пакета "очередь".

Этот пример можно развивать в различных направлениях. Если нужно вводить много очередей (возможно, с клиентами других типов), то легко осознать потребность в параметрическом типе "очередь".


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