Является ли операция глубокого копирования рекурсивно копировать переменные, которые ей не принадлежат? - PullRequest
5 голосов
/ 28 июля 2010

Учитывая объект, который имеет переменную, которой он не принадлежит;то есть переменная состоит из агрегат вместо состав .Будет ли операция глубокого копирования копировать переменную или только ссылку на нее?

Ответы [ 2 ]

4 голосов
/ 26 августа 2010

Мне нравится различие, которое вы проводите здесь между ролью композиции и агрегации в контексте глубокой копии.

Я собираюсь пойти против другого ответа и сказать: нет, объект не должен глубоко копировать другой объект, который ему не принадлежит.

Можно ожидать, что глубокая копия объекта будет (по крайней мере, изначально) идентична оригиналу. Если глубокая копия была сделана из ссылки, которой не владел оригинал, то это оставляет открытым вопрос о том, кому принадлежит новая копия. Если клон владеет им, он не будет идентичен исходному объекту. Это был бы объект, подобный оригиналу, за исключением того, что он владеет ссылкой на один из его агрегированных элементов. Это наверняка приведет к хаосу. Если клон не владеет им, то кто?

Эта проблема владения особенно важна для языков без сборщика мусора, но она также создает проблемы даже с сборщиком мусора. Например, если клон сделан для того, чтобы разрешить незафиксированные изменения объекта, допустимы ли изменения для этого другого объекта, на который он ссылается? Если изменения не допускаются, то нет причин для их глубокого копирования. Если изменения разрешены, то как эти изменения должны быть зафиксированы, так как изменяемый объект не управляет этим ссылочным объектом? Конечно, механизм для этого можно придумать, но это может означать, что клонированный объект выходит за рамки своих обязанностей, и программа станет кошмаром обслуживания.

Операция глубокого копирования, включающая неизвестные объекты, также приводит к проблемам с бесконечными (или, по крайней мере, чрезмерными) операциями копирования. Предположим, что объект является частью коллекции, и далее предположим, что объект требует ссылки на коллекцию. Наивная операция глубокого копирования этого объекта создаст новую копию коллекции и каждого ее члена. Даже если предположить, что мы избегаем проблемы бесконечной рекурсии и сохраняем все ссылки согласованными между этим новым набором объектов, это все еще является чрезмерным для большинства целей, и для тех случаев, когда желательна новая коллекция, не будет ли это более разумным для этого глубоко скопировать саму коллекцию, а не одного из ее членов?

Я думаю, что глубокая копия, которая включает только принадлежащие объекты, как вы предлагаете, является единственным разумным подходом для большинства целей.

1 голос
/ 28 июля 2010

Глубокое копирование в противоположном направлении на мелкое должно рекурсивно копировать весь объект на землю и делать совершенно новую копию объекта и всех содержащихся в нем объектов.

Так что да, он должен копировать переменные, а не только ссылки ..

...