Esta estrategia implica reemplazar los gustos de esto:
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; }
}
Con:
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;
}
}
¿Por qué es exactamente esto preferible a hacer que el tipo sea una enumeración, así:
public class Politician
{
public MostNotableGrievance MostNotableGrievance { get; set; }
}
public enum MostNotableGrievance
{
Infidelity = 0,
Embezzlement = 1,
FlipFlopping = 2,
Murder = 3,
BabyKissing = 4
}
No hay ningún comportamiento asociado con el tipo y si lo hubiera, estaría utilizando un tipo diferente de refactorización de todos modos, por ejemplo, 'Reemplazar código de tipo con subclases' + 'Reemplazar condicional con polimorfismo'.
Sin embargo, el autor explica por qué desaprueba este método (¿en Java?):
Los códigos de tipo numérico, o enumeraciones, son una característica común de los lenguajes basados en C. Con nombres simbólicos pueden ser bastante legibles. El problema es que el nombre simbólico es solo un alias; el compilador aún ve el número subyacente. El tipo de compilador verifica usando el número 177, no el nombre simbólico. Cualquier método que tome el código de tipo como argumento espera un número, y no hay nada que obligue a usar un nombre simbólico. Esto puede reducir la legibilidad y ser una fuente de errores.
Pero cuando se trata de aplicar esta declaración a C #, esta declaración no parece ser verdadera: no aceptará un número porque una enumeración se considera en realidad una clase. Entonces el siguiente código:
public class Test
{
public void Do()
{
var temp = new Politician { MostNotableGrievance = 1 };
}
}
No se compilará. Entonces, ¿puede esta refactorización considerarse innecesaria en los nuevos lenguajes de alto nivel, como C #, o no estoy considerando algo?
var temp = new Politician { MostNotableGrievance = MostNotableGrievance.Embezzlement };