Bonjour à tous!
Tout d'abord, je n'ai pas pu répérer une section "théorique" ou encore une section de conception alors veillez m<excuser si le poste doit être déplacé.
Je souhaiterais avoir l'opinion des membres sur un problème de conception que j'ai actuellement.
Je vous explique tout d'abord la situation.
Nous construisons des potes et moi un petit moteur physique 2D. Nous en somme a la collision des objets. Dans notre schéma de classe, nous avons une classe de base CollidingObject et une série d'objets dérivant de la dite classe (Circle, Polygons, etc). Jusqu'ici tout va bien.
Maintenant, nous, lorsque nous voulons effectuer le calcul de collision entre 2 objets, on ne sait pas à quel endroit mettre la dite fonction! Nos solutions actuelles sont:
------
1) Utiliser le polymorphisme déjà en place et avoir une méthode de type CollidingObject ::IsCollidingWith(CollidingObject).
Les problèmes sont les suivants:
a) Il y a un bris flagrant d'encapsulation: chaque objet devra contenir les autres! Errrrrr...
b) Il y aura redéfinition inutile des méthodes. Ex: MyCircle.IsCollidingWith(MySquare) et MySquare.IsCollidingWith(MyCircle)
devraient effectuer exactement le même calcul et retourner le même résultat mais sont deux méthodes différentes.
------
2) Créer une classe CollisionCalculator qui tout ce qu'elle fera, c'est de contenir des méthodes pour calculer les collisions.
a) Cet "objet" a une vocation précise mais son existence même est douteuse. Tout ce qu'il fait, c'est de définir l'interaction entre les objets lorsqu'ils se cognent et rien d'autre. Il ne s'insère pas dans un schéma de classe "propre".
----
Personnelement, je trouve difficilement pardonnable le bris d'encapsulation qui se propage dans toute les classes et je préfère pour ma part légèrement la seconde solution, même au prix d'un objet étrange.
Quelles sont vos opinions à ce sujet? Est-ce qu'une des solutions vous semble meilleures que l'autres? Avez-vous d'autres pistes de solutions?
Merci à vous et à bientôt!
Partager