Enum Vs. Entier pour les valeurs de compétence

10

J'implémente un système de compétences et d'attributs de base, bien que j'aie des doutes sur la façon de procéder.

Par exemple, je pourrais utiliser un Dictionary / HashMap qui utilise des énumérations SkillType pour représenter les clés et des valeurs entières représentant les valeurs. Mais dois-je faire ça?

public class Skills
{
    public IDictionary<StatType, Int> skills; //StatType is enum, being the key; the int //is the value.

}

vs.

public class Skills
{
    public int LongBlade, Armor, Marksman; //...etc
}

J'aimerais connaître les avantages de la sécurité des types ici, par opposition à l'utilisation de nombres entiers de base. Des recommandations?

blissfreak
la source
Je préfère interface Skill { /* ... */ int toInt(); }; public class Skills : IList { private ArrayList<Skill> skills; /* ... */ };, en fait ...
Martin Sojka

Réponses:

8

S'il finira par y avoir:

  • une grande variété de types de compétences dans votre jeu,
  • ou des éléments conférant des capacités,
  • ou des buffs conférant des capacités,
  • ou un grand arbre de capacités,

puis je commence à préférer la flexibilité des chaînes ou des clés entières dans un dictionnaire plutôt que des champs d'instance individuels ou même un dictionnaire avec une clé enum.

Mon raisonnement - Parce que vous vous rendez peut-être bientôt compte ...

Garçon, ce serait bien si je pouvais modifier mon calcul et sélectionner les capacités des unités dans (mon éditeur de texte préféré | Excel | un outil personnalisé).

... à quel point un dictionnaire avec des chaînes ou des clés entières devient un ajustement plus naturel que d'avoir à maintenir vous-même des valeurs d'énumération ou une longue liste de champs d'instance. Cependant, cet outil peut toujours être écrit pour générer du code C # aussi, donc vous pourrez peut-être trouver un hybride heureux.

Si la complexité de votre jeu va être assez simple et votre variété de compétences petite, alors la gestion des champs d'instance à la main (au lieu du dictionnaire et de l'énumération) semble plus pratique et évite un niveau d'indirection, à la fois lors de l'exécution et de la "frappe" - temps.

DuckMaestro
la source
Mais qu'entendez-vous par capacités d'unité et mathématiques? Je ne suis pas tout à fait en train de suivre, du moins à cet égard. J'aimerais utiliser une énumération, si c'est pratique cependant.
blissfreak
Je suis partiellement d'accord avec vous, les chaînes sont excellentes à des niveaux supérieurs (par exemple l'API de script), mais déplacer des chaînes n'est pas une bonne idée (la mémoire et le temps de déplacement limitent la quantité maximale d'opérations que vous pouvez faire par image). Être hybride peut être une option: des entités nommées avec des identifiants entiers. Les noms doivent être stockés une fois (dans une carte singleton peut-être) et les entités s'identifient à l'aide d'entiers. Ce faisant, vous pouvez mettre des chaînes dans vos interfaces si nécessaire et travailler comme s'il s'agissait d'énumérations.
FxIII
@fxiii Je suis d'accord et c'est pourquoi j'ai mentionné "chaîne ou entier". Je ne suis pas entré dans les détails cependant, alors merci d'avoir soulevé pourquoi et comment en ce qui concerne l'utilisation des entiers.
DuckMaestro