Tôi có một loạt các mô-đun. Tôi có thể chia các mô-đun này thành các danh mục khác nhau hoàn chỉnh và không chồng chéo. Ví dụ, có ba loại, với id có thể được diễn tả như Animal
, Vegetable
, và Mineral
. Tôi tiếp tục chia các danh mục này thành các danh mục con, một lần nữa là khác biệt, đầy đủ và không trùng lặp. Ví dụ, id có thể được diễn tả như Mammal
, Reptile
, Legume
, Root
, Rock
, Gem
. Cuối cùng, bên dưới các loại này, có các module mình, ví dụ như Cat
, Dog
, Iguana
, Bean
, Quartz
, Emerald
,, vv
Dưới đây là các trường hợp sử dụng phổ biến của tôi:
- Tôi cần gọi các phương thức khác nhau trên tất cả các mô-đun.
- Tôi cần phải nhận được phẳng snapshot cho trang thái hiện tại của tất cả các dữ liệu trên tất cả các mô-đun.
- Tôi cần gọi các phương thức khác nhau trên tất cả các mô-đun trong một danh mục cụ thể (nhưng không phải là danh mục con).
- Tôi cần gọi các phương thức khác nhau trên một mô-đun cụ thể dựa trên ID đã biết.
- Đây có thể là "làm một cái gì đó" hoặc "cho tôi biết một số dữ liệu về bản thân"
- Tôi cần lưu trữ dữ liệu tổng hợp về tất cả các mô-đun trong một danh mục cụ thể (nhưng không phải là danh mục con).
Tôi nên lưu trữ dữ liệu này như thế nào?
Một số sự thật có liên quan khác:
- Các thể loại được thiết lập trong thời gian chạy
- Như vậy, các mô-đun cấp dưới cùng chia sẻ một giao diện chung.
- Khi chúng được thiết lập, chúng không thay đổi trong lần chạy cụ thể đó - chúng dựa trên dữ liệu trong các tệp cấu hình.
Đây là những gì tôi hiện đang làm:
- Tôi có một lớp có chứa a
Map<Category, CategoryDataStructure>
. Lớp này cũng duy trìCollection<Module>
chế độ xem riêng biệt của dữ liệu để sử dụng với yêu cầu # 2. CategoryDataStructure
đã xâu chuỗi các phương thức ủy nhiệm gửi phương thức gọi xuống chuỗi, thông quaSubCategoryDataStructure
.CategoryDataStructure
cũng lưu trữ dữ liệu tổng hợp được sử dụng trong yêu cầu # 5.
Nó hoạt động, nhưng nó thực sự khá khó sử dụng. Toàn bộ điều là trạng thái / đột biến và khó thay đổi. Nếu tôi muốn thêm hành vi mới, tôi phải thêm nó ở nhiều nơi. Hiện tại các cấu trúc dữ liệu cũng có rất nhiều logic kinh doanh; Các phương pháp ủy nhiệm. Ngoài ra, cấu trúc dữ liệu cha mẹ phải thực hiện nhiều logic nghiệp vụ để tạo ra một mô-đun cụ thể và đó là cấu trúc dữ liệu mẹ nếu cần và cấu trúc dữ liệu của cha mẹ đó nếu cần.
Tôi đang tìm cách tách logic logic quản lý dữ liệu ra khỏi cấu trúc dữ liệu, nhưng do việc lồng nhau rất phức tạp. Dưới đây là một số tùy chọn khác mà tôi đã xem xét:
- Tạo một đơn giản
Map<Category, Map<Subcategory, Module>>
và đặt tất cả các mã để giữ trạng thái của nó trong một lớp khác. Mối quan tâm của tôi khi thực hiện điều này là các yêu cầu số 1 và số 2, sẽ rất khó để giữ chế độ xem nhất quán vì bây giờ tôi sẽ có hai cấu trúc dữ liệu khác nhau đại diện cho cùng một dữ liệu. - Thực hiện mọi thứ trong một cấu trúc dữ liệu phẳng và lặp qua toàn bộ cấu trúc khi tôi đang tìm kiếm một danh mục cụ thể hoặc danh mục phụ.
handleVisitor
lớp không?