Bạn vẽ đường kẻ ở đâu khi di chuyển các hàm hoạt động trên dữ liệu vào lớp chứa dữ liệu đó? Ví dụ, hãy tưởng tượng bạn có một lớp đơn giản lưu trữ một mô tả về thời tiết, với các biến cho nhiệt độ, độ ẩm, tốc độ và hướng gió, và thời gian đo được thực hiện. Bây giờ hãy tưởng tượng bạn có một đối tượng của lớp này và bạn muốn truyền nó cho người khác - một quá trình khác, một máy khác, bất cứ điều gì. Bạn có đặt mã để truyền đối tượng vào chính đối tượng đó không - ví dụ, bằng cách thêm phương thức Send (destination-type) vào lớp dữ liệu đơn giản? Hay bạn giữ loại tính năng này trong các lớp riêng biệt có thể gửi và nhận bất kỳ thứ gì qua phương tiện - cho dù đó là kết nối mạng, tệp i/o, comms liên kết hoặc bất kỳ điều gì tương tự?Đối tượng tự gửi - ý tưởng hay?
Bản năng đường ruột của tôi là giữ cho các lớp dữ liệu của tôi đơn giản và quấn chúng lại khi tôi muốn truyền chúng - trong các lớp nối tiếp và trình bày lớp người gửi và người nhận bằng giao diện đơn giản mà họ hiểu. Cách thay thế có vẻ là đặt tất cả mọi thứ bao gồm bồn rửa nhà bếp vào các lớp dữ liệu đơn giản - mọi chức năng có thể hoạt động trên dữ liệu đó, tuy nhiên gián tiếp. Tóm lại, mã xử lý lỗi mạng dường như không thuộc về tôi trong một lớp dữ liệu đơn giản.
Điều này có vẻ hiển nhiên đối với tôi, nhưng tôi tiếp tục thấy các nhà phát triển đặt phương thức Send() lên lớp học của họ. Họ thậm chí còn tự mình nói với các lớp thông báo về Send(), điều này có vẻ phản đối rất cao đối với tôi; nếu tôi viết một bức thư trên một tờ giấy, tôi không nói cho tờ giấy tự gửi đi. Tôi quấn lá thư trong một phong bì và đưa nó cho người đưa thư, bởi vì anh ta có một chiếc xe tải và một tấm bản đồ. Mọi người nghĩ sao?
Bạn có thể quan tâm đến một câu hỏi liên quan: [Có phải là quy ước tốt cho một lớp để tự thực hiện các chức năng không?] (Http://stackoverflow.com/q/3105692/240733) – stakx
Nhờ tất cả những người đã trả lời - điều này là câu hỏi đầu tiên của tôi về SO, và đó là một trải nghiệm rất tích cực. – bythescruff