(Ca sera mon dernier message sur le topic parceque je pense qu'on a perdu OP il y a 10 messages)
Le 06 août 2019 à 20:38:19 lokilok a écrit :
A la base tu avais pas parlé d'énum, ou alors j'ai mal lu.
En C++ tu ne passe jamais un type primitif nul part. Tu le redecore toujours pour avoir les operations que tu veux
Mais sinon ça reste une mauvaise idée les énumérations, à l'utilisation c'est plus ou moins propre mais à l'écriture c'est long (tu dois quand même créer 78 énumérations c'est long).
Si tu l'ecris a al main oui. perso, je genere ce genre de chose.
Donc dans un cas tu vas faire:
carte_a.getType() == carte_b.getType() et dans l'autre tu vas faire getType(carte_a) == getType(carte_b) . Ca qui revient a dire qu'en terme d'expressivite c'est pareil.
Mais ta fonction getType elle ressemble à quoi ? Elle sera compliquée, soit tu fais un switch sur les 78 valeurs ce qui est horrible, soi tu cast en char pour checker si le nombre derrière l'enum appartient entre les deux bons ID, c'est plus simple mais c'est pas très beau. Alors que si tu avais une classe ta fonction getType contiendrait uniquement un "return type" ce qui est infiniment plus simple et moins enclin aux erreurs.
Et c'est pareil pour la ton getNumber, tu devras caster en char et faire un modulo et des soustractions selon le type, source d'erreur potentielle aussi, alors qu'un getNumber dans une classe qui retourne number c'est impossible de se tromper.
Ca s'ecrit en 10 minutes tests inclus, si tu n'as jamais ecrit ce genre de chose de ta vie.
Donc tous les codes vont se retrouve a devoir utiliser une abstraction de plus haut niveau et comparer les cartes deux a deux en fonction de leur types.
Pourquoi ça ? Tu as juste à overload l'opérateur == (ce qui se fait très simplement, une ligne) et tu as exactement le même comportement que ton énumération.
La comparaison c'est pas juste l'egalite, et c'est une comparaison que tu ne fais jamais au tarot. La comparaison que tu veux est "est ce que cette carte est plus forte que cette carte?" ca s'est une comparaison qui depend du contexte du pli, donc il va te falloir de l'information contextuelle pour repondre a la question. La question "est ce que j'ai le droit de jouer cette carte?" depend egalement du plis.
Mouais, sauf que c'est un modele qui marche differement pour les atouts qui vont jusqu'a 21 ou pour l'excuse qui n'a pas de valeure numerique.
Le constructeur de ta carte class aura 3 if, c'est tout, c'est pas plus compliqué que de devoir créer 78 énumérations, sans compter tout le reste, et en plus de ça ça augmente la sécurité.
Note que c'est un constructeur que tu n'appellera qu'une fois parceque tu vas toujours construire un tas d'un coup. Donc tu vas devoir ecrire le code qui va generer les 78 cartes en appellant les 78 appels valide du constructeurs. (Et c'est le meme code que tu ecris pour generer l'enum.)
En gros le seul avantage de l'énumération serait un gain de performance, mais à côté de ça t'as que des inconvénients plus ou moins gros, et comme on dit "une optimisation prématurée est la source de tous les maux", et je pense que dans ce cas ça s'applique.
Sauf que pour pouvoir indexer sur les cartes tu va te retrouver a ecrire une fonction de hashage ou/et des comparateurs. Et tu vas avoir besoin de ces trucs la pour construire ton IA, ou simplement pour mapper un sprite a chaque carte. Et tu va ecrire du code gore partout dans l'application, parce que la logique du tarot est blinde de cas particulier.