이 전략에는 다음과 같은 것을 대체하는 것이 포함됩니다.
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
}
유형과 관련된 동작이 없으며 다른 유형의 리팩토링을 사용하는 경우 (예 : '하위 클래스로 유형 코드 바꾸기'+ '다형성으로 조건부 바꾸기').
그러나 저자는 왜이 방법을 찌르는지를 설명합니다 (자바)?
숫자 유형 코드 또는 열거는 C 기반 언어의 일반적인 기능입니다. 기호 이름을 사용하면 읽을 수 있습니다. 문제는 기호 이름이 별명 일뿐입니다. 컴파일러는 여전히 기본 숫자를 봅니다. 컴파일러 유형은 기호 이름이 아닌 숫자 177을 사용하여 확인합니다. 형식 코드를 인수로 사용하는 모든 메소드에는 숫자가 필요하며 기호 이름을 강제로 사용할 것은 없습니다. 이것은 가독성을 줄이고 버그의 원인이 될 수 있습니다.
그러나이 문을 C #에 적용하려고하면이 문은 사실이 아닙니다. 열거는 실제로 클래스로 간주되기 때문에 숫자를 허용하지 않습니다. 따라서 다음 코드는
public class Test
{
public void Do()
{
var temp = new Politician { MostNotableGrievance = 1 };
}
}
컴파일하지 않습니다. 따라서 C #과 같은 새로운 고급 언어에서는이 리팩토링이 불필요하다고 간주 될 수 있습니까? 아니면 무언가를 고려하고 있지 않습니까?
var temp = new Politician { MostNotableGrievance = MostNotableGrievance.Embezzlement };