0
votes

Comment réduire la redondance des instructions if

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";
}


5 commentaires

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


3 Réponses :


-6
votes

Voir le code redondant ci-dessous:

Vous ne pouvez pas éviter certaines déclarations if. Ils sont nécessaires.

 Affiche le code redondant

Plus de détails

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.


5 commentaires

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


Qu'est-ce que le refactoring


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.



3
votes

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";
     ...
 }


3 commentaires

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.



0
votes

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é.

À propos de l'opérateur délégué et des méthodes anonymes


0 commentaires