Qu’est-ce que la conception orientée données?

Je lisais cet article , et ce gars continue à parler de la manière dont tout le monde peut tirer un grand profit du mélange de la conception orientée données avec la POO. Il ne montre cependant aucun exemple de code.

J’ai fait une recherche sur Google et je n’ai trouvé aucune information réelle sur ce que c’est, sans parler des exemples de code. Est-ce que quelqu’un connaît ce terme et peut fournir un exemple? Est-ce que c’est peut-être un mot différent pour autre chose?

Tout d’abord, ne confondez pas cela avec la conception basée sur les données.

Ma compréhension de la conception orientée données consiste à organiser vos données pour un traitement efficace. Surtout en ce qui concerne les manques de cache, etc. Data Driven Design, d’autre part, consiste à laisser le contrôle des données sur le comportement de beaucoup de vos programmes (décrit très bien par la réponse d’Andrew Keith ).

Supposons que dans votre application, vous avez des objects tels que la couleur, le rayon, le rebond, la position, etc.

Approche Orientée Objet

En POO, vous décririez des balles comme ceci:

class Ball { Point position; Color color; double radius; void draw(); }; 

Et puis vous créeriez une collection de balles comme ceci:

 vector balls; 

Approche Orientée Données

Dans la conception orientée données, vous êtes plus susceptible d’écrire le code comme ceci:

 class Balls { vector position; vector color; vector radius; void draw(); }; 

Comme vous pouvez le voir, il n’y a plus d’unité représentant une seule balle. Les objects Ball n’existent qu’implicitement.

Cela peut avoir de nombreux avantages en termes de performances. Habituellement, nous voulons faire des opérations sur plusieurs balles en même temps. Le matériel veut généralement que de gros morceaux de mémoire continus fonctionnent efficacement.

Deuxièmement, vous pouvez effectuer des opérations qui n’affectent qu’une partie des propriétés d’une boule. Par exemple, si vous combinez les couleurs de toutes les boules de différentes manières, vous voulez que votre cache contienne uniquement des informations de couleur. Cependant, lorsque toutes les propriétés de la balle sont stockées dans une unité, vous tirerez également toutes les autres propriétés d’une balle. Même si vous n’en avez pas besoin.

Exemple d’utilisation du cache

Dire une balle, chaque balle prend 64 octets et un point prend 4 octets. Un emplacement de cache prend par exemple 64 octets. Si je veux mettre à jour la position de 10 balles, je dois insérer 10 * 64 = 640 octets de mémoire dans le cache et obtenir 10 échecs de cache. Si toutefois je peux utiliser les positions des balles comme des unités séparées, cela ne prendra que 4 * 10 = 40 octets. Cela rentre dans un cache récupéré. Ainsi, nous ne recevons que 1 cache manquante pour mettre à jour toutes les 10 balles. Ces nombres sont arbitraires Je suppose qu’un bloc de cache est plus grand.

Mais cela montre comment la disposition de la mémoire peut avoir des conséquences graves sur le cache d’effets et donc sur les performances. Cela ne fera que gagner en importance à mesure que la différence entre la vitesse du processeur et celle de la RAM s’élargira.

Comment agencer la mémoire

Dans mon exemple de balle, j’ai beaucoup simplifié le problème, car vous utiliserez probablement plusieurs variables ensemble pour toute application normale. Par exemple, la position et le rayon seront probablement utilisés ensemble fréquemment. Ensuite, votre structure devrait être:

 class Body { Point position; double radius; }; class Balls { vector bodies; vector color; void draw(); }; 

La raison pour laquelle vous devez le faire est que si les données utilisées ensemble sont placées dans des baies séparées, il existe un risque qu’elles entrent en concurrence pour les mêmes emplacements dans le cache. Ainsi, le chargement de l’un jettera l’autre.

Ainsi, par rapport à la programmation orientée object, les classes que vous finissez ne sont pas liées aux entités de votre modèle mental du problème. Les données étant regroupées en fonction de l’utilisation des données, vous ne disposerez pas toujours de noms sensés pour vos classes dans la conception orientée données.

Relation aux bases de données relationnelles

La pensée derrière la conception orientée vers les données est très similaire à la façon dont vous pensez aux bases de données relationnelles. L’optimisation d’une firebase database relationnelle peut également impliquer une utilisation plus efficace du cache, bien que dans ce cas, le cache ne soit pas une mémoire mise en mémoire cache du processeur. Un bon concepteur de firebase database divisera probablement les données rarement consultées dans une table distincte plutôt que de créer une table avec un grand nombre de colonnes si seulement quelques colonnes sont utilisées. Il peut également choisir de dénormaliser certaines des tables pour ne pas avoir à accéder aux données à partir de plusieurs emplacements sur le disque. Tout comme avec la conception orientée données, ces choix sont faits en examinant les modèles d’access aux données et l’emplacement du goulot d’étranglement des performances.

Je veux simplement souligner que Noel parle spécifiquement de certains des besoins spécifiques auxquels nous sums confrontés dans le développement de jeux. J’imagine que d’autres secteurs qui effectuent une simulation logicielle en temps réel pourraient en bénéficier, mais il est peu probable que cette technique se traduise par une amélioration notable des applications métier générales. Cette configuration permet de garantir que chaque bit de performance est extrait du matériel sous-jacent.

Mike Acton a récemment parlé du design orienté données :

Mon résumé de base serait le suivant: si vous voulez des performances, puis pensez au stream de données, trouvez la couche de stockage la plus susceptible de se visser et d’optimiser les choses . Mike se concentre sur les échecs de cache L2, car il fait du temps réel, mais j’imagine que la même chose s’applique aux bases de données (lectures de disque) et même au Web (requêtes HTTP). Je pense que c’est une façon utile de programmer les systèmes.

Notez que cela ne vous dispense pas de penser aux algorithmes et à la complexité du temps, il concentre simplement votre attention sur le type d’opération le plus coûteux que vous devez ensuite cibler avec vos compétences en CS.

Une conception orientée données est une conception dans laquelle la logique de l’application est constituée d’ensembles de données, au lieu d’algorithmes procéduraux. Par exemple

approche procédurale

 int animation; // this value is the animation index if(animation == 0) PerformMoveForward(); else if(animation == 1) PerformMoveBack(); .... // etc 

approche de conception de données

 typedef struct { int Index; void (*Perform)(); }AnimationIndice; // build my animation dictionary AnimationIndice AnimationIndices[] = { { 0,PerformMoveForward } { 1,PerformMoveBack } } // when its time to run, i use my dictionary to find my logic int animation; // this value is the animation index AnimationIndices[animation].Perform(); 

Les conceptions de données comme celles-ci favorisent l’utilisation des données pour créer la logique de l’application. Il est plus facile à gérer, en particulier dans les jeux vidéo, qui peuvent comporter des milliers de chemins logiques basés sur l’animation ou un autre facteur.