此策略涉及替换以下内容:
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中)?
数字类型代码或枚举是基于C的语言的常见功能。使用符号名称,它们可以很容易阅读。问题在于符号名称仅是别名。编译器仍会看到基础编号。编译器类型使用数字177而不是符号名进行检查。任何将类型代码作为参数的方法都期望有一个数字,并且没有任何强制使用符号名的方法。这会降低可读性,并且会成为错误的来源。
但是,当尝试将此语句应用于C#时,该语句似乎并不正确:它不会接受数字,因为枚举实际上被认为是一个类。所以下面的代码:
public class Test
{
public void Do()
{
var temp = new Politician { MostNotableGrievance = 1 };
}
}
不会编译。因此,在C#等较新的高级语言中,是否可以认为这种重构是不必要的,还是我没有考虑什么?
var temp = new Politician { MostNotableGrievance = MostNotableGrievance.Embezzlement };