Saya punya banyak modul. Saya dapat memecah modul-modul ini menjadi berbagai kategori yang lengkap dan tidak tumpang tindih. Misalnya, tiga kategori, dengan id yang dapat dinyatakan sebagai Animal
, Vegetable
, dan Mineral
. Saya selanjutnya memecah kategori ini ke dalam subkategori, yang lagi berbeda, lengkap dan tidak tumpang tindih. Misalnya, id yang dapat dinyatakan sebagai Mammal
, Reptile
, Legume
, Root
, Rock
, Gem
. Akhirnya, di bawah kategori ini, ada modul sendiri, misalnya Cat
, Dog
, Iguana
, Bean
, Quartz
, Emerald
, dll
Berikut ini adalah kasus penggunaan umum saya:
- Saya perlu memanggil berbagai metode pada semua modul.
- Saya perlu mendapatkan snapshot datar dari keadaan saat ini dari semua data di semua modul.
- Saya perlu memanggil berbagai metode pada semua modul dalam kategori tertentu (tetapi tidak subkategori).
- Saya perlu memanggil berbagai metode pada modul khusus tertentu berdasarkan ID yang diketahui.
- Ini bisa berupa "lakukan sesuatu" atau "beri tahu saya beberapa data tentang diri Anda"
- Saya perlu menyimpan data agregat tentang semua modul dalam kategori tertentu (tetapi tidak subkategori).
Bagaimana saya harus menyimpan data ini?
Beberapa fakta relevan lainnya:
- Kategori dibuat dalam runtime
- Dengan demikian, modul tingkat bawah memang berbagi antarmuka yang sama.
- Begitu mereka diatur, mereka tidak berubah dalam menjalankan tertentu - mereka didasarkan pada data dalam file konfigurasi.
Inilah yang saat ini saya lakukan:
- Saya memiliki kelas yang berisi a
Map<Category, CategoryDataStructure>
. Kelas ini juga mempertahankanCollection<Module>
tampilan data yang terpisah untuk digunakan dengan persyaratan # 2. CategoryDataStructure
telah merantai metode delegasi yang mengirim metode panggilan ke rantai, viaSubCategoryDataStructure
.CategoryDataStructure
juga menyimpan data agregat yang digunakan dalam persyaratan # 5.
Ini bekerja, tapi jujur cukup sulit. Semuanya adalah stateful / bisa berubah dan sulit untuk diubah. Jika saya ingin menambahkan perilaku baru, saya harus menambahkannya di banyak tempat. Saat ini struktur data itu sendiri memiliki banyak logika bisnis juga; metode delegasi. Juga struktur data induk harus melakukan banyak logika bisnis untuk membuat modul tertentu dan struktur data induknya jika perlu dan struktur data induknya jika diperlukan.
Saya mencari cara entah bagaimana memecah logika manajemen data menjauh dari struktur data itu sendiri, tetapi karena bersarang itu rumit. Berikut adalah beberapa opsi lain yang telah saya pertimbangkan:
- Buat yang sederhana
Map<Category, Map<Subcategory, Module>>
, dan letakkan semua kode untuk mempertahankan statusnya di kelas yang berbeda. Perhatian saya untuk melakukan ini adalah persyaratan # 1 dan # 2, akan sulit untuk menjaga pandangan konsisten karena sekarang saya akan memiliki dua struktur data yang berbeda yang mewakili data yang sama. - Lakukan segala sesuatu dalam struktur data datar, dan loop melalui seluruh struktur ketika saya sedang mencari kategori atau sub kategori tertentu.
handleVisitor
kelas?