Основы объектно-ориентированного программирования

         

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


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

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

[БЕЗ СЮРПРИЗОВ] -- Предположим, что свойство 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.



Содержание раздела