Выбрать главу

[x]. Разделяемые объекты могут быть реализованы как однократные функции. Можно использовать инвариант для указания их константности.

[x]. Однократные процедуры используются там, где операции должны быть выполнены только однажды во время выполнения системы, чаще всего, это связано с инициализацией глобальных параметров системы.

[x]. Тип однократной функции не может быть закрепленным или родовым типом.

[x]. Константы строковых типов внутренне интерпретируются как однократные функции, однако, внешне они выглядят как манифестные константы, значения которых заключается в двойные кавычки.

[x]. Перечислимые типы в стиле языка Pascal не соответствуют объектной методологии. Для представления объектов с несколькими возможными вариантами значений используются символические unique константы. Инициализация значений таких констант выполняется компилятором.

Библиографические замечания

Проблемы перечислимых типов были изучены в работах [Welsh 1977] и [Moffat 1981]. Некоторые приемы, рассмотренные в этой лекции, впервые представлены в [M 1988b].

Упражнения

У18.1 Эмуляция перечислимых типов однократными функциями

Покажите, что при отсутствии unique-типов перечислимый тип языка Pascal

type ERROR = (Normal, Open_error, Read_error)

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

У18.2 Однократные функции для эмуляции unique-значений

Покажите, что в языке без поддержки unique-объявлений результат, аналогичный

value: INTEGER is unique

можно получить, воспользовавшись объявлением вида

value: INTEGER is once...end

где вам необходимо написать тело однократной функции и все, что может еще понадобиться.

У18.3 Однократные функции в родовых классах

Приведите пример однократной функции, чей результат включает родовой параметр, и, если он не корректен, порождает ошибку времени выполнения.

У18.4 Однократные атрибуты?

Исследуйте полезность понятия "однократного атрибута", полученного по образцу однократной функции? Будет ли такой атрибут общим для всех экземпляров класса? Как инициализировать однократные атрибуты? Являются ли они избыточными при наличии однократных функций без аргументов? Если нет, объясните, когда использовать тот или иной механизм. Предложите хороший синтаксис объявления однократных атрибутов.