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.
architecture
design-patterns
Sylpheed
fuente
fuente
Respuestas:
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.
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.
fuente
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.
fuente
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.
fuente
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í
fuente