Sử dụng các lớp bạn bè của Cameron trong phát triển trò chơi


9

Thông thường, tốc độ phát triển trò chơi C ++ được đánh giá cao qua việc đóng gói, do đó bạn sẽ thấy rất nhiều thành viên lớp có thể truy cập công khai mà thực sự không nên công khai.

Tôi dường như tìm thấy trong hầu hết các trường hợp chỉ có một vài nhóm rất chọn thực sự cần biết hoạt động bên trong của các lớp khác đến mức sửa đổi hoặc đọc dữ liệu riêng tư của họ.

Tạo getters / setters công khai cho dữ liệu riêng tư này phơi bày những thứ thực sự không nên sửa đổi willy-nilly.

Một thỏa hiệp ở đây sẽ là sử dụng các lớp bạn bè? hoặc có một số nhược điểm đối với các lớp bạn tôi không thấy.

Câu trả lời:


8

Có hai nhược điểm chính đối với các lớp học kết bạn.

  1. Bạn không thể chọn và chọn những gì bạn muốn tiếp xúc với bạn bè của bạn. Đó là tất cả hoặc không có gì. Điều này có thể chứng minh có vấn đề nếu bạn đang cố gắng thực thi bắt buộc sử dụng một số loại setter không quan trọng.
  2. Hai lớp của bạn bây giờ phần nào được ghép nối theo nghĩa mà người bạn biết về người bạn đó.

Điều đó đang được nói, sử dụng các lớp bạn bè chắc chắn có thể cải thiện việc đóng gói, đặc biệt nếu phương án thay thế là getters / setters công khai.

Ngoài ra, câu hỏi liên quan trên SO: /programming/521754/when-to-use-friend- class-in-c


5

Đóng gói là tốt đẹp, nhưng tách các mối quan tâm là tốt hơn.

Một lớp truy cập "một phần riêng tư" của lớp khác có thể chỉ ra rằng mã không được thiết kế tốt ngay từ đầu.

Mỗi khi bạn thấy mình trong "trời ơi, tôi cần phải tạo một lớp bạn bè ở đây", câu hỏi bạn nên tự hỏi mình là "tôi đang làm điều này một cách chính xác, hay có cách nào sạch hơn không?" (còn gọi là "Điều này sẽ cắn vào mông tôi sau này?").

Nếu bạn chắc chắn về "sự thân thiện", hãy đặt nó ở đó mà không do dự.


Tôi hiểu làm thế nào sử dụng một lớp bạn sẽ kết hợp chặt chẽ giữa lớp này với lớp khác. Tôi đã tự hỏi nếu có một mẫu thiết kế đặc biệt làm giảm bớt vấn đề, bởi vì chỉ cần bọc một cái gì đó trong getter / setter có khả năng là một giải pháp tồi tệ hơn.
David Young

1
Ví dụ thú vị là mẫu Factory trong C ++ yêu cầu "bạn bè" vì sử dụng các hàm tạo riêng.
David Young

2

Một tùy chọn khác là sử dụng thành ngữ PIMPL , trong đó một phần của việc thực hiện cấu trúc là một con trỏ đến một loại khác. Hầu hết người dùng của lớp sẽ chỉ bao gồm tệp tiêu đề bình thường, trong đó việc triển khai là một con trỏ mờ. Các lớp cần truy cập vào dữ liệu riêng tư có thể bao gồm tiêu đề xác định loại khác và sử dụng giao diện mà nó cung cấp.

Đây là một mô hình phổ biến cho các lập trình viên C muốn chức năng giống như bạn bè. Theo tôi, nó cũng tập trung chặt chẽ hơn để suy nghĩ về việc phân tách các mối quan tâm (một nguyên tắc thiết kế nói chung tốt dẫn đến việc sử dụng lại mã trực giao) thay vì đóng gói (một kỹ thuật dành riêng cho OO rất hữu ích để thực hiện phân tách các mối quan tâm, nhưng cũng thường bị lạm dụng để quá phức tạp mọi thứ).

Nó có một lợi thế hơn so với bạn bè là nó hoàn toàn không kết bạn với bạn bè. Một số người có thể cho rằng đó là một bất lợi, vì bây giờ bất cứ ai cũng có thể "kết bạn" với lớp của bạn. Tôi nghĩ đó là một nỗi sợ hãi không đáng có, vì bạn vẫn làm cho mối quan hệ rõ ràng (bằng cách bao gồm tiêu đề). Nếu bạn sợ điều đó, bạn sợ khả năng của bạn (hoặc đồng nghiệp) trong việc đưa ra quyết định kiến ​​trúc thông minh. Nhưng nếu sau này bạn không thể đưa ra những quyết định đúng đắn, tại sao friendbây giờ bạn lại tin tưởng chính mình ?

Nó có một bất lợi về chi phí thời gian chạy. Bằng cách lưu trữ dữ liệu trong một con trỏ, bạn có độ kết hợp bộ đệm kém hơn và số lượng phân bổ nhiều hơn, và bạn cũng cần một hàm hủy để dọn sạch nó.


+1 thú vị, chưa từng nghe về khái niệm này đến từ nền Java.
David Young
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.