ข้าม​ไป​ยัง​เนื้อหา

ไวยากรณ์​ของ Post-it — สัญลักษณ์​ใน Event Storming

สอง​บท​ที่​แล้ว​เรา​แปะ Post-it สี​ส้ม​เรียง​กัน​เป็น​เส้น​เวลา จน​เห็น​เรื่องราว​ของ​ธุรกิจ​ทั้ง​เส้น​บน​ผนัง​เดียว บท​นี้​จะ​เติม​สี​ที่​เหลือ​เข้าไป ที​ละ​สี จน​บอร์ด​ของ​เรา​มี “ไวยากรณ์” ครบ — พอ​รู้​ว่า​สี​ไหน​แปล​ว่า​อะไร คุณ​จะ​อ่าน​บอร์ด EventStormingEventStormingเวิร์กช็อป​สำรวจ domain แบบ​ร่วมมือ​กัน​ทั้ง​ทีม คิดค้น​โดย Alberto Brandolini ใช้ Post-it สี​ส้ม (domain event) แปะ​บน​ผนัง​ยาว ๆ เพื่อ​ดึง​ความ​รู้​จาก​หัว​คน​หลาย​ฝ่าย​ออก​มา​ให้​เห็น​พร้อม​กัน​ภายใน​ไม่​กี่​ชั่วโมงProcess ของ​ใคร​ก็ได้​เหมือน​อ่าน​ประโยค​ภาษา​ไทย และ​ที่​สำคัญ​กว่า​นั้น คุณ​จะ “เขียน” มัน​เอง​เป็น

เคล็ด​ลับ​ที่​ทำให้ Event Storming เรียน​ง่าย​คือ​มัน​มี​คำ​ศัพท์​อยู่​ไม่​กี่​คำ Brandolini ออกแบบ​ให้​จงใจ — สี​น้อย กฎ​น้อย เพื่อ​ให้​คน​ที่​ไม่ใช่​โปรแกรมเมอร์​ก็​ร่วม​วง​ได้ จะ​ไล่​ที​ละ​สี​ตาม​ลำดับ​ที่​มัน​เชื่อมกันจริงๆ ไม่ใช่​เรียง​ตาม​พจนานุกรม

Post-it สี​ส้ม​คือ Domain EventDomain Eventสิ่ง​ที่ “เกิด​ขึ้น​แล้ว” และ​มี​ความหมาย​ต่อ​ผู้เชี่ยวชาญ​ธุรกิจ เขียน​เป็นกริยา​อดีต (เช่น OrderPlaced, PaymentCaptured) แทน​ด้วย Post-it สี​ส้ม เป็น​หน่วย​ตั้งต้น​ของ EventStorming ทุก​แบบTactical Design — “สิ่ง​ที่​เกิด​ขึ้น​แล้ว” เขียน​เป็นกริยา​อดีต​เสมอ เช่น OrderPlaced, PaymentCaptured, FoodDelivered มัน​คือ​ความ​จริง​ที่​เกิด​ไป​แล้ว​และ​ย้อน​ไม่​ได้ ทุก​สี​ที่​เหลือ​มี​ไว้​เพื่อ​ตอบ​คำถาม​เดียว: “แล้ว​อะไร​ทำให้ event สี​ส้ม​แต่ละ​ใบ​เกิด​ขึ้น?”

ถ้า​จำ​ได้​แค่​ประโยค​เดียว​จาก​ทั้ง​บท ขอ​ให้​เป็น​ประโยค​นี้ — สี​ส้ม​คือ “ผล” ส่วน​สี​อื่น​คือ “เหตุ” และ “ตัวกลาง” ที่​พา​ไป​สู่​ผล​นั้น

ก่อน​ที่ OrderPlaced จะ​เกิด ต้อง​มี​ใคร​สัก​คน “ตั้งใจ​สั่ง” ให้​มัน​เกิด​ก่อน ความ​ตั้งใจ​นั้น​คือ CommandCommandความ​ตั้งใจ​หรือ​การ​ตัดสิน​ใจ​ที่ “สั่ง​ให้​เกิด” domain event เขียน​เป็นกริยา​คำ​สั่ง (เช่น PlaceOrder) แทน​ด้วย Post-it สี​ฟ้า มัก​มี actor เป็น​ผู้​ลงมือTactical Design — Post-it สี​ฟ้า เขียน​เป็นกริยา​คำ​สั่ง (รูป​ปัจจุบัน) เช่น PlaceOrder, CapturePayment, AcceptOrder

สังเกต​คู่​ตรง​ข้าม​ให้​ดี มัน​คือ​กุญแจ​ของ​ทั้ง​เรื่อง:

  • PlaceOrder (ฟ้า, คำ​สั่ง) → OrderPlaced (ส้ม, เกิด​แล้ว)
  • CapturePayment (ฟ้า) → PaymentCaptured (ส้ม)

command คือ “ปุ่ม​ที่​ถูก​กด” ส่วน event คือ “สิ่ง​ที่​เกิด​หลัง​กด​ปุ่ม” command อาจ​ล้มเหลว​ได้ (กด​แล้ว​ไม่​สำเร็จ) แต่ event เป็น​ความ​จริง​ที่​เกิด​ไป​แล้ว​เสมอ นี่​คือ​เหตุผล​ที่​เรา​แยก​สอง​สี​นี้​ออก​จาก​กัน

ติด​กับ command สี​ฟ้า​มัก​มี Post-it สี​เหลือง​แผ่น​เล็กๆ แปะ​อยู่​มุม​หนึ่ง นั่น​คือ ActorActorคน/บทบาท​ที่​ออก command (เช่น ลูกค้า ร้าน​อาหาร ไร​เด​อร์) แทน​ด้วย Post-it สี​เหลือง​แผ่น​เล็ก​แปะ​มุม​ของ command ช่วย​ตอบ​ว่า “ใคร​เป็น​คน​ทำ”Process — คน​หรือ​บทบาท​ที่​ลงมือ​ออก command เช่น ลูกค้า (Customer), ร้าน​อาหาร (Restaurant), ไร​เด​อร์ (Rider) actor ตอบ​คำ​ถามสั้นๆ ว่า “ใคร​เป็น​คน​ทำ” เรา​จงใจ​ให้​แผ่น​มัน​เล็ก เพราะ​มัน​เป็น​แค่​ป้าย​กำกับ command ไม่ใช่​ตัวเอก​ของ​เรื่อง

command ถูก​ส่ง​ไป​หา​อะไร​สัก​อย่าง​ที่ “ตัดสิน​ใจ” ว่า​จะ​รับ​หรือ​ปฏิเสธ แล้ว​ปล่อย event ออก​มา สิ่ง​นั้น​คือ AggregateAggregateกลุ่ม​ของ object ที่​ถือ​กฎ​ความ​สอดคล้อง (invariant) ไว้​ด้วย​กัน ใน EventStorming คือ “สิ่ง​ที่​รับ command แล้ว​ปล่อย event ออก​มา” (เช่น Order, Payment) แทน​ด้วย Post-it สี​เหลือง​แผ่น​ใหญ่Tactical Design — Post-it สี​เหลือง​แผ่น​ใหญ่ (เหลือง​ซีด​กว่า​ปกติ) ใน​โลก Event Storming เรา​นิยาม aggregate แบบ​บ้านๆ ว่า

“ก้อน​ที่​รับ command เข้า แล้ว​ปล่อย event ออก”

ใน​ตัว​อย่างฟู้ด​เดลิ​เวอรี​ของ​เรา aggregate หลัก​คือ Order, Payment, Delivery เวลา​ลูกค้า​ยิง PlaceOrder เข้า​มา ตัว Order คือ​คน​รับ​เรื่อง ตรวจ​ว่า​ถูกต้อง​ไหม (ตะกร้า​มี​ของ​หรือ​เปล่า, ร้าน​เปิด​อยู่​ไหม) ถ้า​ผ่าน มัน​จึง​ปล่อย OrderPlaced ออก​มา

เรา​เรียก aggregate ว่า “หน่วย​ความ​สอดคล้อง” (consistency boundary) เพราะ​มัน​คือ​คน​ถือ​กฎ​ธุรกิจ (invariant) ไว้​ใน​มือ เช่น กฎ​ว่า “สั่ง​อาหาร​ต้อง​มี​อย่าง​น้อย 1 รายการ” เป็น​หน้าที่​ของ Order ที่​จะ​ไม่​ยอม​ปล่อย OrderPlaced ถ้า​กฎ​นี้​ไม่​ผ่าน ตอน​นี้​เข้าใจ​แค่​ระดับ​นี้​พอ — เดี๋ยว​บท​ที่ 4 จะ​ซูม​เข้าไป​ดู​ข้าง​ใน​มัน​ละเอียด​กว่า​นี้

ยัง​ไม่​ต้อง​คิด​เรื่อง class หรือ​ตาราง

หลาย​คน​พอ​เห็น​คำ​ว่า aggregate ก็​รีบ​นึกถึง class ใน code หรือ​ตาราง​ใน​ฐาน​ข้อมูล — ตอน​ติด Post-it ยัง ไม่​ต้อง คิด​ขนาด​นั้น บน​บอร์ด aggregate เป็น​แค่ “ชื่อ​ของ​ก้อน​ที่​รับ command แล้ว​ปล่อย event” เท่านั้น การ​รีบ​ผูก​กับ​โครงสร้าง code เร็ว​เกิน​ไป​จะ​ปิด​กั้น​บทสนทนา​กับ​ฝ่าย​ธุรกิจ

พอ​มี​ครบ​สี่​สี — actor, command, aggregate, event — เรา​ต่อ​มัน​เป็น​หนึ่ง​สเต็ป​ของ​ไวยากรณ์​ได้​แล้ว อ่าน​จาก​ซ้าย​ไป​ขวา: ลูกค้า ออก​คำ​สั่ง PlaceOrder ไป​ที่ Order ซึ่ง​ปล่อย OrderPlaced ออก​มา ไดอะแกรม​ข้าง​ล่าง​เติม​สี​ที่​ห้า​เข้าไป​ด้วย (สี​ม่วง) ซึ่ง​จะ​อธิบาย​ต่อ​ใน​หัวข้อ​ถัด​ไป

flowchart LR
  A["ลูกค้า"] --> C["PlaceOrder"]
  C --> AG["Order"]
  AG --> E["OrderPlaced"]
  E --> P["Policy — whenever OrderPlaced ให้เก็บเงิน"]
  P --> NC["CapturePayment"]
  classDef actor fill:#fde047,stroke:#a16207,color:#1a1a1f;
  classDef cmd fill:#3b82f6,stroke:#1d4ed8,color:#f8fafc;
  classDef agg fill:#fef3c7,stroke:#a16207,color:#1a1a1f;
  classDef evt fill:#e8743b,stroke:#b45309,color:#1a1a1f;
  classDef pol fill:#c4b5fd,stroke:#6d28d9,color:#1a1a1f;
  class A actor;
  class C,NC cmd;
  class AG agg;
  class E evt;
  class P pol;

ถ้า​มี​แต่ actor คอย​กด​ปุ่ม​ทุก​ครั้ง ระบบ​ก็​คง​ช้า​น่า​ดู ใน​ความ​จริง​หลายๆ ก้าว​เกิด​ขึ้น “โดย​อัตโนมัติ” ทันที​ที่​มี event บาง​อย่าง กฎ​อัตโนมัติ​แบบ​นี้​คือ PolicyPolicyกฎ​เชิง​ปฏิกิริยา​แบบ “whenever X → do Y” ที่​คอย​ฟัง event หนึ่ง​แล้ว​สั่ง command ต่อ​โดย​อัตโนมัติ (เช่น เมื่อ PaymentCaptured → แจ้ง​ร้าน​ให้​กด​รับ) แทน​ด้วย Post-it สี​ม่วง​อ่อนProcess — Post-it สี​ม่วง​อ่อน เขียน​ใน​รูปแบบ​เดียว​เสมอ:

whenever <event><command>

อ่าน​ว่า “เมื่อไหร่​ก็ตาม​ที่ event นี้​เกิด ให้​สั่ง command นี้​ต่อ” policy คือ “ตัวแทน” ที่​ไม่ใช่​คน มัน​นั่ง​ฟัง event อยู่​เงียบๆ พอได้ยิน​ปุ๊บ​ก็​ยิง command ถัด​ไป​ทันที ใน​ไดอะแกรม​ด้าน​บน สี​ม่วง​คือ policy “whenever OrderPlaced → ให้​เก็บ​เงิน” ซึ่ง​ไป​กด​ปุ่ม CapturePayment ต่อ​ให้​เอง โดย​ไม่มี​มนุษย์​มา​เกี่ยว

policy สำคัญ​มาก​เพราะ​มัน​คือ​จุด​ที่​บอร์ด “ขยับ​เอง” — event ตัว​หนึ่ง​จุด​ชนวน command ตัว​ถัด​ไป ซึ่ง​ไป​เกิด event ใหม่ ซึ่ง​จุด​ชนวน policy ใหม่ ต่อ​กัน​เป็น​ลูกโซ่ นี่แหละ​คือ​เครื่องยนต์​ที่​ขับ​เคลื่อน​ทั้ง​ระบบ

🍔 นโยบาย​เส้นเลือด​ของฟู้ด​เดลิ​เวอรี

บน​บอร์ด​สั่ง​อาหาร​ของ​เรา​มี policy สำคัญ​สอง​ตัว​ที่​ทำให้​ทุก​อย่าง​เดิน​หน้า​เอง​โดย​ไม่​ต้อง​รอ​คน​กด:

  • whenever PaymentCaptured → แจ้ง​ร้าน​ให้​กด​รับ (สั่ง AcceptOrder)
  • whenever OrderAcceptedByRestaurant → หา​ไร​เด​อร์ให้ (สั่ง AssignRider)

ลอง​อ่าน​ออก​เสียง​ดู มัน​เป็น​ภาษา​คน​ล้วนๆ — “พอ​ตัด​เงิน​สำเร็จ ให้​แจ้ง​ร้าน” ฝ่าย​ธุรกิจ​พยัก​หน้า​ตาม​ได้​ทันที นี่​คือ​พลัง​ของ policy สี​ม่วง

สี​เขียว: Read Model — สิ่ง​ที่​ผู้​ใช้​อ่าน​ก่อน​ตัดสิน​ใจ

หัวข้อ​ที่​มีชื่อ​ว่า “สี​เขียว: Read Model — สิ่ง​ที่​ผู้​ใช้​อ่าน​ก่อน​ตัดสิน​ใจ”

ก่อน actor จะ​กล้า​ออก command เขา​มัก​ต้อง “อ่าน” อะไร​บาง​อย่าง​ก่อน ลูกค้า​กด​สั่ง​อาหาร​ได้​ก็​ต่อ​เมื่อ​เห็น​ตะกร้า​และ​ราคารวมชัดๆ ข้อมูล​หรือ​หน้า​จอ​ที่​ผู้​ใช้​อ่าน​เพื่อ​ประกอบ​การ​ตัดสิน​ใจ​นี้​คือ Read ModelRead Modelข้อมูล/หน้า​จอ​ที่​ผู้​ใช้ “อ่าน” เพื่อ​ประกอบ​การ​ตัดสิน​ใจ​ก่อน​ออก command (เช่น ตะกร้า หน้า​ติดตามออเดอร์) แทน​ด้วย Post-it สี​เขียว เชื่อม​โยง​กับ​ฝั่ง Query ของ CQRSTactical Design — Post-it สี​เขียว

ใน​ตัวอย่าง​ของ​เรา read model ที่​เด่น​ที่สุด​คือ ตะกร้า (Cart) ที่​ลูกค้า​เห็น​ก่อน​กด PlaceOrder และ หน้า​ติดตามออเดอร์ (Order tracking) ที่​ลูกค้า​เปิด​ดู​ว่า​ไร​เด​อร์ถึง​ไหน​แล้ว สังเกต​ว่า read model มัก​วาง​ไว้ “ก่อน” command บน​เส้น​ทางการ​อ่าน แล้ว​ชี้​เข้าหา actor เพื่อ​บอกว่า “คน​อ่าน​อัน​นี้​แล้ว​จึง​ตัดสิน​ใจ​กด” มัน​คือ​ฝั่ง “อ่าน” ของ​ระบบ ต่าง​กับ event/command ที่​เป็น​ฝั่ง “เขียน”

สีชมพู​และ​สี​แดง: ขอบ​ระบบ​และ​จุด​ที่​ยัง​ตอบ​ไม่​ได้

หัวข้อ​ที่​มีชื่อ​ว่า “สีชมพู​และ​สี​แดง: ขอบ​ระบบ​และ​จุด​ที่​ยัง​ตอบ​ไม่​ได้”

สอง​สี​สุดท้าย​เป็น​เหมือน “หมายเหตุ” ที่​ทำให้​บอร์ด​ตรง​กับ​ความ​จริง​มาก​ขึ้น

สีชมพู — External SystemExternal Systemระบบ​ภายนอก​ที่​เรา​ไม่​ได้​ควบคุม​แต่​ต้อง​คุย​ด้วย (เช่น Payment Gateway, บริการ​แจ้ง​เตือน, แผนที่) แทน​ด้วย Post-it สีชมพู ช่วย​ชี้​จุด​เชื่อม​ต่อ​และ​ความ​เสี่ยงArchitecture: ระบบ​ภายนอก​ที่​เรา​ต้อง​คุย​ด้วย​แต่​ไม่​ได้​เป็น​เจ้าของ เช่น Payment Gateway (ตัว​ตัด​บัตร), Push Notification (ตัว​ส่ง​แจ้ง​เตือน), Map/Routing (แผนที่​นำทาง​ไร​เด​อร์) เรา​วาด​มัน​ด้วย​สีชมพู​เพื่อ​เตือน​ตัวเอง​ว่า “ตรง​นี้​เรา​คุม​ไม่​ได้” — มัน​ช้า​ได้ ล่ม​ได้ เปลี่ยน API ได้ ทุก​จุด​ที่​ต่อ​กับ​สีชมพู​คือ​จุด​เสี่ยง​ที่​ต้อง​ออกแบบ​เผื่อ

สี​แดง — HotspotHotspotจุด​ที่​เป็น​ปัญหา ข้อ​ขัดแย้ง หรือ​คำถาม​ที่​ยัง​ตอบ​ไม่​ได้​ระหว่าง​เวิร์กช็อป แทน​ด้วย Post-it สี​แดง​วาง​เฉียง ๆ เก็บ​ไว้​กลับ​มา​คุย​ทีหลัง​โดย​ไม่​ขัดจังหวะ​การ​ไหล​ของ​กลุ่มProcess: จุด​ที่​เป็น​ปัญหา ข้อ​ขัดแย้ง หรือ​คำถาม​ที่​ยัง​ตอบ​ไม่​ได้​ระหว่าง​วง เรา​แปะ Post-it สี​แดง​เอียงๆ ไว้​ตรง​นั้น​แล้ว “เดิน​หน้า​ต่อ” ทันที ไม่​หยุด​เถียง​กลางวง เช่น “ร้าน​ไม่​กด​รับ​ใน 5 นาที ทำ​ยังไง?” หรือ “ยกเลิก​หลัง​จ่าย​เงิน​แล้ว คืน​เงิน​ยังไง?” hotspot คือ​ของขวัญ — มัน​คือ​รายการ​คำถาม​ที่​มี​ค่าที่สุด​ที่​จะ​เอา​ไป​คุย​ต่อ​หลัง​เวิร์กช็อป

กับดัก​ที่​พบ​บ่อย: เขียน command เป็น event

มือใหม่​มัก​สับสน​สี​ฟ้า​กับ​สี​ส้ม วิธี​เช็ก​คือ​ถาม​ว่า “มัน​สำเร็จ​แน่​หรือ​ยัง?” — PlaceOrder (สั่ง) ยัง ไม่​การันตี ว่า​สำเร็จ จึง​เป็น command สี​ฟ้า ส่วน OrderPlaced (สั่ง​แล้ว) เกิด​ขึ้น​จริง​แล้ว จึง​เป็น event สี​ส้ม อีก​กับดัก​คือ “ทำ​ทุก​อย่าง​เป็น aggregate” — ถ้า​ก้อน​ไหน​ไม่​ได้​รับ command และ​ไม่​ปล่อย event มัน​อาจ​เป็น​แค่ read model หรือ external system

เก็บ​ทั้ง​แปด​สี​ไว้​ใน​ที่​เดียว​เป็น​แผนที่​ไว้​เปิด​ดู เวลา​ยืน​หน้า​บอร์ด​จริง​คุณ​จะ​เหลือบ​มอง​มุม​นี้​บ่อยกว่าที่​คิด

flowchart TD
  ACT["Actor เหลืองเล็ก — คนที่ออก command"]
  CMD["Command ฟ้า — ความตั้งใจที่สั่งให้ event เกิด"]
  AGG["Aggregate เหลืองใหญ่ — รับ command แล้วปล่อย event"]
  EVT["Domain Event ส้ม — สิ่งที่เกิดขึ้นแล้ว กริยาอดีต"]
  POL["Policy ม่วง — กฎ whenever event ให้สั่ง command"]
  RM["Read Model เขียว — ข้อมูลหรือหน้าจอที่ผู้ใช้อ่าน"]
  EXT["External System ชมพู — ระบบภายนอกที่เราไม่ควบคุม"]
  HOT["Hotspot แดง — ปัญหาหรือคำถามที่เก็บไว้คุยทีหลัง"]
  classDef actor fill:#fde047,stroke:#a16207,color:#1a1a1f;
  classDef cmd fill:#3b82f6,stroke:#1d4ed8,color:#f8fafc;
  classDef agg fill:#fef3c7,stroke:#a16207,color:#1a1a1f;
  classDef evt fill:#e8743b,stroke:#b45309,color:#1a1a1f;
  classDef pol fill:#c4b5fd,stroke:#6d28d9,color:#1a1a1f;
  classDef rm fill:#86efac,stroke:#15803d,color:#1a1a1f;
  classDef ext fill:#f9a8d4,stroke:#be185d,color:#1a1a1f;
  classDef hot fill:#f87171,stroke:#b91c1c,color:#1a1a1f;
  class ACT actor;
  class CMD cmd;
  class AGG agg;
  class EVT evt;
  class POL pol;
  class RM rm;
  class EXT ext;
  class HOT hot;

ถ้า​เรียง​สี​ตาม​ลำดับ​ที่​มัน​เชื่อม​กัน​จริง จะ​ได้ “ประโยค​หลัก” ของ Event Storming ที่​วน​ซ้ำ​ต่อ​เนื่อง​ตลอด​ทั้ง​บอร์ด:

Actor → Command → Aggregate → Event → Policy → Command → …

อ่าน​เป็น​ไทย: คน ออก คำ​สั่ง ไป​ที่ ก้อน​ธุรกิจ ซึ่ง​ปล่อย เหตุการณ์ ออก​มา แล้ว กฎ​อัตโนมัติ ก็​ยิง คำ​สั่ง​ถัด​ไป วน​ต่อ​เนื่อง โดย​มี read model สี​เขียว​คอย​ป้อน​ข้อมูล​ให้ actor อ่าน​ก่อน​ตัดสิน​ใจ และ​มี external system สีชมพู​กับ hotspot สี​แดง​เป็น​หมายเหตุ​ประกอบ​ขอบๆ

ไดอะแกรม​สุดท้าย​รวม​ทุก​อย่าง​เข้า​ด้วย​กัน — read model นำ​หน้า actor, external system ต่อ​กับ command, และ hotspot แปะ​เตือน​ตรง​จุด​ที่​ยัง​ตอบ​ไม่​ได้:

flowchart LR
  RM["Read Model — ตะกร้า (Cart)"] --> A["ลูกค้า"]
  A --> C["PlaceOrder"]
  C --> AG["Order"]
  AG --> E["OrderPlaced"]
  PG["External — Payment Gateway"] -.-> C2["CapturePayment"]
  C2 --> AG2["Payment"]
  AG2 --> E2["PaymentCaptured"]
  H["Hotspot — ยกเลิกหลังจ่ายเงินแล้ว คืนเงินยังไง?"] -.-> AG2
  classDef actor fill:#fde047,stroke:#a16207,color:#1a1a1f;
  classDef cmd fill:#3b82f6,stroke:#1d4ed8,color:#f8fafc;
  classDef agg fill:#fef3c7,stroke:#a16207,color:#1a1a1f;
  classDef evt fill:#e8743b,stroke:#b45309,color:#1a1a1f;
  classDef rm fill:#86efac,stroke:#15803d,color:#1a1a1f;
  classDef ext fill:#f9a8d4,stroke:#be185d,color:#1a1a1f;
  classDef hot fill:#f87171,stroke:#b91c1c,color:#1a1a1f;
  class A actor;
  class C,C2 cmd;
  class AG,AG2 agg;
  class E,E2 evt;
  class RM rm;
  class PG ext;
  class H hot;

พอ​จับ​ไวยากรณ์​ประโยค​นี้​ได้ คุณ​จะ​เริ่ม​เห็น​มัน​ทุก​ที่ — ไม่​ว่าจะบอร์ดฟู้ด​เดลิ​เวอรี ระบบ​จอง​ตั๋ว หรือ​ระบบ​ธนาคาร มัน​คือ​ประโยค​เดียวกัน​หมด เปลี่ยน​แค่​คำ​นาม บท​ที่ 4 จะ​เอา​ไวยากรณ์​นี้​ไป​ซูม​เข้า bounded context เดียว​แล้ว​ขยาย​รายละเอียด​จน​เกือบ​พร้อม​เขียน code

🔗 อ้างอิง​เพิ่มเติม​ใน DevIQ

เจาะ​ลึก​แนวคิด​ต่อ​ได้ที่​คลัง​อ้างอิง DevIQ:

  • Domain Events — Post-it สี​ส้ม​บน​บอร์ด​กลาย​เป็น pattern domain event ใน code จริง​อย่างไร ต่อยอด​จาก​หัวข้อ​สี​ส้ม​โดยตรง
  • Command — มอง command สี​ฟ้า​ใน​เชิง pattern การ​ออกแบบ ช่วย​ให้​เห็น​ว่า “ความ​ตั้งใจ​ที่​ห่อ​เป็น​วัตถุ” มี​ประโยชน์​อย่างไร​ตอน​ลง code
  • Aggregate — อธิบาย aggregate ใน​ฐานะ​หน่วย​ความ​สอดคล้อง​ของ DDD ลง​ลึก​กว่า​นิยาม​บ้านๆ “รับ command แล้ว​ปล่อย event” ที่​ใช้

เช็กความเข้าใจ — บทที่ 3

ข้อ 1 / 3

Post-it สีม่วง (policy) แทนกฎแบบใด?