Salut Bktero,
ben quand tu critiques, tu n'y vas pas de main morte :-)
Il y a un truc que je ne saisis pas dans ton objection, mais pour moi c'est évident que si tu stockes le résultat de get_category() dans une variable, tu peux faire autant de tests que tu veux sans avoir à appeler get_category() de nouveau ou autre chose, et qu'il est plus efficace et moins coûteux de faire ainsi, plutôt d'avoir à appeler de multiples fois des fonctions testant si on est dans une catégorie ou pas.
C'est lisible grâce à l'enum. En fait, utiliser la variable contenant le membre de l'enum permet même de nous réconcilier avec switch / case pour des tests, si on veux faire ainsi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 cat = get_category(age); if (cat == CADET || cat == MINIME) printf("Vous avez votre entraînement de 16h00 à 18h00\n");
Je n'allais pas jusque là, mais, oui, on peut faire un array de struct, qui comprend non seulement le texte à afficher, mais aussi les pointeurs vers les fonctions nécessaires selon les actions à exécuter. Le tout en utilisant un index ayant sémantiquement du sens. Je ne vois pas où est le problème, au contraire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 switch (cat) { case CADET: case MINIME: do_things(); break; default: do_other_things(); break; }
Mais je ne suis pas un intégriste non plus de tout mettre dans les structures de données. Je ne ferai cela que si de façon pragmatique cela a du sens pour simplifier le développement et sa lisibilité.
Selon le standard C89, les membres d'un enum sont un type entier constant nommé, qui sont désignés par le standard comme faisant partie des "integral types" (3.1.2.5), par ailleurs, 3.1.3.3 indique : "An identifier declared as an enumeration constant has type int".
Il n'y aucune raison de générer un warning. Connais-tu un compilateur qui le fait ?
En revanche, l'enum permet effectivement de typer la variable qui peut accueillir le résultat de la fonction. Cela a l'avantage que, selon le standard C89, l'affectation d'une valeur à la variable autre qu'un membre de l'énumération générera un warning (A.5 COMMON WARNINGS), ce qui est un "bon warning" que j'aime bien voir, parce qu'il identifie une erreur.
Un autre avantage de l'enum sur le define est le débogage symbolique des programmes qui l'utilisent.
non, je n'ai pas écrit "MAX_AGE", j'ai écrit "MAX_AGE_CAT" abbréviant en langue anglaise "maximum age categories", ce qui sémantiquement dit bien qu'il s'agit du (nombre) maximum de catégories d'âge. Si le nom ne te plaît pas, tu peux choisir un nom qui te semble plus pertinent (par exemple NB_MAX_AGE_CAT, mais je trouve ma formulation plus directe et non équivoque).
Cependant, je ne vois pas pourquoi le développeur ne pourrait pas accéder à une information aussi importante que le nombre maximum de constantes, ne serait-ce que pour pouvoir les énumérer dans une boucle, par exemple.
Ahhh, merci ;-)
L'encapsulation est en théorie une bonne chose. Mais encapsuler tout ce qui bouge est un réflexe que je n'ai pas en tant que programmeur C, et qui complique le code de façon non nécessaire à mon sens. Bien sûr, on peux faire getCategoryName(), mais alors, on s'embarrasse d'une fonction alors que la structure de données contient déjà la réponse. Je ne suis pas partisan de créer une fonction pour une tâche triviale. Plus le code est simple et court, mieux je me porte, et plus je le trouve compréhensible et utilisable.
Dans le même ordre d'idées, faire 4 fonctions pour faire 4 if me semble être excessif.
Eks
Partager