¿Cómo aplicar el diseño orientado a datos con la programación orientada a objetos? [cerrado]

17

He leído muchos artículos sobre diseño orientado a datos (DOD) y lo entiendo, pero no puedo diseñar un sistema de programación orientada a objetos (OOP) con DOD en mente, creo que mi educación OOP me está bloqueando. ¿Cómo debería pensar mezclar los dos? El objetivo es tener una buena interfaz OOP mientras se usa DOD detrás de escena.

También vi esto, pero no me ayudó mucho: /programming/3872354/how-to-apply-dop-and-keep-a-nice-user-interface

Pombal
fuente
3
Es necesario para publicar algo mucho más específico (y el juego relacionado), esta pregunta es ahora demasiado general.
DeadMG
Tienes razón, pero no he visto esto discutido en otros campos además de la programación de juegos.
Pombal
44
@DeadMG: He nunca se ve el diseño orientado a los datos término usado el desarrollo de juegos exterior, excepto cuando se hace referencia a las prácticas originarias de desarrollo del juego. Si está pensando en un diseño basado en datos, eso no es lo mismo.

Respuestas:

16

Diría que el blog de Noel Llopis es probablemente la mejor instrucción para una combinación de programación orientada a objetos y diseño orientado a datos. Es uno de los creadores del término DOD, es un fuerte programador de C ++ y ha escrito mucho sobre su estilo y cómo aprovecha las características OO de C ++.

Supongo que si tuviera que mencionar los elementos clave para combinarlos, según Noel:

  • Utilice POD y funciones que no sean miembros ni amigos tanto como sea posible. Las funciones que no son miembros ni amigos mejoran la encapsulación y son una parte clave de la orientación de datos porque mantienen los datos, datos.
  • Evite almacenar el estado "temporal" en sus objetos. El estado temporal obstruye sus datos. Si necesita almacenar en caché algo (por ejemplo, para el rendimiento), entonces eso pertenece a una nueva clase, con funciones que no son miembros y que no son amigos que vinculan los dos tipos, no una relación is-a ni has-a.
  • Evite los objetos que pueden estar en el estado A o en el estado B. Prefiera cambiar entre dos objetos, uno de los cuales es A y uno de ellos es B.
  • Evite el polimorfismo, evite funciones virtuales, evite plantillas, evite cualquier cosa que haga que sus datos tengan la apariencia sintáctica de similitud en lugar de similitud real .

El otro gran nombre en la propaganda del Departamento de Defensa en este momento es Mike Acton de Insomniac, pero leyendo lo que ha escrito, diría que no es realmente pro-OO (o anti-OO, siempre y cuando todavía esté orientado a datos).


fuente
Gracias por la respuesta, pero lo que estás diciendo es lo que debo hacer para usar DOD, no cómo podría usar OO con él. He leído el blog de Noel, diatribas de Mike Acton (: D), las publicaciones de los DADOS entre otros y que entienden cómo utilizar DOD, pero no con OO mezclados.
Pombal
2
¿Qué crees que es OO? Llamaría a la mayoría del código OO de Noel, por ejemplo: todavía hay clases e instancias, todavía hay despacho basado en tipos, aún puede haber herencia (la definición de COD de C ++ 0x se cambió para permitir esto). Uno todavía modela problemas que comienzan con datos, en lugar de operaciones.
Por ejemplo, el polimorfismo es una parte importante de la POO, al igual que los estados del objeto. El diseño orientado a datos debe ser para dar a las entidades del juego propiedades como animar, interactuar, mover, ... usando la herencia. Todo depende de un administrador de datos inteligente que proporcione solo las entidades necesarias para cada componente, por ejemplo, para física o animación.
danijar
@sharethis: si entiendo su objeción, es que el polimorfismo de subtipo es una característica clave de OO. Estoy de acuerdo en que un lenguaje que dice ser OO sin soporte para él sería extraño, pero eso no significa que sea una herramienta de primer recurso para el tipo de problemas que uno encuentra al programar juegos, incluso cuando el juego está programado en un estilo OO . También diría que el DOD se trata realmente de evitar tipos particulares de polimorfismo (subtipo nominal) pero alentar a otros (en C ++, polimorfismo ad hoc con ADL o polimorfismo estructural a través de garantías sobre representaciones de valores).