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

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 ได้ดีที่สุด?