Nếu các lớp Resource Resourceagerager được coi là xấu, thì các lựa chọn thay thế là gì?


19

Tôi đang nghe những ý kiến ​​trái ngược nhau như:

  • "Các lớp Trình quản lý chuyên dụng hầu như không bao giờ là công cụ kỹ thuật phù hợp"
  • "Các lớp Trình quản lý chuyên dụng (hiện tại) là cách tốt nhất để tồn tại trong một dự án lớn với hàng ngàn tài nguyên"

Hãy lấy một lớp ResourceManager cổ điển có chức năng sau:

  • Tải tài sản (kết cấu, âm thanh, mô hình 3D, v.v.)
  • Đảm bảo tài sản chỉ được tải một lần bằng cách giữ bộ đệm
  • Tham chiếu đếm tài sản để xác định xem chúng có thể được giải quyết hay không
  • Ẩn nơi tài sản thực tế đến từ (ví dụ: có thể là một tệp cho mỗi tài sản hoặc tất cả tài sản trong một tệp gói hoặc tài sản thậm chí có thể được tải qua mạng)
  • Có thể tải lại tài sản mà không cần khởi động lại chương trình, điều này cực kỳ hữu ích cho các nghệ sĩ làm việc trong trò chơi.

Chúng ta cũng hãy loại bỏ đối số "singletons là xấu" bằng cách giả vờ các đối tượng ResourceManager này không phải là singletons, và thay vào đó được truyền qua thông qua tiêm phụ thuộc .

Sau đó là đối số "sử dụng nhà máy" hoặc "gọi nó là nhà máy". Vấn đề của tôi với điều này là, vâng, nó là một nhà máy, nhưng nó cũng là một bộ đệm và bộ tải lại (vì không có từ nào tốt hơn). Gọi nó là một nhà máy không mô tả đúng, và nếu tôi biến nó thành một nhà máy phù hợp thì bộ nhớ đệm và tải lại được thực hiện ở đâu?

Tôi đồng ý rằng các lớp "Manager" thường là một triệu chứng của kiến ​​trúc xấu, nhưng trong trường hợp cụ thể này, làm thế nào nó có thể được cấu trúc lại mà vẫn giữ được tất cả các chức năng ? Đây có phải là một tình huống trong đó một lớp "Manager" thực sự phù hợp?


3
Có thể gọi nó là một nhà kho thay vì một nhà máy? : P
deceleratedcaviar

Câu trả lời:


9

Tôi nghĩ vấn đề không phải là đây là một thiết kế tồi. Vấn đề là tên "Người quản lý" không phải là bản mô tả, như "Cập nhật" và "Quá trình" và "Diễn viên". Thật vô ích khi ai đó cố gắng hiểu hệ thống này và nó tạo ra sự nhầm lẫn nếu bạn từng có các lớp khác thực hiện một số thao tác trên tài sản.

Tuy nhiên, đặt tên cho mọi thứ theo cách truyền đạt hiệu quả mục đích của chúng thực sự rất khó . Hầu hết các hệ thống quá phức tạp để được làm rõ bằng tên của chúng. Điều tốt nhất bạn có thể làm là cố gắng thu hẹp ý tưởng cụ thể nào làm cho lớp này trở nên gắn kết và những lớp khác cần phải khác biệt rõ ràng và chọn một từ duy nhất phù hợp.

IMHO, tính năng quan trọng nhất của một cái tên hay là nó là duy nhất trong bối cảnh mà mọi người sẽ nhìn thấy nó (cơ sở mã), và rất dễ nhớ. Bài kiểm tra nên là bạn có thể có một cuộc trò chuyện với các đồng đội đã quen thuộc với mã mà không cần phải làm rõ những gì bạn đang đề cập đến. Điều này cũng sẽ giúp nếu bạn cần viết tài liệu tham khảo.

Cuối cùng, hãy xem xét rằng nếu bạn không thể mô tả ý tưởng gắn kết đó, nó có thể không gắn kết lắm. Ví dụ: bạn có thể tách bộ nhớ đệm và tham chiếu đếm trong AssetCache và tiếp tục tải trong AssetLoader. Nhưng điều đó thực sự phụ thuộc vào mức độ phức tạp và đan xen của mã.

Nhưng nếu AssetManager của bạn đủ gắn kết và không có gì khác trong trò chơi của bạn là AssetManagery, thì đó có thể là một cái tên hoàn toàn tốt.


Việc tách AssetLoader / AssetCache không phải là một ý tưởng tồi.
Tom Dalling

4

"Tôi làm điều này ở một nơi, hay tôi làm điều đó nhiều?"

Tải logic thường được tập trung vào một điểm truy cập duy nhất bởi vì nó có xu hướng chỉ được chạy tại các điểm chính trong ứng dụng, nơi chúng tôi đang cố gắng đưa nó ra khỏi ASAP. Điều này thường diễn ra khi khởi động ứng dụng, khởi động cấp trò chơi hoặc khi vị trí thế giới người chơi yêu cầu tải một đoạn mới để giữ trải nghiệm liền mạch. Xem xét việc này được thực hiện như một quy trình hàng loạt (cho dù trong một khối lớn hay nhiều phần nhỏ hơn không thực sự quan trọng), sẽ có ý nghĩa khi có một phương thức hoặc tập hợp các phương thức để gọi, để khởi động quá trình này.

Trên hầu hết các nền tảng, tải không đồng bộ, vì vậy bạn thực sự có ít lựa chọn ngoài việc giữ các luồng mã để tải và logic ứng dụng khác được tách ra, một lý do khác để trừu tượng hóa các chức năng quản lý tài nguyên vào lớp riêng của chúng.

Cuối cùng, một vài điểm cần suy nghĩ:

Tải tài nguyên không được chạy rất thường xuyên so với ví dụ. trò chơi logic, vì vậy nó có đáng để thêm sự phức tạp cho các đối tượng trò chơi cá nhân của bạn để làm điều này? Các đối tượng trò chơi thường được giữ nhẹ nhất có thể và chỉ dành cho những gì cần thiết trong quá trình mô phỏng.

Nên một đối tượng chịu trách nhiệm về nó sáng tạo của riêng và phá hủy? Điều này có thể gây ra đau đầu lớn trong quá trình quản lý thực thể. Nếu bạn mong đợi một đối tượng thực hiện quy trình tạo riêng của nó (bao gồm cả việc phụ thuộc tài nguyên) thì tương tự như vậy, nó sẽ có trách nhiệm tự hủy. Điều này có thể gây ra con trỏ lơ lửng / null, vì vậy thực sự nó phải được quản lý từ bên ngoài. Xem câu trả lời này phác thảo vấn đề đó chi tiết hơn.


PS Ngoài các đối số loại "Singletons là khủng khiếp" thông thường (vốn là giáo điều khủng khiếp), bạn đã bao giờ thấy một cuộc tranh luận tốt chống lại ResourceManager chưa? "Các lớp Trình quản lý chuyên dụng hầu như không bao giờ là công cụ kỹ thuật phù hợp" hoàn toàn không phải là đối số cho trường hợp cụ thể này .

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.