TopBack to top

Modèle de données


Réaliser un modèle de données adapté à son problème n’est pas toujours simple.

Dans l’idéal, un modèle est :

  • Compréhensible
  • Performant
  • Simple à utiliser

Il faut donc bien réfléchir en amont à la manière dont les données sont structurées, car certains problèmes peuvent être évités.


Exemple:

La manière la plus simple de représenter un cube est d’utiliser six matrices de neuf couleurs.

Le problème d’un modèle aussi simple, c’est qu’il faut développer des services complexes (et parfois illisibles) pour pouvoir accéder à l’information pertinente.

Par exemple, pour savoir quelle pièce se trouve à un emplacement, il faut récupérer une série de couleurs et la comparer à une liste de pièces.



Le modèle de cube


Le modèle de cube a été développé dans l’idée qu’il pourrait être adapté pour représenter d’autres tailles de cubes.


Cet objectif va de pair avec certaines difficultés :

  • Considérer les cubes de taille paire rend impossible de se référer à une face par sa couleur. (les centres ne sont pas fixes).
  • Certaines pièces peuvent avoir les mêmes couleurs. (Par exemple deux arêtes adjacentes d’un cube 4x4x4)
  • Certains cubes sont dépourvus de certains types de pièces. (Un cube 2x2x2 ne possède aucun centre / arête)
  • Il doit être possible de créer simplement un algorithme permettant de tourner une face.

Après réflexion, mon modèle de cube est constitué des éléments suivants :

  • Une variable sauvegardant la taille du cube.
  • Une HashMap associant un objet « Position » à un objet « Pièce ».
  • Une HashMap associant une position à toutes les positions adjacentes.
  • Des références aux objets auxquels on doit pouvoir accéder rapidement.

La sauvegarde de la taille du cube permettra d’adapter le modèle pour représenter d’autres tailles de cube. (non exploité pour le moment)


La première HashMap possède des valeurs qui pourraient être énoncées comme :

« Une pièce rouge et jaune se trouve à l’emplacement d’une pièce vert et blanc ».

« Une pièce bleue se trouve à l’emplacement d’une pièce bleue ».

Ainsi, si on veut savoir si une pièce est résolue, on peut simplement demander si les couleurs d’un emplacement correspondent aux couleurs de la pièce qui s’y trouve :

« Une pièce rouge et jaune se trouve t’elle à cet emplacement de pièce rouge et jaune ? »


La seconde HashMap permet, à partir d’un emplacement, d’accéder à tous les emplacements adjacents.

Une telle information m’a parue intéressante pour certains cas d’usages, mais n’est pour le moment pas exploitée.


Les références permettent d’accéder rapidement à certains objets, dans une optique de performance.

En effet, les HashMap ont pour inconvénient d’être assez lentes, avoir un accès simplifié à certaines informations récurrentes peut donc nous permettre de gagner beaucoup de temps.




Le modèle des mouvements


Afin de pouvoir utiliser notre cube, il convient de définir les différents mouvements que nous pouvons réaliser.

Deux informations sont essentielles pour chaque mouvement :

  • Sur quelle face le mouvement est-il appliqué.
  • Quel est le sens de rotation : « horaire », « anti-horaire », ou « double ».

Initialement, on peut simplement adresser la face sur laquelle le mouvement est appliqué par sa couleur.

Exemple : « Vert anti-horaire », « Bleu horaire », etc.

Mais cette approche a ses limites.


Lorsqu’un être humain apprend une séquence de mouvement, il l’apprend d’une manière « relative ».

Ce qu’il retiendra ressemblera à « Droite horaire, haut double, droite anti-horaire ».

Et non à « Rouge horaire, blanc double, rouge anti-horaire ».


Ainsi, une fois qu’un être humain apprend une séquence de mouvement, il peut l’appliquer quelle que soit la position du cube.

Posséder un mécanisme similaire au sein du projet permet de gagner en flexibilité, puisqu’il est possible d’effectuer des opérations comme « Effectue cette séquence de mouvement lorsque bleu est en haut et orange est à droite ».


Il est donc possible d’écrire un mouvement sous deux formes :

  • Absolue (Couleur + sens de rotation)
  • Relative (Position + sens de rotation)

Il est possible de convertir une séquence de mouvements relatifs en séquence de mouvements absolus avec une orientation donnée grâce à ce service.