กลยุทธ์นี้เกี่ยวข้องกับการแทนที่สิ่งนี้:
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 };