Неприятным последствием применения псевдонимов (и статических, и динамических) является воздействие операций на сущности, даже не упоминаемые в операциях.
Модель вычислений без псевдонимов обладает приятным свойством: приведенный ниже фрагмент всегда справедлив
[БЕЗ СЮРПРИЗОВ] -- Предположим, что свойство 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.