Crio uma classe de país que contém várias cidades?
Certo.
As cidades contêm muita classe de construção, a maioria contém classes de pessoas?
Certo.
Eu faço uma classe de localização de caminhos que o jogador pode acessar para se locomover?
Certo.
Tudo o que você sugeriu acima parece razoável. Pode não ser o melhor caminho para você a longo prazo, mas tudo bem. Obviamente, faz sentido para você saber, uma vez que foi o modelo organizacional que lhe veio pela primeira vez. É importante que você pegue isso e inicie uma implementação a partir dele. Isso o ajudará a começar, superando essa "paralisia de design" inicial que muitas vezes aflige os desenvolvedores no início de uma tarefa e (se houver algum defeito), ensinando uma ou duas coisas sobre os prós e os contras dessa abordagem específica ao design.
Você naturalmente pegou os conceitos em sua cabeça e os agrupou em código de acordo com algumas regras simples:
- Esse conceito difere significativamente no comportamento ou nos dados de outros objetos que eu já tenho? (Países e pessoas compartilham muito pouco, se houver, dados ou comportamentos significativos, portanto devem ser representados por tipos distintos no jogo).
- Será que preciso manipular esse conceito no código de maneira significativa (se o seu jogo lida com pessoas individuais, você pode precisar dessa
Person
classe, mas se o jogo se importar apenas com elas de forma agregada, como nas versões anteriores do SimCity, você talvez não seja necessário esse tipo, nem instâncias desse tipo para criar um mapeamento 1: 1 da população de uma cidade int populationCount
.
- Este conceito requer estado ? Nesse caso, deve ser encapsulado de alguma forma que me permita armazenar esse estado (uma classe) em vez de um monte de funções livres. (Uma implementação de pathfinding não possui um objeto do mundo real análogo, mas exige o acompanhamento de dados, como quais nós no mapa já foi considerado, e isso é melhor realizado através de uma classe do que armazenado em um monte globais ocultos e funções autônomas).
Embora simples, responder a essas perguntas pode beneficiar muito você ao tentar decidir se e como transformar um conceito mental em código-fonte. Você também pode ler os princípios do SOLID do design orientado a objetos .
Observe que a sugestão de um sistema de entidade / componente feita nos comentários também é uma abordagem válida, embora eu a evite aqui, a menos que você redimensione seu projeto para ser menor (simplesmente porque assumir dois novos e grandes desafios em um projeto pode ser muito assustador e pode diluir o benefício educacional que você receberia por se concentrar apenas em um). Em um modelo orientado a componentes, o "tipo" nas perguntas acima se torna mais implícito: não o tipo concreto no código, mas o tipo implícito definido pela coleção de componentes que formam uma entidade. Os mesmos princípios orientadores podem ser aplicados.