Глубокое клонирование и сравнение
Глубокое клонирование и сравнение
Формы копирования и сравнения, реализуемые подпрограммами clone, equal и copy , называются поверхностными, поскольку они работают с объектами только на первом уровне, никогда не пытаясь следовать вглубь по ссылкам. Возникает необходимость для глубоких вариантов этих операций, рекурсивно дублирующих полную структуру.
Для понимания разницы рассмотрим пример, показанный на рис.8.16. Предположим, что мы начинаем в начальном состоянии A, где сущностьaприсоединена к объекту O1.
Рис. 8.16. Различные формы присваивания и клонирования
Рассмотрим простое присваивание ссылки:
b := a
В состоянии B, показанном на рисунке, цель b в результате присваивания присоединена к объекту O1, к которому присоединен источник a. Никаких новых объектов не создается.
Далее рассмотрим операцию клонирования:
c := clone (a)
Эта инструкция, как показывает раздел C нашего рисунка, создает новый объект O4, с полями, идентичными полям объекта O1. Будут скопированы два ссылочных поля, и значения ссылок будут указывать на те же объекты O1 и O3, как и поля оригинального объекта O1. Но, заметьте, не происходит дублирования самого объекта O3, и никакого другого объекта помимо дублирования O1. По этой причине базисная операция clone называется поверхностным клонированием, - она останавливается на первом уровне объектной структуры.
В некоторых ситуациях вы, возможно, захотите пойти дальше и дублировать структуру рекурсивно без введения разделяемых ссылок. Функция глубокого клонирования deep_clone позволяет достичь цели. Процесс создания deep_clone (y) рекурсивно следует за всеми ссылочными полями, содержащимися в объекте, дублируя полную структуру. (Если y это void, то и результат будет также void.) Эта функция будет, конечно же, правильно обрабатывать циклические ссылочные структуры.
Нижняя часть на рисунке - раздел D - иллюстрирует выполнение этой операции:
d := deep_clone (a)
В этом случае не появляются новые разделяемые ссылки. Все объекты, прямо или косвенно доступные объекту O1, будут дублированы, создавая новые объекты O5, O6 и O7. Нет никаких связей между старыми объектами (O1, O2 и O3) и новыми. Объект O5, дублирующий O1, имеет собственные ссылки на себя.
Так же, как необходимы операции глубокого и поверхностного клонирования, необходимо иметь глубокий вариант эквивалентности. Функция deep_equal сравнивает две объектные структуры, определяя их структурную идентичность. В примере, показанном на рисунке, deep_equal выполнимо для любой пары из a, b и d. В то же время equal (a, c) истинно, поскольку поля объектов O1 и O4 идентичны, equal (a, d) - ложно. Фактически equal не выполнимо ни для одной пары из d и любого элемента оставшейся тройки. В целом имеют место следующие свойства:
[x]. В результате присваивания x := clone (y) или вызова x.copy (y), выражение equal (x, y) имеет значение true (в случае присваивания это свойство имеет место независимо от того, имеет ли y значение void).
[x]. В результате присваивания x := deep_clone (y), выражение deep_equal (x, y) имеет значение true.
Эти свойства будут отражены в постусловиях соответствующих подпрограмм.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Клонирование виртуальной машины
Клонирование виртуальной машины После того как вам удалось сформировать удобную и подходящую для решаемых задач конфигурацию ВМ, вы можете ее «размножить».Начиная с версии VMware Workstation 5, появилась возможность в буквальном смысле клонировать виртуальные машины, получая
Клонирование виртуальной машины
Клонирование виртуальной машины После того как вы сформируете удобную и подходящую для решаемых задач конфигурацию ВМ, можете ее «размножить», используя операцию клонирования ВМ.Чтобы клонировать ВМ, выполните следующие действия.1. Выключите клонируемую ВМ и в
Клонирование процесса
Клонирование процесса Вызов fork() создает клон (полную копию) вызывающего процесса в точке вызова. Вызов fork() является одной из самых базовых конструкций всего UNIX-программирования. Его толкованию посвящено столько страниц в литературе, сколько не уделено никакому другому
7.6. Клонирование и восстановление системы
7.6. Клонирование и восстановление системы Клонирование — это создание точной (побитной) копии исходного носителя. Носителем в нашем случае будет корневая файловая система Linux. Клонированная копия называется образом.Если вам нужно установить дистрибутив на несколько
4.2 Сравнение SAN и NAS
4.2 Сравнение SAN и NAS В главе 3 рассматривается технология NAS: Прежде чем знакомиться с архитектурой сетей хранения данных на базе Fibre Channel, следует провести сравнение принципов создания хранилищ. В табл. 4.1 описываются различия и общие черты этих технологий.Таблица 4.1.
Часть V Более глубокое знакомство
Часть V Более глубокое знакомство Глава 30 Автозапуск приложений Собственно, я закончил описание основ работы в Ubuntu. Конечно, я старался выбрать только самые востребованные темы, оставив специфические знания за пределами своего повествования. Надеюсь, вы смогли
Сравнение индексов
Сравнение индексов Изучая поисковые индексы «Яндекс» и Google с помощью операторов inurl: и site, мы можем найти разницу в количестве проиндексированных страниц по сайту в целом и по каждому кластеру в частности. Это самая простая и эффективная проверка сайта на ошибки,
Сравнение с помощью Like
Сравнение с помощью Like Как правило, с помощью Like строка сравнивается не с конкретным набором символов, а с заданным образцом, в котором используются замещающие символы, когда нужно убедиться, что строка попадает (или не попадает) в некоторый класс строк. У меня нет
Клонирование
Клонирование Набор инструментов, позволяющих выполнять разнообразного вида копирование, лучше рассматривать не на примере белого листа, а какого-либо изображения. Откройте любой рисунок и возьмите инструмент Clone Stamp Tool (Штамп клонирования) (рис. 3.25). Он позволяет нам
8.1.4. Сравнение массивов
8.1.4. Сравнение массивов При сравнении массивов возможны неожиданности — будьте осторожны!Для сравнения массивов служит метод экземпляра <=>. Он работает так же, как в других контекстах, то есть возвращает -1 (меньше), 0 (равно) или 1 (больше). Методы == и != опираются на
10.2.3. Ограниченное «глубокое копирование» в ходе маршалинга
10.2.3. Ограниченное «глубокое копирование» в ходе маршалинга В Ruby нет операции «глубокого копирования». Методы dup и clone не всегда работают, как ожидается. Объект может содержать ссылки на вложенные объекты, а это превращает операцию копирования в игру «собери палочки».Ниже
Клонирование и сравнение объектов
Клонирование и сравнение объектов Ссылочное присваивание приводит к тому, что две или несколько ссылок присоединяются к одному объекту. Иногда необходима другая форма присваивания, в результате которой мы хотим получить не копию ссылки, а копию объекта. Эта цель
Глубокое хранилище: первый взгляд на сохраняемость
Глубокое хранилище: первый взгляд на сохраняемость Изучение глубокого копирования и эквивалентности приводит к механизму, обеспечивающему серьезные практические преимущества ОО-метода, естественно, при условии его доступности в среде разработки.До сих пор обсуждение
Клонирование по сетке ("Copy to Grid")
Клонирование по сетке ("Copy to Grid") Клонирование по сетке — самый простой из эффектов, который мы можем применить к выделенному фрагменту изображения. Данный эффект даже не анимирован.Чтобы применить этот эффект к выделенному фрагменту изображения, нужно выбрать пункт Copy to
Профессиональное клонирование, криптозащита, амазиге и тамашек Сергей Голубицкий
Профессиональное клонирование, криптозащита, амазиге и тамашек Сергей Голубицкий Опубликовано 22 февраля 2013 Продолжаем прясть нескончаемую нить нашего софтверно-железного бытия. Чуть позже сегодня — в Битом Пикселе (читатели, надеюсь, уже