À luz do DRY , parece desejável armazenar uma coleção de objetos de jogos relacionados em apenas um contêiner. No entanto, pode ser necessário subconjuntos desses objetos em vários contextos. Pode ser sensato armazenar esses subconjuntos específicos em recipientes específicos e mais adequados. Isso aumenta o esforço para rastrear objetos entre contêineres, por exemplo, quando objetos são removidos do mundo do jogo.
Quais são as possibilidades de simplificar esse design e quais são os trade-offs típicos?
Ilustrar:
Em um jogo de RPG para vários jogadores, o servidor pode conter uma coleção de personagens do jogo em um mapa adequado para pesquisa por ID.
world
map<id, Character> allCharacters
Um personagem também pode residir em um determinado nível de jogo. Para identificar todos os personagens presentes em um nível, pode parecer adequado introduzir um contêiner para cada nível que contenha os personagens atualmente presentes nele. Dessa forma, você pode executar uma lógica comum para todos os caracteres nesse nível.
world
map<id, Character> allCharacters
[levels]
level1
vector<Character> charactersOnPlayfield
level2
vector<Character> charactersOnPlayfield
...
Indo ainda mais longe, quando um personagem interage com as mensagens do mundo só deve ser roteado para caracteres dentro do alcance. Esse gerenciamento de interesses pode ser alcançado dividindo-se cada nível em uma grade de células, cada uma das quais armazenando os caracteres atualmente em pé nela.
world
map<id, Character> allCharacters
[levels]
level1
vector<Character> charactersOnPlayfield
[cells]
cell1
vector<Character> charactersOnCell
cell2
vector<Character> charactersOnCell
...
level2
vector<Character> charactersOnPlayfield
[cells]
cell1
vector<Character> charactersOnCell
cell2
vector<Character> charactersOnCell
...
...
Os objetos Personagem em diferentes níveis de abstração introduzem a necessidade de pensar cuidadosamente sobre a propriedade do objeto e o tempo de vida.
Observe que os objetos Character armazenados nos contêineres seriam naturalmente referências, não cópias. Além disso, estou assumindo que não há coleta de lixo.