2010-07-28 31 views
5

Cho một đối tượng có một biến mà nó không sở hữu; tức là biến được tạo bởi aggregation thay vì composition. Thao tác sao chép sâu sẽ sao chép biến hoặc chỉ liên kết đến biến đó?Hoạt động sao chép sâu đệ quy sao chép các biến phụ mà nó không sở hữu?

+0

Có lẽ đó là đủ câu hỏi sao chép sâu/nông - trừ khi bạn chuẩn bị xác định các điều khoản của mình rõ ràng hơn nhiều. –

+0

@Neil Butterworth: Trên thực tế, đó chính là điều tôi muốn học. Tôi có ấn tượng rằng bản sao sâu và nông được định nghĩa lỏng lẻo. Trong câu trả lời về câu hỏi ban đầu của tôi về [Sao chép hàm tạo so với Clone] (http://stackoverflow.com/questions/3345389/copy-constructor-versus-clone), mọi người đồng ý rằng đó là một sự khác biệt quan trọng, mặc dù tôi nghĩ rằng chỉ có một cách duy nhất để sao chép các đối tượng thường hữu ích. Đó là lý do tại sao tôi bắt đầu một cuộc điều tra nhỏ sau khi những gì thường được hiểu bởi "bản sao sâu" và "bản sao nông". –

Trả lời

4

Tôi thích sự khác biệt mà bạn đang làm ở đây giữa vai trò của thành phần và tập hợp trong bối cảnh của một bản sao sâu.

Tôi sẽ đi ngược lại câu trả lời khác và nói: không, đối tượng không được sao chép sâu đối tượng khác mà nó không sở hữu.

Người ta sẽ mong đợi một bản sao sâu của một đối tượng được (ít nhất là ban đầu) giống với bản gốc. Nếu một bản sao sâu được làm bằng một tài liệu tham khảo mà bản gốc không sở hữu, thì điều này sẽ mở ra câu hỏi về những gì sở hữu bản sao mới. Nếu bản sao sở hữu nó, thì nó sẽ không giống với đối tượng gốc. Nó sẽ là một đối tượng như bản gốc, ngoại trừ nó sở hữu tham chiếu đến một trong những thành viên tổng hợp của nó. Điều này chắc chắn sẽ dẫn đến hỗn loạn. Nếu bản sao không sở hữu nó, thì ai làm?

Vấn đề về quyền sở hữu này đặc biệt quan trọng đối với các ngôn ngữ không được thu gom rác, nhưng nó cũng tạo ra các vấn đề ngay cả với bộ thu gom rác. Ví dụ, nếu bản sao được tạo ra để cho phép các thay đổi không được cam kết đối với một đối tượng, có phải những thay đổi được cho phép trên đối tượng khác mà nó tham chiếu không? Nếu không được phép thay đổi, thì không có lý do gì để sao chép sâu nó. Nếu thay đổi được cho phép, thì những thay đổi đó được cam kết như thế nào, vì đối tượng đang được sửa đổi không kiểm soát đối tượng được tham chiếu này? Chắc chắn, một cơ chế cho điều này có thể được giả tạo, nhưng nó sẽ ngụ ý có nghĩa là đối tượng nhân bản vô tính vượt quá trách nhiệm của nó, và chương trình sẽ là một cơn ác mộng bảo trì.

Thao tác sao chép sâu bao gồm các đối tượng không được công nhận cũng dẫn đến các vấn đề về hoạt động sao chép vô hạn (hoặc ít nhất là quá mức). Giả sử một đối tượng là một phần của một bộ sưu tập, và giả sử thêm đối tượng yêu cầu tham chiếu đến bộ sưu tập. Một hoạt động sao chép sâu ngây thơ trên đối tượng đó sau đó sẽ tạo một bản sao mới của bộ sưu tập và mỗi thành viên của nó. Thậm chí giả định rằng chúng ta tránh vấn đề đệ quy vô hạn, và giữ tất cả các tham chiếu nhất quán trong bộ đối tượng mới này, nó vẫn còn quá mức cho hầu hết các mục đích, và đối với những trường hợp bộ sưu tập mới được mong muốn, để sao chép sâu bản thân bộ sưu tập, chứ không phải là một trong các thành viên của nó, vì mục đích này?

Tôi nghĩ rằng một bản sao sâu chỉ bao gồm các đối tượng sở hữu, như bạn đề xuất, là cách tiếp cận lành mạnh duy nhất cho hầu hết các mục đích.

+0

Cảm ơn bạn đã phản hồi tuyệt vời! Tôi đặc biệt thích ví dụ của bạn về đệ quy vô hạn trong khi tạo ra một bản sao sâu. Đây thực sự là một trường hợp yêu cầu đệ quy sâu để bỏ qua các đối tượng tổng hợp. –

+0

Bạn thích câu trả lời của tôi tại http://stackoverflow.com/a/12187738/363751 cho một câu hỏi tương tự như thế nào? – supercat

1

Sao chép sâu trong hình mờ đến vùng nông nên sao chép toàn bộ đối tượng đệ quy xuống mặt đất và tạo bản sao hoàn toàn mới của đối tượng và tất cả các đối tượng chứa.

Vì vậy, có, nó nên sao chép các biến, không chỉ liên kết ..

Các vấn đề liên quan