IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Affichage des résultats du sondage: Quelle est la meilleure solutions selon vous? N'oubliez pas de m'expliquer pourquoi

Votants
2. Vous ne pouvez pas participer à ce sondage.
  • Enumérateur

    1 50,00%
  • Constantes

    1 50,00%
C# Discussion :

Enumérateurs ou constantes? à vos conseils


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur indépendant de jeux
    Inscrit en
    Septembre 2017
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur indépendant de jeux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2017
    Messages : 21
    Points : 15
    Points
    15
    Par défaut Enumérateurs ou constantes? à vos conseils
    Bonjour!

    Je travaille sur un projet personnel en C# (sur la plateforme Unity) et j'aurais besoin d'un éclairage pour choisir une solution parmi deux propositions.

    Le programme que je suis en train de concevoir doit lire un fichier .txt et stocker les données dans une List<string>. Jusque-là, ça fonctionne comme je veux.
    Etant donné que les données contenues dans le .txt respectent un modèle précis, chaque information se voit attribuer un numéro (de "zéro" à "List.Count", n'est-ce pas?), et chaque information reçoit le même numéro à chaque exécution.
    (Concrètement, j'aurais aussi bien pu intégrer ces informations directement dans le code ; je ne le fais pas parce que ce sont des données de traduction : il y aura un fichier francais.txt, allemand.txt et anglais.txt, et c'est censé être extensible à toutes les langues qu'on veut. Bref!)

    Pour l'instant, le code manque de lisibilité car j'accède à mes informations sous la forme "maListe[numéroTotalementAbstrait]". Du coup j'ai envisagé deux solutions:
    - Utiliser des énumérateurs (par exemple "enum Astre {Planete = 0, PremierSatellite, DeuxiemeSatellire}") et accéder à mes données sous la forme "maListe[(int)Astre.Planete]".
    - Utiliser des constantes (par exemple "const int Planete = 0; const int Premiersatellite = 1; const int DeuxiemeSatellite = 2;") et accéder à mes données sous la forme "maListe[Planete]".

    Au niveau de la lisibilité, les deux solutions me conviennent, mais je n'en sais pas assez sur la construction des énumérateurs pour choisir en connaissance de cause. Auriez-vous des pistes à me proposer?

    Merci d'avance pour vos propositions!
    (Et si je manque de clarté, bien sûr vous n'avez qu'à poser des questions)

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    dans ton cas ni l'un ni l'autre mais une classe avec des propriétés typées
    enum et constantes ne servent pas à la même chose, quand on a une liste de définies de valeur c'est l'enum qui est souvent plus pratique
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur indépendant de jeux
    Inscrit en
    Septembre 2017
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur indépendant de jeux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2017
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    Salut, merci pour ta réponse.

    J'ai déjà une classe, et elle contient la totalité des informations lues dans le fichier .txt ainsi qu'une méthode pour y accéder (avec un argument "int argINDEX", et elle retourne une chaîne de caractères).
    Pour info cette classe dispose d'une autre méthode : readTXT(int argLANGUAGE), qui charge un fichier .txt selon la langue demandée. Mais ce n'est pas notre sujet.
    Ce que je cherche à faire, c'est rendre le code plus lisible en remplaçant le n° d'index (un entier à quatre chiffres) de chaque information par des mots.

    Les deux méthodes sont adaptées au problème et fonctionnent parfaitement. Je veux juste savoir s'il y en a une qui peut s'avérer plus efficace, et à quel titre (dans les grandes lignes).

  4. #4
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 695
    Points
    10 695
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Dans ce genre de cas, j'ai tendance à favoriser les énumérations, car :
    • il est possible et très simplement de passer en revue l'ensemble des valeurs ;
    • d'ajouter des attributs (bon, ok, on peut le faire aussi sur des constantes, mais je ne l'ai jamais vu !) ;
    • elles se marient très bien avec l'usage de switch ;
    • le typage est plus fort (on ne mélange pas les choux et les carottes !) alors qu'avec des constantes, tant que le type est le même, pas de souci.


    Un dernier cas à prendre en compte, c'est que les constantes sont remplacées à la compilation. Qu'est-ce que cela signifie ? Si jamais les constantes sont définies dans un assembly A et sont utilisées dans un assembly B, alors, lors de la compilation de l'assembly B, les constantes sont remplacées par leur valeur. Autrement dit, si on recompile A et qu'on change les valeurs des constantes, ces modifications ne sont pas répercutées automatiquement dans B ! Il est impératif de recompiler B pour que les changements soient pris en compte !

    Ce souci n'existe pas avec l'usage d'une énumération.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur indépendant de jeux
    Inscrit en
    Septembre 2017
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur indépendant de jeux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2017
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    OK, merci pour cet éclaircissement!
    Je marque le sujet comme résolu, mais j'étudierai encore des propositions supplémentaires si quelqu'un souhaite en apporter

  6. #6
    Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Avril 2021
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par François DORIN Voir le message
    Bonjour,

    Dans ce genre de cas, j'ai tendance à favoriser les énumérations, car :
    • il est possible et très simplement de passer en revue l'ensemble des valeurs ;
    • d'ajouter des attributs (bon, ok, on peut le faire aussi sur des constantes, mais je ne l'ai jamais vu !) ;
    • elles se marient très bien avec l'usage de switch ;
    • le typage est plus fort (on ne mélange pas les choux et les carottes !) alors qu'avec des constantes, tant que le type est le même, pas de souci.


    Un dernier cas à prendre en compte, c'est que les constantes sont remplacées à la compilation. Qu'est-ce que cela signifie ? Si jamais les constantes sont définies dans un assembly A et sont utilisées dans un assembly B, alors, lors de la compilation de l'assembly B, les constantes sont remplacées par leur valeur. Autrement dit, si on recompile A et qu'on change les valeurs des constantes, ces modifications ne sont pas répercutées automatiquement dans B ! Il est impératif de recompiler B pour que les changements soient pris en compte !

    Ce souci n'existe pas avec l'usage d'une énumération.

    C'est la solution que je proposerais. De plus, qui dit fichier en .TXT, dit éventuellement une migration vers un fichier .XML. Les énumérations travaillent très bien en sérialisation.

    De plus, pour lire du code, si je prends son exemple, pour ma part lire Astre.Planete est beaucoup plus lisible que Planete. Là, c'est évident, mais on peut rapidement connaître toutes les énumérations de Astre facilement.

    Pour ma part, faire un « cast » avec « (int) », ce n'est pas la mer à boire!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/09/2006, 10h55
  2. [MySQL] Réaliser un script de statistiques : vos conseils pour l'architecture de la table ?
    Par MaTHieU_ dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 26/08/2006, 01h46
  3. Trés urgent (démission), besoin de vos conseils
    Par recttamuni dans le forum Démission
    Réponses: 9
    Dernier message: 25/07/2006, 22h49
  4. Applet au contenu dynamique, vos conseils...
    Par yizashi dans le forum Applets
    Réponses: 1
    Dernier message: 05/04/2006, 23h41
  5. Réponses: 10
    Dernier message: 31/12/2005, 21h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo