Comment appliquer la conception orientée données avec la programmation orientée objet? [fermé]

17

J'ai lu beaucoup d'articles sur la conception orientée données (DOD) et je le comprends mais je ne peux pas concevoir un système de programmation orientée objet (OOP) avec DOD à l'esprit, je pense que mon éducation OOP me bloque. Comment penser à mélanger les deux? L'objectif est d'avoir une belle interface OOP tout en utilisant DOD dans les coulisses.

J'ai vu cela aussi mais je n'ai pas beaucoup aidé: /programming/3872354/how-to-apply-dop-and-keep-a-nice-user-interface

Pombal
la source
3
Vous devez publier quelque chose de beaucoup plus spécifique (et lié au jeu), cette question est beaucoup trop générale.
DeadMG
Vous avez raison, mais je n'ai pas vu cela être discuté dans d'autres domaines que la programmation de jeux.
Pombal
4
@DeadMG: Je n'ai jamais vu le terme conception orientée données utilisé en dehors du développement de jeux, sauf quand il s'agit de pratiques issues du développement de jeux. Si vous songez à une conception basée sur les données, ce n'est pas la même chose.

Réponses:

16

Je dirais que le blog de Noel Llopis est probablement la meilleure instruction pour une combinaison de programmation orientée objet et de conception orientée données. Il est l'un des auteurs du terme DOD, est un programmeur C ++ solide et a beaucoup écrit sur son style et comment il tire parti des fonctionnalités OO de C ++.

Je suppose que si je devais appeler les éléments clés de leur combinaison, selon Noel:

  • Utilisez autant que possible les fonctions POD et non membres, non amis. Les fonctions non membres et non amis améliorent l'encapsulation et sont un élément clé de l'orientation des données car elles conservent les données, les données.
  • Évitez de stocker l'état "temporaire" sur vos objets. L'état temporaire obstrue vos données. Si vous avez besoin de mettre en cache quelque chose (par exemple pour les performances), cela appartient à une nouvelle classe, avec des fonctions non-membres non-amis reliant les deux types, pas une relation is-a ni has-a.
  • Évitez les objets qui peuvent être dans l'état A ou dans l'état B. Préférez basculer entre deux objets, dont l'un est A et dont l'un est B.
  • Évitez le polymorphisme, évitez les fonctions virtuelles, évitez les modèles, évitez tout ce qui donne à vos données l' apparence syntaxique de la similitude plutôt que la similitude réelle .

L'autre grand nom de la propagande DOD en ce moment est Mike Acton d'Insomniac, mais en lisant ce qu'il a écrit, je dirais qu'il n'est pas vraiment pro-OO (ou anti-OO, tant qu'il est toujours axé sur les données).


la source
Merci pour la réponse, mais ce que vous dites est ce que je dois faire pour utiliser DOD, pas comment utiliser OO avec. J'ai lu le blog de Noel, les diatribes de Mike Acton (: D), les publications de DICE entre autres et je comprends comment utiliser DOD, mais pas avec OO mélangé.
Pombal
2
Que pensez-vous que OO est? J'appellerais la plupart du code OO de Noel, par exemple - il y a toujours des classes et des instances, il y a toujours une répartition basée sur le type, il peut toujours y avoir un héritage (la définition de C ++ 0x du POD a été modifiée pour permettre cela). On modélise encore les problèmes à partir des données plutôt que des opérations.
Par exemple, le polymorphisme est une partie importante de la POO, tout comme les états d'objet. La conception orientée données devrait être de donner aux entités de jeu des propriétés comme animer capable, interagir capable, déplacer capable, ... en utilisant l'héritage. Tout dépend d'un gestionnaire de données intelligent qui ne fournit que les entités nécessaires à chaque composant, par exemple pour la physique ou l'animation.
danijar
@sharethis: Si je comprends votre objection, c'est que le polymorphisme de sous-type est une caractéristique clé d'OO. Je conviens qu'un langage prétendant être OO sans support serait étrange, mais cela ne signifie pas que c'est un outil de premier recours pour le genre de problèmes que l'on rencontre en programmant des jeux, même lorsque le jeu est programmé dans un style OO . Je dirais également que DOD vise vraiment à éviter des types particuliers de polymorphisme (sous-typage nominal) mais à encourager d'autres (en C ++, polymorphisme ad hoc avec ADL, ou polymorphisme structurel via des garanties sur les représentations de valeur).