Работа с утилизированными объектами
Работа с утилизированными объектами
Для реализации fresh и recycle, можно среди других возможных вариантов представить available как стек: fresh будет удалять элемент из стека, а recycle будет помещать элемент в стек. Создадим класс STACK_OF_LINKABLES для этого случая и добавим следующие закрытые компоненты в класс LINKED_LIST (В упражнении У23.1. требуется определить, будет ли корректным появление у функции fresh побочных эффектов.):
available: STACK_OF_LINKABLES
fresh (v: ELEMENT_TYPE): LINKABLE is
- Новый элемент со значением v, для повторного
- использования во вставке
do
if available.empty then
- Создание нового элемента
create Result.make (v)
else
- Повторное использование linkable
Result := available.item; Result.put (v); available.remove
end
end
recycle (dead: LINKABLE) is
-Возвращает dead в список достижимых элементов.
require
dead /= Void
do
available.put (dead)
end
Мы можем объявить класс STACK_OF_LINKABLES следующим образом:
class
STACK_OF_LINKABLES
feature {LINKED_LIST}
item: LINKABLE
- Элемент в вершине стека
empty: BOOLEAN is
- нет элементов в стеке?
do
Result := (item = Void)
end
put (element: LINKABLE) is
- Добавить элемент в вершину стека.
require
element /= Void
do
element.put_right (item); item := element
end
remove is
- Удалить последний добавленный элемент.
require
not empty
do
item := item.right
end
end
Рис. 9.13. STACK_OF_LINKABLES
Представление стека использует все преимущества поля right, присутствующего в каждом элементе LINKABLE, связывая все утилизированные элементы и предоставляя, тем самым, дополнительную память для размещения новых элементов списка LINKED_LIST. Класс LINKABLE должен экспортировать свои компоненты right и put_right в класс STACK_OF_LINKABLES.
Компонент available является атрибутом класса. Это означает, что каждый связный список будет иметь свой собственный стек. Конечно, память можно было бы использовать эффективнее в системе, содержащей несколько списков и единственный стек для всех удаленных элементов. Такая техника однократных функций (once functions), будет представлена позже; применение ее для available означает, что только один экземпляр класса STACK_OF_LINKABLES будет существовать до конца выполнения системы, что означает достижение поставленной цели. ( Упражнение У9.3. и У9.4. Об однократных функциях см. лекцию 18)