Je suis nouveau en C # et je crée une simple calculatrice de notes pour apprendre. J'ai 6 zones de texte pour qu'un utilisateur entre des nombres, puis une note de lettre apparaîtra à côté. Tout fonctionne bien mais cela semble très redondant car j'ai 6 notes à convertir et 5 instructions if pour chacune juste pour afficher des lettres, puis une autre pour la note moyenne.
Je suppose qu'il existe un moyen de rendre cela moins redondant
if (grade1 >= 80) { labelGrade1.Text = "A"; } else if (grade1 >= 70 && grade1 <= 79) { labelGrade1.Text = "B"; } if (grade2 >= 80) { labelGrade2.Text = "A"; } else if (grade2 >= 70 && grade2 <= 79) { labelGrade2.Text = "B"; }
3 Réponses :
Vous ne pouvez pas éviter certaines déclarations if. Ils sont nécessaires.
Je ne peux répondre qu'à la question posée. Il y avait beaucoup de code redondant alors je l'ai supprimé! Comment puis-je savoir qu'il s'agit d'une faute de frappe de la part de l'OP? Cela dit, je ne serais pas trop rapide pour supprimer 2-3 déclarations if. 5-6 si des déclarations, alors oui. Enfin, après avoir revu la question, la réponse d'Ian Mercer semble bonne et pas trop compliquée. Mais cela suppose que l'échelle de notation sera la même pour chaque type de note.
C'était clairement une faute de frappe dans la question. Ce n'est pas une réponse utile.
Comment rédiger une bonne réponse? stackoverflow.com/help/how-to-answer
Je ne peux pas croire que quelqu'un avec 15 000 représentants écrive ce genre de réponse.
De plus, la condition value <= 79
n'est pas nécessaire, car la première condition if
capture cet ensemble de valeurs.
Créez une méthode qui encapsule le code dupliqué:
labelGrade1.Text = LetterFromGrade(grade1); labelGrade2.Text = LetterFromGrade(grade2); ...
Et puis utilisez cette méthode partout.
string LetterFromGrade(int grade) { if (grade > 79) return "A"; if (grade > 69) return "B"; ... }
Voulez-vous expliquer le vote défavorable?
J'aime ce que tu as fait. La seule chose dont je peux voir que quelqu'un pourrait devenir nerveux, c'est que vous avez changé > = 80
en > 79
- ce qui est identique au type int
- mais cela peut dérouter les OP car ils sont débutants.
Merci, je pense que c'est exactement ce que je recherchais. J'ai environ 8 heures de codage C # à mon actif, donc même cela m'obligera à faire quelques expériences pour comprendre.
Vous pouvez refactoriser votre code comme ceci:
Action<int, Label> updateLabel = (value, label) => { if ( value >= 80 ) label.Text = "A"; else if ( value >= 70 ) label.Text = "B"; }; updateLabel (grade1, labelGrade1); updateLabel (grade2, labelGrade2);
Meilleure odeur.
Vous pouvez bien sûr créer une méthode de classe au lieu d'une méthode locale mais si elle n'est utilisée que dans une méthode, local est meilleur car une méthode de classe permet à d'autres codes de l'appeler alors que ce code ne leur est pas destiné.
Pourquoi vérifiez-vous
grade1> = 80
deux fois?Copier / coller la duplication?
Créez une méthode qui convertit un int en chaîne et utilisez-la.
... Text = LetterFromGrade (note)
. Vous pouvez toujours prendre du code répété et le mettre dans sa propre méthode (fonction).il s'agit plus d'un modèle de programmation que de C #, normalement vous souhaitez regrouper une zone de texte et une étiquette dans un composant réutilisable, à l'intérieur du composant, vous vérifiez la note puis affichez le texte de l'étiquette en conséquence et réutilisez ce composant pour toutes les notes
Je vote pour fermer cette question comme hors sujet, car elle appartient à Révision de code