O Design Orientado a Domínio é bom para jogos?

10

Acabei de ler sobre os modelos de domínio e isso me esclareceu desde que desenvolvi um jogo que possui uma classe que contém apenas dados (poucos comportamentos / métodos). Designei o trabalho de lidar com essas classes para os gerentes ... e agora meu gerente parece um objeto de Deus. Meu objeto de jogo que deveria estar lidando com a lógica é apenas um modelo de domínio anêmico.

Meu padrão de design atual é em Singleton e quero fazer uma recodificação para divulgar esse material. Eu nunca vi um DDD em jogos (a partir de agora), mas essa é uma boa abordagem? Sou apenas um programador iniciante (inclinado a não gostar de jogos), por isso quero aprender mais sobre boa arquitetura antes que o jogo fique muito inchado para redesenhar.

Sylpheed
fonte
2
Posso dizer que um design popular para jogos é uma arquitetura de componentes. Um novo design que está se destacando nos mecanismos de jogos é o design orientado a dados (apenas significa que como os dados são colocados na memória é a maior preocupação de design). Mas não posso falar com o Domain Driven Design em videogames. Portanto, apenas um comentário.
James
Jogos não são aplicativos de negócios. A arquitetura de som em um aplicativo de negócios (DDD / CQRS) definitivamente não é boa em um jogo e vice-versa. Por que não pesquisar o modelo decorador ou modelo de componente? Eles são "bons" para jogos e aliviariam seu problema de singleton - mesmo dizendo que singletons geralmente são bons em jogos; especialmente se você estiver desenvolvendo indie. Concentre-se em terminar alguma coisa, senão você vai pousar como eu com uma ótima arquitetura, mas nenhum jogo.
Jonathan Dickinson
Obrigado pela sugestão. Vou ler sobre o design de componentes. Vou terminar o jogo em que estou trabalhando, mesmo que o design não seja tão bom. Eu tenho um prazo para novembro deste ano lol. Eu removi o conceito de Singleton e estou injetando módulos nos objetos que precisam dele. Acho que isso será suficiente por enquanto, mas preciso aprender mais.
Sylpheed

Respostas:

12

Eu nunca tinha ouvido falar em design orientado a domínio antes de sua postagem. Uma rápida olhada em algumas referências - aqui e aqui - parece sugerir que é apenas um nome sofisticado para o método tradicional de programação orientada a objetos dos anos 90, ensinado na universidade, onde você tenta escrever aulas para cada substantivo que aparece na situação em que você está tentando modelar com o software, para que a estrutura do software pareça seguir a estrutura do conceito do mundo real.

Como tal, minha resposta é que não é "bom". Geralmente é um ponto de partida razoável, mas mostra-se inadequado à medida que avança. Você raramente tem um único domínio, mas vários domínios diferentes em um software - por exemplo, você pode ter o domínio do jogo (o mundo, os personagens, os itens), o domínio do renderizador (os shaders, as malhas, os materiais), o domínio da entrada (o sistema de arquivos, a rede, o teclado e o mouse) e os problemas que ocorrem quando os domínios se sobrepõem e se influenciam. Freqüentemente, ao unir dois domínios, você percebe que existe realmente uma dependência que requer uma mudança, o que significa que uma de suas representações se torna mais um fardo do que uma ajuda.

Um exemplo vago pode ser uma biblioteca de matemática em um console e seus personagens no jogo. Sua biblioteca de matemática gostaria de ter uma grande lista de dados e, em seguida, 1 instrução para executar nessa lista, para executar com eficiência. Seus personagens no jogo terão cada um seu próprio conjunto de dados de vértices para renderização e animação etc. Agora, como você obtém uma longa lista de todos os dados de vértices de cada um de seus personagens para poder lidar com isso de uma só vez? Você pode executar uma operação de cópia lenta ou refatorar seus caracteres para que os dados deles sejam mais suscetíveis de serem processados ​​pela biblioteca de matemática - mas um de seus domínios está sendo quebrado para favorecer outro.

Pessoalmente, sou muito cauteloso com qualquer etiqueta que se assemelhe a "Whatever-Driven-Design". O software é muito amplo e complexo demais para haver uma abordagem única para a criação. Em vez disso, ao tentar escrever o melhor software possível, tento recorrer aos princípios do SOLID . Isso fornece uma boa idéia de quão bom é o seu código, sem prometer uma panacéia de um método que você pode seguir e chegar magicamente a um bom código. Infelizmente, sem essa metodologia anexada, é preciso muita experiência antes de você aprender a se adequar a essas diretrizes, e é provavelmente por isso que tantas pessoas gostam das metodologias.

Em relação ao seu problema de ter classes anêmicas e objetos gerenciadores, isso geralmente é algo abordado nas lições introdutórias de orientação a objetos e realmente não exige que você adote uma metodologia especial para 'corrigi-lo'. (Você pode pegar um livro sobre programação orientada a objetos se estiver apenas começando.) Uma classe é um acoplamento de estado e comportamento, em que o comportamento modifica esse estado, e isso é chamado de encapsulamento. Geralmente, você tenta encapsular o máximo possível, o que significa que o estado deve ser manipulado pelo próprio objeto (e somente por esse objeto). Somente para o comportamento que não pode ser modelado dentro da classe, você delegaria para uma classe externa, como um gerente, e é por isso que a existência de classes gerenciador é frequentemente considerada um sinal de código orientado a objeto mal escrito.

Meu padrão de design atual é em Singleton e quero fazer uma recodificação para divulgar esse material.

Não sei o que você quer dizer com essa frase. Um padrão de design é uma maneira bem conhecida de escrever uma pequena parte do seu programa. Você não teria um padrão de design 'atual', nem moldaria o restante do seu programa. Para iniciantes, esses padrões são úteis para colocar você no caminho certo, enquanto para especialistas eles são mais uma maneira de se comunicar sobre situações comuns de código. Uma coisa é importante: os singletons são quase sempre uma péssima idéia, e você deve evitá-los sempre que possível. Você pode encontrar muitas opiniões sobre singletons neste site ou mais no Stack Overflow, mas aqui está uma pergunta prática com respostas que ajudam a evitar a necessidade deles.

Kylotan
fonte
Ok, deixe-me mudar um pouco a questão. Existe uma diferença entre modelos de domínio e design orientado a domínio? Minha idéia sobre os modelos de domínio é que uma classe deve ser capaz de lidar com ela mesma sem depender de um controlador / gerente, tanto quanto possível. Meu design atual derrota esse propósito. Eu posso estar entendendo mal alguma coisa. Assim, em um jogo de RPG, minha classe jogador tem seu próprio domínio e é composto por diferentes domínios como habilidades, itens, etc.
Sylpheed
Sim, uma classe deve ser capaz de lidar com ela mesma sem depender de um controlador / gerente o máximo possível, mas isso não tem nada a ver com modelos de domínio e é apenas uma abordagem padrão da programação orientada a objetos. Não está claro o que você pode estar entendendo mal, porque não sei por que você tem essas classes de gerente.
Kylotan #
Não vejo como fazer meu módulo funcionar sem um gerente ou uma classe que consulte meu objeto. Por exemplo, eu tenho um módulo para missões. Para acessar a missão correta, tenho que consultar o gerente. Então, como faço para revisar isso sem um gerente?
21411 Sylpheed
Qual é a busca 'certa'? Como o gerente sabe o que é certo? Meu palpite é que a lógica que toma essas decisões se baseia em outros objetos para tomá-las, e esses outros objetos são melhores candidatos a essa funcionalidade.
Kylotan
Bem, agora meu gerente está agindo como um repositório após alguma limpeza. Por exemplo, eu tenho 10 missões ao vivo. Estou acessando essas missões por meio do ID para recuperar mais facilmente. Então, meu jogador tem um componente para missões (o gerente) e eu acessarei a missão a partir daí. Ainda é o jogador que controla qual missão ele pode ter. Isso é uma má ideia?
21911 Sylpheed
6

Paradigma

No momento em que essa resposta foi escrita, as outras respostas postadas aqui estão todas erradas.

Em vez de perguntar se o Design Orientado a Domínio é bom para jogos. Você deve perguntar se a "Modelagem de Domínio" é boa para jogos.

A modelagem de domínio é boa para jogos?

A resposta é: às vezes é absolutamente fabuloso. No entanto, se você estiver criando um jogo em tempo real, como um jogo de plataformas ou FPS ou o que for (MUITOS MUITOS tipos de jogos), então não. Não é necessariamente adequado para esses sistemas. No entanto, pode haver sistemas dentro daqueles jogos nos quais a implementação do padrão de modelo de domínio é eficaz.

Como outros mencionaram aqui, as estruturas de entidades componentes tendem a ser muito populares e por boas razões. No entanto, na cultura de desenvolvimento de jogos, parece haver uma falta distinta de arquiteturas em camadas. Novamente, isso é por uma boa razão, pois a maioria dos jogos que as pessoas desenvolvem apenas modifica o estado das entidades e deixa as conseqüências emergentes serem o jogo.

TODO O SOFTWARE NÃO É O SOFTWARE QUE VOCÊ ESTÁ ESCREVENDO. Alguns são bem diferentes dos outros.

Alguns exemplos de domínios nos quais a modelagem de domínio funciona bem são jogos de cartas, jogos de tabuleiro e outros tipos de sistemas orientados a eventos.

Jogos que são executados na taxa de quadros X com movimento etc determinados por deltas de tempo como conceitos principais de domínio provavelmente não são uma boa opção. Nesse caso, nosso "domínio" geralmente é tão simples que não há necessidade de modelagem de domínio. Detecção de colisão, criação de novas entidades, influência de forças nas entidades existentes, etc. tendem a cobrir a maior parte do jogo.

No entanto, à medida que as coisas se tornam complexas, você começa a ver os desenvolvedores implementando modelos de domínio em suas entidades para lidar com certos tipos de comportamento e cálculo.

Padrão de modelo de domínio em arquiteturas de jogos

Seu mecanismo de jogo (por exemplo, Unity3D) geralmente é orientado a entidades e componentes. Em um jogo de plataforma, você pode ter uma entidade para seu personagem e seu estado é constantemente alterado para atualizar a posição etc.

No entanto, em um jogo mais orientado a eventos, é mais provável que o papel da estrutura componente-entidade exista mais como interface do usuário. Você acaba com uma arquitetura em camadas.

A interface do usuário renderiza o estado do jogo para o usuário. O usuário interage com a interface do usuário, acionando comandos na camada de serviço. A camada de serviço interage com objetos do domínio. Objetos de domínio geraram eventos de domínio. Ouvintes de eventos ouvem os eventos e acionam alterações na interface do usuário.

UI> Camada de Serviço> Modelo de Domínio

Em resumo, termine com o model-view-controller com uma implementação da camada de serviço.

Usando essa arquitetura, você tem um núcleo de jogo completamente testável por unidade (uma raridade na cultura de desenvolvimento de jogos, e mostra) com uma interface orientada a eventos.

Ok, agora, o que é DDD?

O Design Orientado a Domínio é especificamente uma cultura / movimento de ênfase nos padrões analíticos usados ​​para aprender sobre o domínio, para que você realmente construa a coisa certa e, em seguida, padrões de implementação que o capacitem a implementar uma camada de modelo que represente o conceitos no modelo de domínio usando o idioma do seu idioma. O DDD sai de uma comunidade que trabalha com domínios complicados e está sempre procurando maneiras de gerenciar alta complexidade em seus aplicativos, concentrando-se na modelagem de domínios.

O DDD não funciona tão bem se seu objetivo é apenas começar a codificar, brincar com o sistema e descobrir o que você deseja criar mais tarde, etc. Isso pressupõe que exista mais ou menos um domínio. Então, se você não tem idéia de como será o seu jogo ... Então, não vai funcionar.

Shawn McCool
fonte
11
Obrigado pela compreensão. Eu já tinha descoberto isso há 3 ou 4 anos. Eu era ingênuo naquela época (5 anos atrás), pois sempre tento ajustar o "padrão de design" a todos os meus problemas. Aprender esses "padrões" e arquitetura ajudou, pois me deu mais opções. Sempre adoro abstrair partes do meu código "apenas o suficiente" para que seja fácil para designers (muito importantes), testes de unidade e futuras mecânicas. O exagero na arquitetura dificultou o trabalho e aprendi da maneira mais difícil. No momento, eu já aproveitei a arquitetura baseada em componentes para se ajustar ao meu estilo de codificação. Ftw SÓLIDO
Sylpheed 27/05
3

Não, acho que DDD, ou qualquer outra arquitetura de "chavão" é realmente boa para jogos. Com a possível exceção do "sistema de componentes", que parece realmente popular aqui.

Quando ouço perguntas e discussões como essa, sou lembrado deste site. Ponderar várias palavras-chave da arquitetura geralmente não é tão bom quanto projetar e codificar seu próprio aplicativo.

deixa pra lá
fonte
11
+1 para "realmente projetar e codificar seu próprio aplicativo". esses padrões são diretrizes e provocadores para mim - nada mais. Mudar um problema para que ele se encaixe em uma solução é a coisa errada a se fazer.
Jonathan Dickinson
-1

Sim, mas você deve se adaptar.

Ao usar o DDD, você terá modularidade e responsabilidade única de cada domínio. Mas qualquer outra coisa apenas torna as coisas complexas.

Veja minha resposta aqui

b.ben
fonte
Você pode expandir um pouco sua resposta (cubra a parte principal da resposta), porque agora é apenas uma resposta de link (mesmo que aponte para outro site de troca de pilhas).
Vaillancourt