Семантика использования псевдонимов

We use cookies. Read the Privacy and Cookie Policy

Семантика использования псевдонимов

Неприятным последствием применения псевдонимов (и статических, и динамических) является воздействие операций на сущности, даже не упоминаемые в операциях.

Модель вычислений без псевдонимов обладает приятным свойством: приведенный ниже фрагмент всегда справедлив

[БЕЗ СЮРПРИЗОВ]

-- Предположим, что свойство P(y) выполняется

x := y

C (x)

-- P(y) останется выполнимым.

Этот пример подразумевает, что P (y) это частное свойство y, а C (x) некая операция с участием x, но не y. В этом случае никакие действия над x не влияют на значение y.

Для сущностей развернутых типов это действительно так. Приведем типичный пример с x и y типа INTEGER:

-- Предположим, что здесь y = 0

x := y

x := -1

-- По-прежнему y "= 0.

В этом случае нет никакого способа изменить y путем присваивания значения x. Обратимся теперь к аналогичной ситуации с участием динамических псевдонимов. Пусть x и y экземпляры следующего класса C:

class C feature

boolattr: BOOLEAN

-- Булев атрибут для описания некоторого свойства объекта.

set_true is

-- Установка boolattr в true.

do

boolattr := True

end

... Другие компоненты ...

end

Теперь предположим, что тип y это C, и что y в определенный момент времени выполнения не является пустой ссылкой. Тогда следующий пример уже не обладает свойством "БЕЗ СЮРПРИЗОВ":

[СЮРПРИЗ, СЮРПРИЗ!]

-- Предполагаем, что y.boolattr равно false.

x := y

-- Значение y.boolattr по-прежнему false.

x.set_true

-- Но теперь y.boolattr равно true!

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