Ta strategia polega na zastąpieniu takich:
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; }
}
Z:
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;
}
}
Dlaczego właśnie tak jest preferowane, aby typ był wyliczeniem, tak jak poniżej:
public class Politician
{
public MostNotableGrievance MostNotableGrievance { get; set; }
}
public enum MostNotableGrievance
{
Infidelity = 0,
Embezzlement = 1,
FlipFlopping = 2,
Murder = 3,
BabyKissing = 4
}
Z typem nie wiąże się żadne zachowanie, a jeśli tak, to i tak używałbyś innego rodzaju refaktoryzacji, na przykład „Zamień kod typu na podklasy” + „Zamień warunkowo na polimorfizm”.
Jednak autor wyjaśnia, dlaczego marszczy brwi wobec tej metody (w Javie?):
Kody typów numerycznych lub wyliczenia są wspólną cechą języków opartych na języku C. Dzięki symbolicznym nazwom mogą być dość czytelne. Problem polega na tym, że nazwa symboliczna jest tylko pseudonimem; kompilator nadal widzi liczbę bazową. Typ kompilatora sprawdza, używając liczby 177, a nie nazwy symbolicznej. Każda metoda, która przyjmuje kod typu jako argument, oczekuje liczby i nic nie zmusza do użycia nazwy symbolicznej. Może to zmniejszyć czytelność i być źródłem błędów.
Ale podczas próby zastosowania tej instrukcji do C #, ta instrukcja wydaje się nieprawdziwa: nie przyjmie liczby, ponieważ wyliczenie jest faktycznie uważane za klasę. Więc następujący kod:
public class Test
{
public void Do()
{
var temp = new Politician { MostNotableGrievance = 1 };
}
}
Nie będzie się kompilować. Czy zatem refaktoryzację można uznać za niepotrzebną w nowszych językach wysokiego poziomu, takich jak C #, czy też nie rozważam czegoś?
var temp = new Politician { MostNotableGrievance = MostNotableGrievance.Embezzlement };