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. CategoryDataStructurepossui métodos de delegação em cadeia que enviam a chamada de método pela cadeia, viaSubCategoryDataStructure.CategoryDataStructuretambé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.
handleVisitorclasse?
