| Для простоты в этом разделе будем предполагать, что проблема сводится к чтению и записи файлов. Для этих операций будем использовать термины "возвратить" (retrieval) и "сохранить" (storage), адекватные терминам ввод и вывод (input, output). Изучаемые механизмы должны быть применимыми при использовании других средств коммуникации, например при посылке и получении объектов по сети. |
Для экземпляров таких классов, как
Но такие механизмы не могут нас полностью устраивать, поскольку они не управляют главным элементом объектной структуры - ссылками. Так как ссылки могут быть представлены адресами памяти или чем-то подобным, то и для них можно найти подходящее внешнее представление. Это не самая трудная часть проблемы. Сложнее обстоит дело с передачей смысла самих ссылок. Ссылки присоединены к объектам и бесполезны в отсутствие этих объектов. Так что, как только мы начинаем иметь дело с нетривиальными объектами - объектами, содержащими ссылки, нас перестают устраивать старые механизмы сохранения и возвращения, работающие только со значениями. Механизмы должны вместе с объектом обрабатывать и всех его связников (dependents) в соответствии со следующим определением:
Определение: связники, прямые связники
Прямыми связниками объекта являются объекты, присоединенные к его ссылочным полям, если таковые имеются.
Связниками объекта являются сам объект и (рекурсивно) связники его прямых связников.
Для структуры объектов, показанной на рис.8.17, было бы бессмысленно сохранить в файле или передать по сети только объект
Рис. 8.17. Три взаимно зависимых объекта
В этом примере любой из трех объектов рассматривает оставшиеся два как своих связников. В примере, показанном на рис.8.18, объект
Рис. 8.18. Объекты «Book» и «Writer»
Понятие связников неявно присутствует в представлении
Принцип Замыкания Сохраняемости (Persistence Closure principle)
Всякий раз, когда механизм сохранения сохраняет объект, он должен сохранять и связников этого объекта. Всякий раз, когда механизм возвращения возвращает объект, он должен возвращать и связников этого объекта, если они еще не были возвращены.
Базисным механизмом, реализующим эти цели, является библиотечный класс
store (f: IO_MEDIUM)
retrieved (f: IO_MEDIUM): STORABLE
Вызов
Класс