Достижимые объекты в ОО-модели

 

ОО-структура данных, представленная в предыдущих лекциях, имеет некоторые отличия от рассмотренной выше структуры.

Рис. 9.8. Достижимость в ОО-модели

Работа любой системы начинается с создания объекта, называемого корневым объектом системы, или просто корнем (когда нет путаницы с корневым классом, задаваемым статически). Корень в этом случае является одним из оригиналов.

Другое множество оригиналов возникает из-за возможного присутствия локальных переменных в подпрограмме. Рассмотрим подпрограмму вида

 

some_routine is

local

rb1, rb2: BOOK3

eb: expanded BOOK3

do

. . .

create rb1

. . .Операции, возможно использующие rb1, rb2 и eb . . .

end

 

При любом вызове и выполнении подпрограммы some_routine , инструкции в теле подпрограммы могут ссылаться на rb1 , rb2 , eb и на присоединенные к ним объекты, если они есть. Это значит, что такие объекты должны быть частью множества достижимых объектов, но не обязательно зависимы от корня. Заметим, для eb всегда есть присоединенный объект, а rb1 и rb2 могут при некоторых запусках иметь значение void .

Локальные сущности ссылочного типа, такие как rb1 и rb2 , подобны переменным подпрограммы, которые в предыдущей модели были размещены в стеке. Локальные сущности развернутого типа, как eb , подобны объектам, расположенным в стеке.

Когда завершается очередной вызов some_routine , исчезают сущности rb1 , rb2 и eb текущей версии. В результате все присоединенные объекты перестают быть частью множества оригиналов. Это не значит, что они становятся недостижимыми, - они могут тем временем стать зависимыми от корня или других оригиналов.

Допустим, например, что а - это атрибут рассматриваемого класса и что полный текст подпрограммы имеет вид:

 

some_routine is

local

rb1, rb2: BOOK3

eb: expanded BOOK3

do

create rb1;create rb2

a := rb1

end

 

На следующем рисунке показаны объекты, создаваемые вызовом some_routine , и ссылки с присоединенными объектами.

Рис. 9.9. Объекты, присоединенные к локальным сущностям

Когда вызов some_routine завершается, объект О, представляющий цель вызова, все еще доступен (иначе не было бы этого вызова). Поле а этого объекта О в результате вызова присоединено к объекту B1 класса BOOK3 , созданного первой инструкцией создания нашей подпрограммы. Поэтому объект B1 остается достижимым по завершении вызова. Напротив, объекты B2 и EB, которые были присоединены к rb2 и eb во время вызова, теперь становятся недостижимыми: в соответствии с текстом процедуры невозможно, чтобы какой-либо другой объект "запомнил" В2 или ЕВ.