Cette stratégie consiste à remplacer les goûts de ceci:
public class Politician
{
public const int Infidelity = 0;
public const int Embezzlement = 1;
public const int FlipFlopping = 2;
public const int Murder = 3;
public const int BabyKissing = 4;
public int MostNotableGrievance { get; set; }
}
Avec:
public class Politician
{
public MostNotableGrievance MostNotableGrievance { get; set; }
}
public class MostNotableGrievance
{
public static readonly MostNotableGrievance Infidelity = new MostNotableGrievance(0);
public static readonly MostNotableGrievance Embezzlement = new MostNotableGrievance(1);
public static readonly MostNotableGrievance FlipFlopping = new MostNotableGrievance(2);
public static readonly MostNotableGrievance Murder = new MostNotableGrievance(3);
public static readonly MostNotableGrievance BabyKissing = new MostNotableGrievance(4);
public int Code { get; private set; }
private MostNotableGrievance(int code)
{
Code = code;
}
}
Pourquoi est-ce préférable à faire du type une énumération, comme ceci:
public class Politician
{
public MostNotableGrievance MostNotableGrievance { get; set; }
}
public enum MostNotableGrievance
{
Infidelity = 0,
Embezzlement = 1,
FlipFlopping = 2,
Murder = 3,
BabyKissing = 4
}
Il n'y a aucun comportement associé au type et s'il y en avait, vous utiliseriez de toute façon un type de refactorisation différent, par exemple, 'Remplacer le code de type par des sous-classes' + 'Remplacer le conditionnel par un polymorphisme'.
Cependant, l'auteur explique pourquoi il fronce les sourcils sur cette méthode (en Java?):
Les codes de type numérique, ou énumérations, sont une caractéristique courante des langages basés sur C. Avec des noms symboliques, ils peuvent être tout à fait lisibles. Le problème est que le nom symbolique n'est qu'un alias; le compilateur voit toujours le nombre sous-jacent. Le type de compilateur vérifie en utilisant le nombre 177 et non le nom symbolique. Toute méthode qui prend le code de type comme argument attend un nombre et rien ne force l'utilisation d'un nom symbolique. Cela peut réduire la lisibilité et être une source de bugs.
Mais lorsque vous essayez d'appliquer cette déclaration à C #, cette déclaration ne semble pas être vraie: elle n'acceptera pas de nombre car une énumération est en fait considérée comme une classe. Donc, le code suivant:
public class Test
{
public void Do()
{
var temp = new Politician { MostNotableGrievance = 1 };
}
}
Ne compile pas. Cette refactorisation peut-elle être considérée comme inutile dans les nouveaux langages de haut niveau, comme C #, ou ne suis-je pas en train de penser à quelque chose?
var temp = new Politician { MostNotableGrievance = MostNotableGrievance.Embezzlement };