¿Es Domain Driven Design bueno para los juegos?

10

Acabo de leer sobre los modelos de Dominio y me iluminó desde que desarrollé un juego que tiene una clase que solo contiene datos (pocos comportamientos / métodos). Asigné el trabajo de manejar estas clases a los gerentes ... y ahora mi gerente parece un objeto de Dios. Mi objeto de juego que se supone que maneja la lógica es solo un modelo de dominio anémico.

Mi patrón de diseño actual está en Singleton y quiero hacer un poco de recodificación para sacar esto. Nunca he visto un DDD en los juegos (a partir de ahora), pero ¿es este un buen enfoque? Solo soy un programador novato (inclinado al desarrollo del juego), así que quiero aprender más sobre la buena arquitectura antes de que el juego se hinche demasiado para rediseñarlo.

Sylpheed
fuente
2
Puedo decir que un diseño popular para juegos es una arquitectura de componentes. Un nuevo diseño que está jugando un poco en la vanguardia de los motores de juegos es el diseño orientado a datos (solo significa que la forma en que los datos se almacenan en la memoria es la mayor preocupación de diseño). Pero no puedo hablar con Domain Driven Design en videojuegos ... por lo tanto, solo un comentario.
James
Los juegos no son aplicaciones comerciales. La arquitectura de sonido en una aplicación comercial (DDD / CQRS) definitivamente no es sólida en un juego, y viceversa. ¿Por qué no investigar el modelo de decorador o el modelo de componente? Esos son "buenos" para los juegos y aliviarían su problema de singleton, incluso al decir eso, los singletons generalmente están bien en los juegos; especialmente si estás haciendo desarrollo independiente. Concéntrate en terminar algo, de lo contrario aterrizarás como yo con una gran arquitectura, pero sin juego.
Jonathan Dickinson
Gracias por la sugerencia. Leeré sobre diseño de componentes. Terminaré el juego en el que estoy trabajando aunque su diseño no sea tan bueno. Tengo una fecha límite este noviembre lol. He eliminado el concepto de Singleton y estoy inyectando módulos a los objetos que lo necesitan. Supongo que eso será suficiente por ahora, pero necesito aprender más.
Sylpheed

Respuestas:

12

Nunca había oído hablar del diseño impulsado por el dominio antes de tu publicación. Un vistazo rápido a un par de referencias, aquí y aquí , parece sugerir que es solo un nombre elegante para el método tradicional de programación orientada a objetos de los años 90 que me enseñaron en la universidad, donde intentas escribir clases para cada sustantivo que aparece en la situación que intenta modelar con software, de modo que la estructura del software parece seguir la estructura del concepto del mundo real.

Como tal, mi respuesta a esto es que no es "bueno". Por lo general, es un punto de partida razonable, pero resulta ser inadecuado a medida que avanza. Raramente tiene un solo dominio, pero varios dominios diferentes dentro de una sola pieza de software; por ejemplo, puede tener el dominio del juego (el mundo, los personajes, los elementos), el dominio del renderizador (los sombreadores, las mallas, los materiales), el dominio de entrada (el sistema de archivos, la red, el teclado y el mouse) y los problemas que surgen cuando los dominios se superponen e influyen entre sí. A menudo, en el curso de unir 2 dominios, te das cuenta de que en realidad hay una dependencia que requiere un cambio, lo que significa que una de tus representaciones se vuelve más una carga que una ayuda.

Un vago ejemplo podría ser una biblioteca de matemáticas en una consola y tus personajes en el juego. A su biblioteca de matemáticas le gustaría tener una gran lista de datos y luego 1 instrucción para realizar en esa lista, para ejecutar de manera eficiente. Tus personajes en el juego tendrán cada uno su propio conjunto de datos de vértices para renderizar y animar, etc. Ahora, ¿cómo obtienes una larga lista de todos los datos de vértices de cada uno de tus personajes para poder manejarlos de una vez? Podría realizar una operación de copia lenta o, en su lugar, podría refactorizar sus caracteres para que sus datos sean más susceptibles de ser procesados ​​por la biblioteca de matemáticas, pero luego uno de sus dominios se está desmoronando para favorecer a otro.

Personalmente, desconfío de cualquier etiqueta que se parezca a "Diseño impulsado por cualquier cosa". El software es demasiado amplio y complejo para que haya un enfoque único para crearlo. En cambio, cuando intento escribir el mejor software que puedo, trato de recurrir a los principios SÓLIDOS . Estos le dan una buena idea de cuán bueno es su código, sin prometer una panacea de un método que pueda seguir y llegar mágicamente a un buen código. Desafortunadamente, sin una metodología tan adjunta, se necesita mucha experiencia antes de aprender a cumplir con estas pautas, lo que probablemente es la razón por la cual a tanta gente le gustan las metodologías.

Con respecto a su problema de tener clases anémicas y objetos de administrador, esto generalmente es algo que se cubre en las lecciones introductorias de orientación a objetos y realmente no requiere que se adhiera a ninguna metodología especial para 'arreglarlo'. (Es posible que desee obtener un libro sobre programación orientada a objetos si recién está comenzando). Una clase es un acoplamiento de estado y comportamiento, donde el comportamiento modifica ese estado, y esto se denomina encapsulación. En general, intenta encapsular tanto como sea posible, lo que significa que el estado debe ser manipulado por el propio objeto (y solo ese objeto). Solo para el comportamiento que no se puede modelar dentro de la clase, usted delegaría en una clase externa, como un administrador, por lo que la existencia de clases de administrador a menudo se considera un signo de código orientado a objetos mal escrito.

Mi patrón de diseño actual está en Singleton y quiero hacer un poco de recodificación para sacar esto.

No sé a qué te refieres con esa línea. Un patrón de diseño es una forma conocida de escribir una pequeña parte de su programa. No tendría un patrón de diseño 'actual', ni daría forma al resto de su programa. Para los principiantes, estos patrones son útiles para llevarlo por el camino correcto, mientras que para los expertos son más una forma de comunicarse sobre situaciones de código comunes. Sin embargo, una cosa es importante: los singletons son casi siempre una mala idea, y debe evitarlos siempre que sea posible. Puede encontrar muchas opiniones sobre singletons en este sitio y en Stack Overflow, pero aquí hay una pregunta práctica con respuestas que lo ayudan a evitar que las necesite.

Kylotan
fuente
Bien, déjame cambiar un poco la pregunta. ¿Hay alguna diferencia entre los modelos de dominio y el diseño impulsado por dominio? Mi idea sobre los modelos de dominio es que una clase debería ser capaz de manejarse sola sin depender de un controlador / administrador tanto como sea posible. Mi diseño actual derrota este propósito. Puedo estar malentendiendo algo. Así, en un juego de rol, mi clase de jugador tiene su propio dominio y se compone de diferentes dominios como habilidades, objetos, etc.
Sylpheed
Sí, una clase debería ser capaz de manejarse sola sin depender de un controlador / administrador tanto como sea posible, pero eso no tiene nada que ver con los modelos de dominio y es solo un enfoque estándar de programación orientada a objetos. No está claro qué podría estar malentendiendo porque no sé por qué tiene estas clases de gerente.
Kylotan
No veo cómo hacer que mi módulo funcione sin un administrador o una clase que consulta mi objeto. Por ejemplo, tengo un módulo para misiones. Para poder acceder a la búsqueda correcta, tengo que consultar con el administrador. Entonces, ¿cómo puedo superar esto sin un gerente?
Sylpheed
¿Cuál es la búsqueda 'correcta'? ¿Cómo sabe el gerente qué es lo correcto? Supongo que la lógica que toma tales decisiones se basa en otros objetos para tomarlas, y esos otros objetos son mejores candidatos para esta funcionalidad.
Kylotan
Bueno, ahora mi gerente está actuando como un repositorio después de una limpieza. Por ejemplo, tengo 10 misiones en vivo. Estoy accediendo a estas misiones a través de ID para una recuperación más fácil. Entonces mi jugador tiene un componente para misiones (el administrador) y accederé a la misión desde allí. Sigue siendo el jugador el que controla qué misión puede tener. ¿Es una mala idea?
Sylpheed
6

Paradigma

En el momento en que se escribió esta respuesta, las otras respuestas publicadas aquí son todas incorrectas.

En lugar de preguntar si el diseño impulsado por dominio es bueno o no para los juegos. Debes preguntar si el "modelado de dominio" es bueno o no para los juegos.

¿El modelado de dominio es bueno para los juegos?

La respuesta es: a veces es absolutamente fabuloso. Sin embargo, si está creando un juego en tiempo real, como un juego de plataformas o FPS o lo que sea (MUCHOS MUCHOS tipos de juegos), entonces no. No es necesariamente adecuado para esos sistemas. Sin embargo, puede haber sistemas dentro de esos juegos en los que la implementación del patrón del modelo de dominio sea efectiva.

Como otros han mencionado aquí, los marcos de entidades componentes tienden a ser muy populares, y por una buena razón. Sin embargo, en la cultura de desarrollo de juegos parece existir una clara falta de arquitecturas en capas. Nuevamente, esto es por una buena razón, ya que la mayoría de los juegos que las personas van a desarrollar solo mutan el estado de las entidades y dejan que las consecuencias emergentes sean el juego.

TODO EL SOFTWARE NO ES EL SOFTWARE QUE ESCRIBE. Algunos son bastante diferentes de otros.

Algunos ejemplos de dominios en los que el modelado de dominios funciona bien son los juegos de cartas, los juegos de mesa y otros tipos de sistemas basados ​​en eventos.

Los juegos que se ejecutan a una velocidad de fotogramas X con movimiento, etc., determinados por deltas de tiempo como conceptos básicos del dominio, probablemente no encajen bien. En este caso, nuestro "dominio" es a menudo tan simple que no hay necesidad de modelar dominios. La detección de colisiones, el desove de nuevas entidades, la influencia de las fuerzas en las entidades existentes, etc. tienden a cubrir la mayoría de los juegos.

Sin embargo, a medida que las cosas se vuelven complejas, comienza a ver desarrolladores que implementan modelos de dominio dentro de sus entidades para manejar ciertos tipos de comportamiento y cálculo.

Patrón de modelo de dominio en arquitecturas de juegos

Su motor de juego (por ejemplo, Unity3D) a menudo está orientado a entidades de componentes. En un juego de plataformas, puedes tener una entidad para tu personaje y su estado cambia constantemente para actualizar la posición, etc.

Sin embargo, en un juego más orientado a eventos, es más probable que el rol del marco de la entidad componente sea más que solo existir como la interfaz de usuario. Terminas con una arquitectura en capas.

La interfaz de usuario muestra el estado del juego al usuario. El usuario interactúa con la interfaz de usuario, activando comandos en la capa de servicio. La capa de servicio interactúa con los objetos del dominio. Los objetos de dominio generaron eventos de dominio. Los oyentes de eventos escuchan los eventos y desencadenan cambios en la interfaz de usuario.

UI> Capa de servicio> Modelo de dominio

En resumen, termine con model-view-controller con una implementación de capa de servicio.

Usando esta arquitectura, tienes un núcleo de juego completamente comprobable por unidad (una rareza en la cultura de desarrollo de juegos, y se nota) con una interfaz impulsada por eventos.

Ok ahora, ¿qué es DDD?

El diseño impulsado por el dominio específicamente es una cultura / movimiento de énfasis en los patrones analíticos que se utilizan para aprender sobre el dominio, de modo que realmente está construyendo lo correcto, y luego los patrones de implementación que le permiten implementar una capa de modelo que representa el conceptos en el modelo de dominio utilizando el idioma de su idioma. DDD proviene de una comunidad que trabaja con dominios complicados y siempre está buscando formas de administrar la alta complejidad en sus aplicaciones centrándose en el modelado de dominios.

DDD no funciona tan bien si su objetivo es simplemente comenzar a codificar, jugar con el sistema y luego descubrir lo que desea construir más tarde, etc. Supone que existe más o menos un dominio. Entonces, si no tienes idea de cuál será tu juego ... Entonces, no va a funcionar.

Shawn McCool
fuente
1
Gracias por la perspicacia. Lo resolví hace unos 3 o 4 años. Era ingenuo en ese entonces (hace 5 años) ya que siempre trato de adaptar el "patrón de diseño" a todos mis problemas. Aprender estos "patrones" y arquitectura ayudó porque me dio más opciones. Siempre me limito a abstraer partes de mi código "lo suficiente" para que sea fácil para los diseñadores (muy importante), las pruebas unitarias y la mecánica futura. Exagerar la arquitectura dificultó el trabajo y lo aprendí de la manera difícil. En este momento, ya he aprovechado la arquitectura basada en componentes para adaptarme a mi estilo de codificación. SÓLIDO ftw.
Sylpheed
3

No, no creo que DDD, o cualquier otra arquitectura de "palabra de moda" sea realmente buena para los juegos. Con la posible excepción del "sistema de componentes", que parece muy popular aquí.

Cuando escucho preguntas y discusiones como esta, me acuerdo de este sitio. Considerar varias palabras de moda de la arquitectura generalmente te hará menos bien que diseñar y codificar tu propia aplicación.

No importa
fuente
1
+1 para "diseñar y codificar su propia aplicación". esos patrones son pautas y provocadores para mí, nada más. Cambiar un problema para que encaje en una solución es lo incorrecto.
Jonathan Dickinson
-1

Sí, pero deberías adaptarte.

Cuando use DDD obtendrá modularidad y responsabilidad única de cada dominio. Pero cualquier otra cosa solo complica las cosas.

Mira mi respuesta aquí

b.ben
fuente
Es posible que desee expandir un poco su respuesta (cubra la parte principal de la respuesta), porque en este momento es una respuesta de solo enlace (incluso si apunta a otro sitio de intercambio de pila).
Vaillancourt