この戦略では、次のようなものを置き換える必要があります。
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 };