Ця стратегія передбачає заміну подібного:
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; }
}
З:
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;
}
}
Чому саме це бажано робити перерахуванням типу, наприклад:
public class Politician
{
public MostNotableGrievance MostNotableGrievance { get; set; }
}
public enum MostNotableGrievance
{
Infidelity = 0,
Embezzlement = 1,
FlipFlopping = 2,
Murder = 3,
BabyKissing = 4
}
Немає поведінки, пов'язаної з типом, і якби вона була, ви б у будь-якому разі використовували інший тип рефакторингу, наприклад, "Замінити код типу підкласами" + "Замінити умовним поліморфізмом".
Однак автор пояснює, чому він нахмурився на цей метод (на Java?):
Коди числення чисельних типів є загальною ознакою мов на основі С. За допомогою символічних назв вони можуть бути досить читабельними. Проблема полягає в тому, що символічна назва є лише псевдонімом; компілятор все ще бачить основний номер. Тип компілятора перевіряє, використовуючи число 177, а не символічну назву. Будь-який метод, який приймає код типу як аргумент, очікує числа, і немає нічого, що змушує використовувати символічне ім'я. Це може зменшити читабельність і стати джерелом помилок.
Але при спробі застосувати це твердження до C #, це твердження не видається істинним: воно не прийме число, оскільки перерахування насправді вважається класом. Отже наступний код:
public class Test
{
public void Do()
{
var temp = new Politician { MostNotableGrievance = 1 };
}
}
Не збирається. Тож чи можна вважати таке рефакторинг необхідним у нових мовах високого рівня, як-от C #, чи я щось не розглядаю?
var temp = new Politician { MostNotableGrievance = MostNotableGrievance.Embezzlement };