0Pricing
C# Academy · บทเรียน

การสร้างแบบจำลองโดเมนด้วยยูเนียนแยกแยะได้ (เรคคอร์ด) — จำลองใน 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” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การสร้างแบบจำลองโดเมนด้วยยูเนียนแยกแยะได้ (เรคคอร์ด) — จำลองใน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. รูปแบบ is รูปแบบเชิงสัมพันธ์และตรรกะ (จำลองใน C# 6)
  2. นิพจน์ switch และการตรวจสอบครบทุกกรณีด้วย when (จำลองใน C# 6)
  3. การสร้างแบบจำลองโดเมนด้วยยูเนียนแยกแยะได้ (เรคคอร์ด) — จำลองใน C# 6
← กลับไปที่ C# Academy