Eu tenho um monte de módulos. Eu posso dividir esses módulos em diferentes categorias que estão completas e não se sobrepõem. Por exemplo, três categorias, com ids que podem ser expressos como Animal
, Vegetable
, e Mineral
. Além disso, divido essas categorias em subcategorias, que novamente são distintas, completas e não se sobrepõem. Por exemplo, identificações que podem ser expressos como Mammal
, Reptile
, Legume
, Root
, Rock
, Gem
. Finalmente, debaixo destas categorias, há os próprios módulos, por exemplo Cat
, Dog
, Iguana
, Bean
, Quartz
, Emerald
, etc.
Aqui estão meus casos de uso comuns:
- Eu preciso chamar vários métodos em todos os módulos.
- Preciso obter uma captura instantânea do estado atual de todos os dados em todos os módulos.
- Eu preciso chamar vários métodos em todos os módulos em uma categoria específica (mas não na subcategoria).
- Eu preciso chamar vários métodos em um módulo específico específico com base em seu ID conhecido.
- Pode ser "faça alguma coisa" ou "me conte alguns dados sobre você"
- Preciso armazenar dados agregados sobre todos os módulos em uma categoria específica (mas não na subcategoria).
Como devo armazenar esses dados?
Alguns outros fatos relevantes:
- As categorias são estabelecidas em tempo de execução
- Como tal, os módulos de nível inferior compartilham uma interface comum.
- Depois de configurados, eles não mudam nessa execução específica - eles são baseados em dados nos arquivos de configuração.
Aqui está o que eu faço atualmente:
- Eu tenho uma classe que contém a
Map<Category, CategoryDataStructure>
. Essa classe também mantém umaCollection<Module>
visão separada dos dados para uso com o requisito nº 2. CategoryDataStructure
possui métodos de delegação em cadeia que enviam a chamada de método pela cadeia, viaSubCategoryDataStructure
.CategoryDataStructure
também armazena os dados agregados usados no requisito nº 5.
Funciona, mas é honestamente bastante pesado. A coisa toda é estável / mutável e difícil de mudar. Se eu quiser adicionar um novo comportamento, tenho que adicioná-lo em muitos lugares. Atualmente, as próprias estruturas de dados também possuem muita lógica de negócios; os métodos de delegação. Além disso, a estrutura de dados pai precisa criar muita lógica de negócios para criar um módulo específico, e é a estrutura de dados pai, se necessário, e a estrutura de dados do pai, se necessário.
Estou procurando, de alguma forma, separar a lógica de gerenciamento de dados da própria estrutura de dados, mas, devido ao aninhamento, é complicado. Aqui estão algumas outras opções que estive considerando:
- Crie um simples
Map<Category, Map<Subcategory, Module>>
e coloque todo o código para manter seu estado em uma classe diferente. Minha preocupação em fazer isso é os requisitos 1 e 2, será difícil manter a visualização consistente, pois agora terei duas estruturas de dados diferentes que representam os mesmos dados. - Faça tudo em uma estrutura de dados plana e percorra toda a estrutura quando estiver procurando por uma categoria ou subcategoria específica.
handleVisitor
classe?