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

DDD คือ​อะไร และ​ทำไม​ต้อง​ใช้

Domain-Driven Design (DDD)Domain-Driven Design (DDD)แนวทาง​พัฒนา​ซอฟต์แวร์​ที่​เน้น​สร้าง domain model ซึ่ง​เข้าใจ​กฎ​และ​กระบวนการ​ของ​ธุรกิจ​อย่าง​ลึกซึ้ง แล้ว​เขียน​ลง​ใน code จริง บัญญัติ​โดย Eric Evans (2003) แบ่ง​เป็น Strategic และ Tactical DesignStrategic Design คือ​แนวทางการ​พัฒนา​ซอฟต์แวร์​ที่​ให้​ความ​สำคัญ​กับ​การ “สร้าง​แบบ​จำลอง​ของ​ธุรกิจ” (Domain ModelDomain ModelModel ของ Domain ที่​ฝัง​กฎ​และ​กระบวนการ​ทาง​ธุรกิจ​ไว้​ใน code จริง หัวใจ​ของ DDD คือ​การ​พัฒนา domain model ที่ “เข้าใจ​ธุรกิจ​อย่าง​ลึกซึ้ง”Strategic Design) ที่​เข้าใจ​กฎ​และ​กระบวนการ​ของ DomainDomainขอบเขต​ของ​ปัญหา​หรือ​ธุรกิจ​ที่​ซอฟต์แวร์​ของ​เรา​เข้าไป​แก้ไข เช่น การ​ขนส่ง​สินค้า การ​ธนาคาร e-commerce — คือ “โลก​ของ​ผู้​ใช้” ที่​โปรแกรม​ต้อง​เข้าใจStrategic Design อย่าง​ลึกซึ้ง แล้ว​เขียน​แบบ​จำลอง​นั้น​ลง​ไป​ใน code จริง ชื่อ​นี้​มา​จาก​หนังสือ​ปี 2003 ของ Eric Evans

flowchart LR
  D["domain (ธุรกิจจริง)"] --> M["Domain Model"]
  M --> C["code ที่รันได้"]
  C -->|ค้นพบความเข้าใจใหม่| M
  M -->|ปรับ Ubiquitous Language| D

Martin Fowler สรุป​ไว้​ว่า DDD เหมาะ​อย่าง​ยิ่ง​กับ DomainDomainขอบเขต​ของ​ปัญหา​หรือ​ธุรกิจ​ที่​ซอฟต์แวร์​ของ​เรา​เข้าไป​แก้ไข เช่น การ​ขนส่ง​สินค้า การ​ธนาคาร e-commerce — คือ “โลก​ของ​ผู้​ใช้” ที่​โปรแกรม​ต้อง​เข้าใจStrategic Design ที่ “ซับซ้อน” ซึ่ง​มี​ตรรกะ​ยุ่งเหยิง​จำนวน​มาก​ที่​ต้อง​จัด​ระเบียบ หัวใจ​ไม่​ได้​อยู่​ที่​เครื่องมือ​หรือ framework แต่​อยู่​ที่ “วิธี​คิด” ใน​การ​มอง​ธุรกิจ​และ​สื่อสาร​กับ​ผู้เชี่ยวชาญ​ธุรกิจ

ใน​การ​พัฒนา​ซอฟต์แวร์​สำหรับ domain ที่​ซับซ้อน เรา​ต้อง​สร้าง​ภาษา​กลาง​ที่​ฝัง​คำ​ศัพท์​ของ​ธุรกิจ​ลง​ไป​ใน​ระบบ​ที่​เรา​สร้าง

— ใจความ​จาก Eric Evans / Martin Fowler

ใน DDD Reference (2015) Evans สรุป DDD เป็นการ​พัฒนา​ซอฟต์แวร์​ที่​ซับซ้อน​โดย:

  1. โฟกัส​ที่ Core DomainCore Domainsubdomain ที่​สำคัญ​และ​สร้าง​ความ​ได้​เปรียบ​ใน​การ​แข่งขัน​มาก​ที่สุด เป็น​เหตุผล​ที่​เรา​ต้อง​สร้าง​ซอฟต์แวร์​เอง​แทน​การ​ซื้อ ควร​ทุ่ม​ทีม​เก่ง​ที่สุด​ลง​ตรง​นี้Strategic Design — ทุ่มเท​กับ​ส่วน​ที่​สร้าง​คุณค่า​และ​ความ​ได้​เปรียบ​มาก​ที่สุด
  2. สำรวจ ModelModelระบบ​ของ​แนวคิด​ที่​อธิบาย​แง่​มุม​สำคัญ​ของ Domain เพื่อ​ใช้​แก้​ปัญหา ไม่ใช่​ภาพ​สะท้อน​ความ​จริง​ทั้งหมด แต่​เป็น “การ​ตีความ​ที่​มี​ประโยชน์” ของ​ความ​จริงStrategic Design ร่วม​กัน — ระหว่าง​ผู้เชี่ยวชาญ​ธุรกิจ​กับ​นัก​พัฒนา อย่าง​สร้างสรรค์
  3. พูด Ubiquitous LanguageUbiquitous Languageภาษา​กลาง​ที่​ทุก​คนใน​ทีม (ทั้ง​นัก​พัฒนา​และ​ผู้เชี่ยวชาญ​ธุรกิจ) ใช้​ร่วม​กัน อิง​กับ domain model โดยตรง คำ​เดียวกัน​ต้อง​หมาย​ถึง​สิ่ง​เดียวกัน และ​สะท้อน​ลง​ใน codeStrategic Design ภายใน Bounded ContextBounded Contextขอบเขต​ที่​ชัดเจน (มัก​เป็น​ระบบ​ย่อย​หรือ​ทีม​หนึ่ง) ที่ model หนึ่ง​ใช้ได้​และ​มี​ความหมาย​แน่นอน ภายใน​ขอบเขต​นี้ Ubiquitous Language สอดคล้อง​กัน 100%Strategic Design ที่​ชัดเจน — ใช้​ภาษา​เดียวกัน​ใน​ขอบเขต​ที่​กำหนด
DDD แบ่ง​เป็น​สอง​ครึ่ง

Strategic Design (เชิงกลยุทธ์): มอง​ภาพ​ใหญ่ — Ubiquitous LanguageUbiquitous Languageภาษา​กลาง​ที่​ทุก​คนใน​ทีม (ทั้ง​นัก​พัฒนา​และ​ผู้เชี่ยวชาญ​ธุรกิจ) ใช้​ร่วม​กัน อิง​กับ domain model โดยตรง คำ​เดียวกัน​ต้อง​หมาย​ถึง​สิ่ง​เดียวกัน และ​สะท้อน​ลง​ใน codeStrategic Design, Bounded ContextBounded Contextขอบเขต​ที่​ชัดเจน (มัก​เป็น​ระบบ​ย่อย​หรือ​ทีม​หนึ่ง) ที่ model หนึ่ง​ใช้ได้​และ​มี​ความหมาย​แน่นอน ภายใน​ขอบเขต​นี้ Ubiquitous Language สอดคล้อง​กัน 100%Strategic Design, SubdomainSubdomainส่วน​ย่อย​ของ Domain ใหญ่ เช่น Domain e-commerce แตก​เป็น subdomain การ​สั่ง​ซื้อ การ​ชำระ​เงิน คลัง​สินค้า ฯลฯ อยู่​ใน “พื้นที่​ปัญหา” (problem space)Strategic Design, Context MappingContext Mappingกิจกรรมการ​ระบุ Bounded Context และ​นิยาม​ความ​สัมพันธ์​ระหว่าง​กัน (เช่น Partnership, Shared Kernel, ACL) เพื่อ​จัดการ​การ​เชื่อม​ต่อ​ระหว่าง​ทีม/ระบบStrategic Design เป็น​ส่วน​ที่ Fowler ยกย่อง​ว่า​เป็น “คุณูปการ​ที่​สำคัญ​ที่สุด” ของ Evans และ​ใช้ได้​กับ​ทุก​ภาษา/ทุก​กระบวน​ทัศน์

Tactical Design (เชิง​ปฏิบัติ): building blocks ระดับ code — EntityEntityอ็อบเจ็กต์ที่​มี “ตัวตน” (identity) ต่อ​เนื่อง​ตาม​เวลา แม้​ค่า​ภายใน​เปลี่ยน ก็​ยัง​เป็น​สิ่ง​เดิม เช่น ลูกค้า, คำ​สั่ง​ซื้อ — แยกแยะ​ด้วย id ไม่ใช่​ด้วย​ค่าTactical Design, Value ObjectValue Objectอ็อบเจ็กต์ที่​สำคัญ​ที่ “ค่า” ของ​มัน ไม่มี​ตัวตน​เฉพาะ สอง​ตัว​ที่​ค่า​เท่า​กัน​ถือว่า​เท่า​กัน ควร​เป็น immutable (เปลี่ยน​ค่า​ไม่​ได้) เช่น เงิน, วัน​ที่, พิกัดTactical Design, AggregateAggregateกลุ่ม​ของ Entity และ Value Object ที่​ถูก​มอง​เป็น​หนึ่ง​หน่วย​เดียว​เพื่อ​รักษา​ความ​ถูกต้อง​ของ​ข้อมูล มี​ขอบเขต​ชัดเจน และ​เป็น​หน่วย​ของ transactionTactical Design, RepositoryRepositoryตัว​ที่​ทำให้​เรา​เข้าถึง Aggregate ราวกับ​เป็น collection ใน​หน่วย​ความ​จำ ซ่อน​รายละเอียด​ฐาน​ข้อมูล มี1 repository ต่อ1 Aggregate RootTactical Design, Domain EventDomain Eventสิ่ง​ที่ “เกิด​ขึ้น​แล้ว” ใน domain ซึ่ง​ส่วน​อื่น​สนใจ แทน​ด้วย​อ็อบเจ็กต์ที่​เปลี่ยนแปลง​ไม่​ได้ ตั้ง​ชื่อ​เป็น​อดีต เช่น CargoWasRouted ใช้​สื่อสาร​ข้าม AggregateTactical Design ฯลฯ เป็น​เครื่องมือ​สร้าง domain model ที่ “รวย​พฤติกรรม”

ตัวอย่าง​ที่​จะ​เดิน​ไป​ด้วย​กัน​ทั้ง​คอร์ส: การ​ขนส่ง​สินค้า

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

ตลอด​คอร์ส​นี้​เรา​จะ​ใช้​ตัวอย่าง​เดียว​กับ​ใน​หนังสือ​ของ Evans คือ ระบบ​ขนส่ง​ตู้ container (Cargo Shipping) ค่อยๆ สร้าง​ขึ้น​ที​ละ​ชั้น​ใน​แต่ละ​บท ควบคู่​กับ​ตัวอย่าง​เสริม​ที่​คุ้น​เคย​กว่า​อย่าง e-commerce เพื่อ​ให้​เห็น​ภาพ​ชัด

🚢 Cargo Shipping — โจทย์​ตั้งต้น

บริษัท​ขนส่ง​ต้องการ​ระบบ​ที่: รับ “จอง” การ​ขนส่ง​สินค้า​จาก​ต้นทาง​ไป​ปลายทาง​ภายใน​กำหนด, วาง “แผน​เดินทาง” ที่​ผ่าน​ท่าเรือ​และ​เรือ​หลาย​ลำ, และ “ติดตาม​สถานะ” ของ​สินค้า​ระหว่าง​ทาง ฟัง​ดูเหมือน CRUD แต่​กฎ​ทาง​ธุรกิจ​ซับซ้อน​กว่า​ที่​คิดมาก — นี่​คือ​สนาม​ที่ DDD เปล่ง​ประกาย

🛒 ลอง​คิด​คู่​ขนาน — e-commerce

ใน​โลก e-commerce “คำ​สั่ง​ซื้อ (Order)” ก็​มี​กฎ​ทำนอง​เดียวกัน เช่น ยอด​รวม​ต้อง​ตรง​กับ​รายการ​สินค้า, เปลี่ยน​สถานะ​ได้​ตาม​ลำดับ​ที่​ถูกต้อง​เท่านั้น เรา​จะ​เทียบเคียง​สอง​โลก​นี้​ไป​ต่อ​เนื่อง


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

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

  • Domain Model — แบบ​จำลอง​ธุรกิจ​ที่ DDD ยึด​เป็น​แกน​กลาง ตรง​กับ​ที่​บท​นี้​อธิบาย​ว่า DDD คือ​การ​ฝัง​ความ​เข้าใจ domain ลงใน code
  • Domain (Core Domain) — ขยาย​ความ “โฟกัส​ที่ Core Domain” ข้อ​แรก​ใน​นิยาม​สาม​ข้อ​ของ Evans ว่า​ทำไม​ต้อง​ทุ่มเท​กับ​ส่วน​ที่​สร้าง​คุณค่า​ที่สุด
  • Ubiquitous Language — ภาษา​กลาง​ระหว่าง​ผู้เชี่ยวชาญ​ธุรกิจ​กับ​นัก​พัฒนา ที่​บท​นี้​ยก​เป็น​หนึ่ง​ใน​สาม​หัวใจ​ของ DDD
  • Strategic Design — รายละเอียด​ของ “ครึ่ง​เชิงกลยุทธ์” ที่​บท​นี้​แนะนำ​ไว้​แบบ​ภาพ​รวม
  • Tactical Design — รายละเอียด​ของ “ครึ่ง​เชิง​ปฏิบัติ” (Entity, Value Object, Aggregate ฯลฯ) ที่​บท​นี้​แนะนำ​ไว้​แบบ​ภาพ​รวม

เช็กความเข้าใจ — Stage 0

ข้อ 1 / 3

ข้อใดอธิบาย “หัวใจ” ของ DDD ได้ดีที่สุด?