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.
architecture
design-patterns
Sylpheed
fonte
fonte
Respostas:
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.
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.
fonte
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.
fonte
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.
fonte
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
fonte