การสร้างแบบจำลองโดเมนด้วยยูเนียนแยกแยะได้ (เรคคอร์ด) — จำลองใน C# 6
สร้างแบบจำลองยูเนียนแยกแยะได้ใน C# 6 ด้วย enum แท็กและคลาสขนาดเล็ก สร้างเมธอดโรงงาน และจัดการแต่ละรูปแบบด้วย switch ที่มีการโยนข้อผิดพลาดใน default
การสร้างแบบจำลองโดเมนด้วยยูเนียนแยกแยะได้ (เรคคอร์ด) — จำลองใน C# 6 เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 3 บทเรียน
แนวคิด DU ใน C# 6
เป้าหมาย: สร้างยูเนียนแบบแยกแยะด้วยแท็กขนาดเล็กใน C# 6
- อีนัมแท็ก สำหรับกรณีที่กำลังใช้งาน
- คลาสกรณี ขนาดเล็กสำหรับเก็บข้อมูล
- เมธอด Factory สำหรับสร้างกรณีที่ถูกต้อง
- คำสั่งเลือก + การโยนข้อผิดพลาดกรณีเริ่มต้น เพื่อจัดการรูปแบบทั้งหมด
แท็กและเมธอดสร้าง
ใช้อีนัมแท็กและ เมธอดสร้าง เพื่อสร้างเฉพาะกรณีที่ถูกต้อง ส่วนฟิลด์ของกรณีอื่นจะไม่ได้ใช้งาน
using System;
public enum PaymentKind { Cash, Card, Wire }
public sealed class Payment
{
public PaymentKind Kind;
// per-case data (only one is meaningful per instance)
public string CardLast4; // for Card
public string Iban; // for Wire
private Payment() { }
// factories keep invariants
public static Payment Cash()
{
Payment p = new Payment();
p.Kind = PaymentKind.Cash;
return p;
}
public static Payment Card(string last4)
{
if (string.IsNullOrEmpty(last4) || last4.Length != 4)
throw new ArgumentException("last4 must be 4 digits", "last4");
Payment p = new Payment();
p.Kind = PaymentKind.Card;
p.CardLast4 = last4;
return p;
}
public static Payment Wire(string iban)
{
if (string.IsNullOrEmpty(iban))
throw new ArgumentException("iban must not be empty", "iban");
Payment p = new Payment();
p.Kind = PaymentKind.Wire;
p.Iban = iban;
return p;
}
}
public class Program
{
public static void Main(string[] args)
{
Payment a = Payment.Cash();
Payment b = Payment.Card("1234");
Payment c = Payment.Wire("TR00BANKIBAN");
Console.WriteLine(a.Kind + ", " + b.Kind + ", " + c.Kind);
}
}
การจัดการรูปแบบต่าง ๆ
คำสั่ง เลือก แบบเดิมที่ทำงานกับแท็กช่วยให้จัดการแต่ละรูปแบบได้อย่างชัดเจน ส่วน การโยนข้อผิดพลาดกรณีเริ่มต้น จะแสดงรูปแบบที่ยังไม่ได้จัดการระหว่างการทดสอบ
using System;
public enum PaymentKind { Cash, Card, Wire }
public sealed class Payment
{
public PaymentKind Kind;
public string CardLast4;
public string Iban;
public static Payment Cash()
{
Payment p = new Payment(); p.Kind = PaymentKind.Cash; return p;
}
public static Payment Card(string last4)
{
if (string.IsNullOrEmpty(last4) || last4.Length != 4) throw new ArgumentException("last4");
Payment p = new Payment(); p.Kind = PaymentKind.Card; p.CardLast4 = last4; return p;
}
public static Payment Wire(string iban)
{
if (string.IsNullOrEmpty(iban)) throw new ArgumentException("iban");
Payment p = new Payment(); p.Kind = PaymentKind.Wire; p.Iban = iban; return p;
}
}
public static class Exhaustive
{
public static Exception Unhandled(object x)
{
return new InvalidOperationException("Unhandled case: " + x);
}
}
public class Program
{
static string Describe(Payment p)
{
switch (p.Kind)
{
case PaymentKind.Cash: return "Cash";
case PaymentKind.Card: return "Card ****" + p.CardLast4;
case PaymentKind.Wire: return "Wire " + p.Iban;
default: throw Exhaustive.Unhandled(p.Kind);
}
}
public static void Main(string[] args)
{
Console.WriteLine(Describe(Payment.Card("9876")));
}
}
ตัวช่วย Match แบบคล้ายผู้เยี่ยมชม
ตัวช่วย Match ขนาดเล็กจะรวมคำสั่งเลือกไว้ที่เดียวและส่งค่ากลับ ทำให้จุดเรียกใช้งานสะอาดขึ้น
using System;
public enum PaymentKind { Cash, Card, Wire }
public sealed class Payment
{
public PaymentKind Kind;
public string CardLast4;
public string Iban;
public static Payment Cash() { Payment p = new Payment(); p.Kind = PaymentKind.Cash; return p; }
public static Payment Card(string last4) { Payment p = new Payment(); p.Kind = PaymentKind.Card; p.CardLast4 = last4; return p; }
public static Payment Wire(string iban) { Payment p = new Payment(); p.Kind = PaymentKind.Wire; p.Iban = iban; return p; }
}
public static class PaymentMatch
{
public static T Match<T>(
Payment p,
Func<T> onCash,
Func<string, T> onCard,
Func<string, T> onWire)
{
switch (p.Kind)
{
case PaymentKind.Cash: return onCash();
case PaymentKind.Card: return onCard(p.CardLast4);
case PaymentKind.Wire: return onWire(p.Iban);
default: throw new InvalidOperationException("Unhandled: " + p.Kind);
}
}
}
public class Program
{
public static void Main(string[] args)
{
Payment p = Payment.Card("1234");
string summary = PaymentMatch.Match(
p,
delegate { return "Cash"; },
delegate(string last4) { return "Card ****" + last4; },
delegate(string iban) { return "Wire " + iban; }
);
Console.WriteLine(summary);
}
}
ใช้เมธอดสร้างบังคับเงื่อนไขคงรูป
เมธอดสร้างจะบังคับใช้ เงื่อนไขคงรูป: แต่ละกรณีจะกำหนดค่าเฉพาะฟิลด์ที่มีความหมาย และปฏิเสธข้อมูลขาเข้าที่ไม่ถูกต้องตั้งแต่เนิ่น ๆ
using System;
public enum ResultKind { Ok, Error }
public sealed class Result
{
public ResultKind Kind;
public string Message; // only for Error
public int Value; // only for Ok
private Result() { }
public static Result Ok(int value)
{
Result r = new Result();
r.Kind = ResultKind.Ok;
r.Value = value;
r.Message = null;
return r;
}
public static Result Error(string message)
{
if (string.IsNullOrEmpty(message)) throw new ArgumentException("message");
Result r = new Result();
r.Kind = ResultKind.Error;
r.Message = message;
r.Value = 0;
return r;
}
}
public class Program
{
static string Show(Result r)
{
switch (r.Kind)
{
case ResultKind.Ok: return "OK: " + r.Value;
case ResultKind.Error: return "ERROR: " + r.Message;
default: throw new InvalidOperationException("Unhandled: " + r.Kind);
}
}
public static void Main(string[] args)
{
Console.WriteLine(Show(Result.Ok(5)));
Console.WriteLine(Show(Result.Error("Boom")));
}
}
เคล็ดลับและข้อแลกเปลี่ยน
เคล็ดลับ:
- เลือกใช้กรณีและ โรงงาน ที่มีขนาดเล็กและมุ่งเน้นหน้าที่
- จัดการรูปแบบต่าง ๆ ไว้ที่เดียวด้วยตัวช่วยคำสั่งเลือก เพื่อให้โค้ดเป็นไปตามหลัก DRY
- คง การโยนข้อผิดพลาดกรณีเริ่มต้น ไว้ เพื่อเปิดเผยกรณีที่ขาดหายในการทดสอบ
ข้อแลกเปลี่ยน: มีโค้ดประกอบมากกว่าระเบียนสมัยใหม่ แต่ชัดเจนและใช้ได้กับ C# 6
แนวทางจำลอง DU
สรุปทบทวน
สรุปทบทวน: จำลองรูปแบบต่าง ๆ ด้วย อีนัมแท็ก สร้างกรณีที่ถูกต้องผ่าน เมธอดสร้าง และรวมการจัดการไว้ในคำสั่ง เลือก ซึ่งจะโยนข้อผิดพลาดในกรณีเริ่มต้น เพื่อให้ครอบคลุมทุกกรณีขณะทำงาน
คำถามที่พบบ่อย
บทเรียน “การสร้างแบบจำลองโดเมนด้วยยูเนียนแยกแยะได้ (เรคคอร์ด) — จำลองใน C# 6” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การสร้างแบบจำลองโดเมนด้วยยูเนียนแยกแยะได้ (เรคคอร์ด) — จำลองใน C# 6” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 3 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การสร้างแบบจำลองโดเมนด้วยยูเนียนแยกแยะได้ (เรคคอร์ด) — จำลองใน C# 6”
สร้างแบบจำลองยูเนียนแยกแยะได้ใน C# 6 ด้วย enum แท็กและคลาสขนาดเล็ก สร้างเมธอดโรงงาน และจัดการแต่ละรูปแบบด้วย switch ที่มีการโยนข้อผิดพลาดใน default คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 3 บทเรียน
บทเรียน “การสร้างแบบจำลองโดเมนด้วยยูเนียนแยกแยะได้ (เรคคอร์ด) — จำลองใน C# 6” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม
ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- รูปแบบ is รูปแบบเชิงสัมพันธ์และตรรกะ (จำลองใน C# 6)
- นิพจน์ switch และการตรวจสอบครบทุกกรณีด้วย when (จำลองใน C# 6)
- การสร้างแบบจำลองโดเมนด้วยยูเนียนแยกแยะได้ (เรคคอร์ด) — จำลองใน C# 6