Strategi ini melibatkan penggantian yang seperti ini:
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; }
}
Dengan:
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;
}
}
Mengapa hal ini lebih disukai daripada membuat jenis penghitungan, seperti:
public class Politician
{
public MostNotableGrievance MostNotableGrievance { get; set; }
}
public enum MostNotableGrievance
{
Infidelity = 0,
Embezzlement = 1,
FlipFlopping = 2,
Murder = 3,
BabyKissing = 4
}
Tidak ada perilaku yang terkait dengan jenis dan jika ada Anda akan menggunakan jenis refactoring yang berbeda, misalnya, 'Ganti Kode Jenis dengan Subkelas' + 'Ganti Kondisional dengan Polimorfisme'.
Namun, penulis menjelaskan mengapa dia tidak menyukai metode ini (di Jawa?):
Kode jenis numerik, atau enumerasi, adalah fitur umum dari bahasa berbasis C. Dengan nama simbolis mereka dapat dibaca. Masalahnya adalah bahwa nama simbolik hanya alias; kompiler masih melihat nomor yang mendasarinya. Tipe kompiler memeriksa menggunakan nomor 177 bukan nama simbolik. Metode apa pun yang menggunakan kode jenis sebagai argumen mengharapkan nomor, dan tidak ada yang memaksa nama simbol untuk digunakan. Ini dapat mengurangi keterbacaan dan menjadi sumber bug.
Tetapi ketika mencoba menerapkan pernyataan ini ke C #, pernyataan ini tampaknya tidak benar: itu tidak akan menerima angka karena enumerasi sebenarnya dianggap sebagai kelas. Jadi kode berikut:
public class Test
{
public void Do()
{
var temp = new Politician { MostNotableGrievance = 1 };
}
}
Tidak akan dikompilasi. Jadi bisakah refactoring ini dianggap tidak perlu dalam bahasa tingkat tinggi yang lebih baru, seperti C #, atau apakah saya tidak mempertimbangkan sesuatu?
var temp = new Politician { MostNotableGrievance = MostNotableGrievance.Embezzlement };