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

Domain-Driven Design คือ​อะไร?

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

บท​นี้​ปู​พื้น​ภาพ​รวม​ของ DDD ทั้ง practices, patterns และ principles ก่อน​ที่​เรา​จะ​ลง​รายละเอียด​ใน​บท​ต่อๆ ไป สิ่ง​ที่​คุณ​จะ​ได้​คือ​เข้าใจ​ว่า ทำไม​การ​วิเคราะห์ “พื้นที่​ปัญหา” และ​การ​เลือก​ว่า​จะ​ทุ่ม​แรง​ตรง​ไหน จึง​สำคัญ และ​ทำไม การ​ทำงาน​ร่วม​กัน การ​สื่อสาร และ context จึง​เป็น​หัวใจ​ของ​การ​ออกแบบ​ซอฟต์แวร์​ที่​ดูแล​รักษา​ได้


ความ​ท้าทาย​ของ​การ​สร้าง​ซอฟต์แวร์​สำหรับ domain ที่​ซับซ้อน

หัวข้อ​ที่​มีชื่อ​ว่า “ความ​ท้าทาย​ของ​การ​สร้าง​ซอฟต์แวร์​สำหรับ domain ที่​ซับซ้อน”

ก่อน​จะ​เข้าใจ​ว่า DDD ช่วย​อะไร เรา​ต้อง​เข้าใจ​ก่อน​ว่า​อะไร​ทำให้การ​สร้าง​ซอฟต์แวร์​ที่​ไม่​ธรรมดา​นั้น​ยาก น่า​แปลก​ที่​รูปแบบ​สถาปัตยกรรม​ที่ “พบ​บ่อย​ที่สุด” ใน app ธุรกิจ กลับ​เป็น​รูปแบบ​ที่​เรียก​ว่า Big Ball of MudBig Ball of Mudระบบ​ที่​ปนเป​กัน​ยุ่งเหยิง​ไม่มี​ขอบเขต​ชัด ให้​ลาก​เส้น​ล้อม​ไว้​แล้ว​ยอมรับ​สภาพ ไม่​พยายาม​ทำ model ละเอียด​ใน​นั้น และ​ระวัง​ไม่​ให้​ลาม​ไป context อื่นStrategic Design (BBoM) — คำ​ที่ Brian Foote และ Joseph Yoder นิยาม​ไว้​ว่า

ระบบ​ที่​โครงสร้าง​ยุ่งเหยิง กระจัดกระจาย สะเปะสะปะ และ​ถูก​ปะ​ผุ​ไป​ที​ละ​จุด — ดง​รกชัฏ​ของ code สปาเกตตี (spaghetti code)

หนึ่ง​ใน​สาเหตุ​หลัก​ที่​ซอฟต์แวร์​กลาย​เป็น​เรื่อง​ซับซ้อน​และ​ดูแล​ยาก คือ​การ ปน​กัน​ระหว่าง​ความ​ซับซ้อน​ของ domain (ธุรกิจ) กับ​ความ​ซับซ้อน​ทาง​เทคนิค ดัง​รูป​ที่ 1-1

รูปที่ 1-1: ความซับซ้อนในซอฟต์แวร์ — ความซับซ้อนของ domain (Deliberate) ปนกับความซับซ้อนทางเทคนิค (Accidental) จนเส้นแบ่งเบลอ

Accidental vs Deliberate Complexity

ความ​ซับซ้อน​มี​สอง​ชนิด: deliberate (ตั้งใจ) คือ​ความ​ซับซ้อน​ของ​กฎ​ธุรกิจ​เอง​ที่​หลีก​เลี่ยง​ไม่​ได้ ส่วน accidental (โดย​บังเอิญ) คือ​ความ​ซับซ้อน​ที่​เรา​สร้าง​ขึ้น​เอง​จาก​ทาง​เลือก​ทาง​เทคนิค เป้าหมาย​ของ DDD คือ​แยก​สอง​สิ่ง​นี้​ออก​จาก​กัน เพื่อ​ให้​ความ​ซับซ้อน​ทาง​ธุรกิจ​ไม่​จม​หาย​ไป​ใน​รายละเอียด​ทาง​เทคนิค

เมื่อ​ทีม​ไม่​ได้​โฟกัส​ที่​ภาษา​และ​ความ​รู้​ร่วม​กัน​เกี่ยว​กับ problem domain ผล​คือ codebase ที่ “ทำงาน​ได้ แต่​ไม่​เปิดเผย​เจตนา​ของ​ธุรกิจ” code แบบ​นี้​อ่าน​ยาก แก้​ยาก เพราะ​ต้อง​คอย​แปล​ไป​มาระหว่าง Analysis ModelAnalysis Modelmodel เชิง​วิเคราะห์ — ภาพ​การ​ออกแบบ​เชิง​ตรรกะ​และ​โครงสร้าง​ของ​ซอฟต์แวร์​ที่​คน​ไม่ใช่​สาย​เทคนิค​ก็​เข้าใจ​ได้ (เช่น ภาพร่าง​หรือ UML) ใน DDD จะ​ถูก​ผูก​เข้า​กับ code model ผ่าน Ubiquitous LanguageStrategic Design กับ Code ModelCode Modelmodel ใน code — การ​แสดงออก​ของ domain model ใน code จริง DDD ถือว่า code model คือ “การ​แสดงออก​หลัก” (primary expression) ของ domain model ไม่ใช่​ไดอะแกรม​หรือ​เอกสารStrategic Design ซึ่ง​ทั้ง​แพง​และ​พลาด​ง่าย เมื่อ code ไม่​ผูก​กับ model ที่​ธุรกิจ​เข้าใจ มัน​จะ​ค่อยๆ เสื่อม​จน​กลาย​เป็น BBoM ใน​ที่สุด

ระบบ​ที่​เป็น BBoM ใน​ช่วง​แรก​มัก​สร้าง​ได้​เร็ว​และ​ประสบ​ความ​สำเร็จ​ดี แต่​เพราะ​ไม่​ได้​ออกแบบ​รอบ model ของ problem domain การ​ต่อยอด​ใน​ภายหลัง​จึง​ยุ่งยาก​ขึ้น​เรื่อยๆ ดัง​รูป​ที่ 1-2

รูปที่ 1-2: Code rot — ระบบช่วงแรกที่สร้างเร็ว เมื่อปล่อยไปโดยไม่ใส่ใจ เวลาผ่านไปก็กลายเป็นก้อนโคลน

เมื่อ​ยัง​ฝืน​พัฒนา​ต่อ​บน​สถาปัตยกรรม​แบบ​สปาเกตตี ความเร็ว​ใน​การ​เพิ่ม feature จะ​ลด​ลง​เรื่อยๆ version ใหม่​เต็ม​ไป​ด้วย bug และ​ทีม​เริ่ม​บ่น​ว่า​ทำงาน​ด้วย​ยาก สุดท้าย​แม้​จะ​เพิ่ม​คน​ก็​เร่ง velocity ไม่​ขึ้น แล้ว​คำขอ​ที่​น่า​กลัว​ที่สุด​ก็​มา​ถึง — “เขียน​ใหม่​ทั้ง​ระบบ” ซึ่ง​บ่อย​ครั้ง​ก็​วน​กลับ​ไป​สร้าง BBoM ก้อน​ใหม่​ขึ้น​มา​อีก

project ซอฟต์แวร์​ล้มเหลว​เมื่อ​เรา​ไม่​เข้าใจ domain ของ​ธุรกิจ​ดี​พอ การ​พิมพ์ code ไม่​เคย​เป็น​คอ​ขวด — ส่วน​ที่​ยากจริงๆ คือ​การ​สร้าง​และ​รักษา model ที่​ใช้งาน​ได้​จริง ของ domain ที่​ตอบ​โจทย์ business use case ยิ่ง​คุณ​ลงทุน​ทำความ​เข้าใจ​ธุรกิจ​มาก​เท่าไร คุณ​ก็​ยิ่ง​จำลอง​มัน​ลง​ใน​ซอฟต์แวร์​ได้​แม่นยำ​ขึ้น​เท่านั้น

กับดัก​ที่​พบ​บ่อย

ทีม​จำนวน​มาก​ทุ่ม​เวลา​ไป​ถก​เรื่อง “ฐาน​ข้อมูล” และ “framework” ตั้งแต่​ก่อน​จะ​เข้าใจ​ธุรกิจ — นี่​คือ​การ​เอา solution มา​ก่อน problem ผลลัพธ์​คือ model ที่​สะท้อน​เพียง​ตาราง​ใน​ฐาน​ข้อมูล ไม่ใช่​กระบวนการ​ธุรกิจ (business process) จริง


DDD รับมือ​กับ​ทั้ง​สอง​เรื่อง​พร้อม​กัน คือ การ​ทำความ​เข้าใจ problem domain และ การ​สร้าง solution ที่​ดูแล​รักษา​ได้ โดย​ใช้ patterns สอง​กลุ่ม: strategic และ tactical

patterns เชิงกลยุทธ์Domain-Driven Design (DDD)แนวทาง​พัฒนา​ซอฟต์แวร์​ที่​เน้น​สร้าง domain model ซึ่ง​เข้าใจ​กฎ​และ​กระบวนการ​ของ​ธุรกิจ​อย่าง​ลึกซึ้ง แล้ว​เขียน​ลง​ใน code จริง บัญญัติ​โดย Eric Evans (2003) แบ่ง​เป็น Strategic และ Tactical DesignStrategic Design ทำ​หน้าที่​กลั่น problem domain และ​กำหนด​รูปร่าง​สถาปัตยกรรม​ของ app ประกอบ​ด้วย​แนวคิด​หลัก:

  1. กลั่น problem domain เพื่อ​เผย​สิ่ง​ที่​สำคัญ — ไม่ใช่​ทุก​ส่วน​ของ​ระบบ​ที่​ต้อง​ออกแบบอย่าง​สมบูรณ์​แบบ การกลั่น domain ใหญ่​ออก​เป็น SubdomainSubdomainส่วน​ย่อย​ของ Domain ใหญ่ เช่น Domain e-commerce แตก​เป็น subdomain การ​สั่ง​ซื้อ การ​ชำระ​เงิน คลัง​สินค้า ฯลฯ อยู่​ใน “พื้นที่​ปัญหา” (problem space)Strategic Design ย่อยๆ จะ​เผย​ให้​เห็น Core DomainCore Domainsubdomain ที่​สำคัญ​และ​สร้าง​ความ​ได้​เปรียบ​ใน​การ​แข่งขัน​มาก​ที่สุด เป็น​เหตุผล​ที่​เรา​ต้อง​สร้าง​ซอฟต์แวร์​เอง​แทน​การ​ซื้อ ควร​ทุ่ม​ทีม​เก่ง​ที่สุด​ลง​ตรง​นี้Strategic Design ซึ่ง​เป็น​เหตุผล​ที่แท้​จริง​ว่า​ทำไม​ระบบ​นี้​ถึง​ถูก​สร้าง​ขึ้น และ​เป็น​จุด​ที่​ควร​ทุ่ม​ทีม​เก่ง​ที่สุด​ลง​ไป
  2. สร้าง ModelModelระบบ​ของ​แนวคิด​ที่​อธิบาย​แง่​มุม​สำคัญ​ของ Domain เพื่อ​ใช้​แก้​ปัญหา ไม่ใช่​ภาพ​สะท้อน​ความ​จริง​ทั้งหมด แต่​เป็น “การ​ตีความ​ที่​มี​ประโยชน์” ของ​ความ​จริงStrategic Design เพื่อ​แก้​ปัญหา​ของ domain — model ไม่ใช่​ภาพ​สะท้อน​ชีวิต​จริง​ทั้งหมด แต่​เป็น “สิ่ง​ที่​สร้าง​ขึ้น​อย่าง​พอเหมาะ” เพื่อ​ตอบ business use case โดย​ยัง​คง​กฎ​และ​ตรรกะ​ของ​ธุรกิจ​ไว้ และ​แยก​ออก​จาก infrastructure code
  3. ใช้​ภาษา​กลาง​เพื่อ​ให้​ร่วม​สร้าง model ได้Ubiquitous LanguageUbiquitous Languageภาษา​กลาง​ที่​ทุก​คนใน​ทีม (ทั้ง​นัก​พัฒนา​และ​ผู้เชี่ยวชาญ​ธุรกิจ) ใช้​ร่วม​กัน อิง​กับ domain model โดยตรง คำ​เดียวกัน​ต้อง​หมาย​ถึง​สิ่ง​เดียวกัน และ​สะท้อน​ลง​ใน codeStrategic Design (UL) คือ​ภาษา​ที่​วิวัฒน์​ไป​เรื่อยๆ ซึ่ง domain expert และ​นัก​พัฒนา​ใช้​ร่วม​กัน คำ​เดียวกัน​ต้อง​หมาย​ถึง​สิ่ง​เดียวกัน และ​สะท้อน​ตรง​ลง​ไป​ใน​โครงสร้าง​ของ code

เมื่อ model ใหญ่​ขึ้น​จน​ภาษา​เริ่ม​กำกวม เรา​ใช้ Bounded ContextBounded Contextขอบเขต​ที่​ชัดเจน (มัก​เป็น​ระบบ​ย่อย​หรือ​ทีม​หนึ่ง) ที่ model หนึ่ง​ใช้ได้​และ​มี​ความหมาย​แน่นอน ภายใน​ขอบเขต​นี้ Ubiquitous Language สอดคล้อง​กัน 100%Strategic Design มา​ล้อม model แต่ละ​ก้อน​ไว้ เพื่อ​กัน​ไม่​ให้​แต่ละ model ปน​เปื้อน​กัน​จน​กลาย​เป็น BBoM รูป​ที่ 1-3 แสดง​ให้​เห็น​ว่า strategic patterns ถูก​นำ​มา​ใช้​จัด​ระเบียบ problem domain ขนาด​ใหญ่​และ​ปกป้อง model ย่อย​อย่างไร (ลอง​เทียบ​กับ​รูป​ที่ 1-2)

รูปที่ 1-3: การนำ strategic patterns ของ DDD มาใช้ — แยก core ออกมาให้ลงทุนได้อิสระ ล้อมแต่ละ context ด้วยขอบเขตที่ชัดเจน และยอมให้ ball of mud ก้อนเล็กอยู่ได้ถ้ามันถูกแยกออกไป

นอกจาก​นี้ DDD ยัง​เน้น​การ​เข้าใจ ความ​สัมพันธ์​ระหว่าง context ผ่าน Context MapContext Mapแผนภาพ​ที่​แสดง Bounded Context ทั้งหมด​และ​ความ​สัมพันธ์​ระหว่าง​กัน ช่วย​ให้​เห็น​ภาพ​รวม​และ​จุด​เชื่อม​ต่อ/แปล​ภาษา​ใน​ระบบ​ใหญ่Strategic Design ซึ่ง​ช่วย​ให้​ทีม​เห็น​ภาพ​ใหญ่​ว่า model ไหน​รับผิดชอบ​อะไร และ​แลกเปลี่ยน​ข้อมูล​กัน​อย่างไร​เพื่อ​ทำให้​กระบวนการ​ธุรกิจ​ที่​ข้าม​หลาย subdomain สำเร็จ

patterns เชิง​ยุทธวิธีDomain-Driven Design (DDD)แนวทาง​พัฒนา​ซอฟต์แวร์​ที่​เน้น​สร้าง domain model ซึ่ง​เข้าใจ​กฎ​และ​กระบวนการ​ของ​ธุรกิจ​อย่าง​ลึกซึ้ง แล้ว​เขียน​ลง​ใน code จริง บัญญัติ​โดย Eric Evans (2003) แบ่ง​เป็น Strategic และ Tactical DesignStrategic Design หรือ “building blocks” คือ​ชุด​ของ pattern ที่​ใช้​สร้าง model ที่​ทรง​พลัง​ภายใน bounded context หนึ่งๆ หลาย​ตัว​ถูก​บันทึก​ไว้​แล้ว​โดย Martin Fowler ใน Patterns of Enterprise Application Architecture และ Erich Gamma และ​คณะ​ใน Design Patterns (GoF) — pattern เหล่า​นี้​ไม่​ได้​เหมาะ​กับ​ทุก model ต้อง​เลือก​ใช้​ตาม​ความ​เหมาะสม (เรา​จะ​ลง​ลึก​ใน Part III)


วิธี​คิด​สำคัญ​ของ DDD คือ​การ​แยก​ระหว่าง “ปัญหา” กับ “คำ​ตอบ”

Problem SpaceProblem Space“พื้นที่​ปัญหา” — สิ่ง​ที่​ธุรกิจ​ต้องการ​แก้ไข อยู่​ใน​รูป​ของ Domain และ Subdomain (ยัง​ไม่​พูด​ถึง​วิธี​แก้)Strategic Design คือ​สิ่ง​ที่​ธุรกิจ​ต้องการ​แก้ — เรา​กลั่น domain ใหญ่​ออก​เป็น subdomain ที่​จัดการ​ได้​ง่าย​ขึ้น เป้าหมาย​ใน​พื้นที่​นี้​คือ เผย​ว่า​อะไร​สำคัญ​และ​ควร​โฟกัส​ตรง​ไหน ดัง​รูป​ที่ 1-4

รูปที่ 1-4: patterns ที่ใช้ใน problem space — บดเคี้ยว domain knowledge ร่วมกับ domain expert แล้วกลั่นออกเป็น subdomain โดยมี core subdomain เป็นเหตุผลที่ระบบถูกสร้าง

Solution SpaceSolution Space“พื้นที่​คำ​ตอบ” — วิธี​ที่​เรา​เลือก​แก้​ปัญหา อยู่​ใน​รูป​ของ Bounded Context และ model 1 subdomain อาจ​มี​ได้​หลาย​คำ​ตอบStrategic Design คือ​วิธี​ที่​เรา​เลือก​แก้​ปัญหา — เป็น​ที่​อยู่​ของ bounded context และ model ใน code ที่​กำหนด​รูปร่าง​สถาปัตยกรรม​ของ app ให้​ดูแล​รักษา​ง่าย ดัง​รูป​ที่ 1-5

รูปที่ 1-5: patterns ที่ใช้ใน solution space — แต่ละ subdomain ถูกแก้ด้วย bounded context และ model-driven design โดยมี context map เชื่อมโยง

หัวใจ​ของ​บท​นี้

DDD คือ​ชุด​ของ patterns, principles และ practices สำหรับ​จัดการ​ความ​ซับซ้อน โดย​แบ่ง​สนาม​ออก​เป็น​สอง​พื้นที่: problem space (กลั่น domain ให้​เห็น​ว่า​อะไร​สำคัญ) และ solution space (สร้าง model ที่​ดูแล​รักษา​ได้) จำหลัก​ง่ายๆ ว่า strategic patterns ใช้ได้​กับ​เกือบ​ทุก app ส่วน tactical patterns จะ​คุ้ม​ค่า​ก็​ต่อ​เมื่อ model มี​ตรรกะ​ธุรกิจ​ที่​เข้มข้น​พอ


เหนือ​กว่า​ตัว pattern คือ practices และ​หลักการ​ที่​มัก​ถูก​มอง​ข้าม​เพราะ​คน​ไป​โฟกัส​ที่ tactical pattern มาก​เกิน​ไป:

  • โฟกัส​ที่ Core DomainCore Domainsubdomain ที่​สำคัญ​และ​สร้าง​ความ​ได้​เปรียบ​ใน​การ​แข่งขัน​มาก​ที่สุด เป็น​เหตุผล​ที่​เรา​ต้อง​สร้าง​ซอฟต์แวร์​เอง​แทน​การ​ซื้อ ควร​ทุ่ม​ทีม​เก่ง​ที่สุด​ลง​ตรง​นี้Strategic Design — ทุ่ม​แรง​มาก​ที่สุด​กับ​ส่วน​ที่​สร้าง​ความ​ได้​เปรียบ​ใน​การ​แข่งขัน
  • เรียนรู้​ผ่าน​การ​ทำงาน​ร่วม​กัน — ถ้า​ไม่มี domain expert เข้า​มา​ร่วม​อย่าง​จริงจัง การ​ถ่ายทอด​ความ​รู้​ก็​ไม่มี​ทาง​เกิด​ขึ้น
  • สร้าง model ผ่าน​การ​สำรวจ​และ​ทดลอง — Evans บอกว่า “สำหรับ​ทุก​การ​ออกแบบ​ที่​ดี ต้อง​มี​การ​ออกแบบ​ที่​แย่​อย่าง​น้อย​สาม​แบบ​มา​ก่อน” อย่า​หยุด​ที่ model แรก​ที่​ใช้ได้
  • การ​สื่อสาร — สิ่ง​สำคัญ​ที่สุด​เพียง​สิ่ง​เดียว​ของ DDD คือ​การ​สร้าง UL ถ้า​ไม่มี​ภาษา​กลาง การ​ทำงาน​ร่วม​กัน​เพื่อ​แก้​ปัญหา​ก็​เกิด​ไม่​ได้
  • เข้าใจ​ขอบเขต​การ​ใช้งาน​ของ model — แต่ละ model มี​ความหมาย​เฉพาะ​ภายใน bounded context ของ​มัน
  • วิวัฒน์ model ตลอด​เวลา — business case ใหม่ๆ อาจ​ทำให้ model เดิม​พัง​หรือ​ต้อง​ทำให้​แนวคิด​ชัดเจน​ขึ้น
🚢 ตัวอย่าง​ที่​จะ​เดิน​ไป​ด้วย​กัน — ระบบ​ขนส่ง​สินค้า

ตลอด​คอร์ส​นี้​เรา​จะ​ใช้​ตัวอย่าง ระบบ​ขนส่ง​ตู้ container (Cargo Shipping) เดียว​กับ​ตำรา​ของ Evans บริษัท​ขนส่ง​ต้องการ​ระบบ​ที่ “จอง” การ​ขนส่ง​จาก​ต้นทาง​ถึง​ปลายทาง​ตาม​กำหนด วาง “แผน​เดินทาง” ผ่าน​ท่าเรือ​และ​เรือ​หลาย​ลำ และ “ติดตาม​สถานะ” ของ​สินค้า ฟัง​ดูเหมือน​งาน CRUD ทั่วไป แต่​กฎ​ธุรกิจ​ซับซ้อน​กว่า​ที่​คิดมาก — นี่แหละ​คือ​สนาม​ที่ DDD ได้​เปล่ง​ประกาย

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

อีก​ตัวอย่าง​ที่​คุ้น​เคย​กว่า​คือ e-commerce เช่น “คำ​สั่ง​ซื้อ (Order)” ที่​มี core domain (กระบวนการ​สั่ง​ซื้อ/ราคา) แยก​จาก generic subdomain (login, การ​แจ้ง​เตือน) เรา​จะ​เทียบเคียง​สอง​โลก​นี้​ไป​ตลอด​ทั้ง​คอร์ส เพื่อ​ให้​เห็น​ภาพ​ชัด​ยิ่ง​ขึ้น


สาม​ความ​เชื่อ​ผิดๆ
  1. “tactical patterns คือ​หัวใจ​ของ DDD” — ผิด คุณ implement DDD ได้​โดย​ไม่​ต้อง​มี rich domain modelRich Domain Modelmodel domain ที่ “รวย​พฤติกรรม” — object ที่​เก็บ​ทั้ง​ข้อมูล​และ business logic ไว้​ด้วย​กัน เป็น​คู่​ตรง​ข้าม​ของ Anemic Domain Model (ที่​มี​แต่ getter/setter แล้ว​ผลัก logic ไป​ไว้​ที่​อื่น) tactical patterns ของ DDD จะ​คุ้ม​ค่า​ก็​ต่อ​เมื่อ model “รวย” พอ​เช่น​นี้Tactical Design หรือ repositoryRepositoryตัว​ที่​ทำให้​เรา​เข้าถึง Aggregate ราวกับ​เป็น collection ใน​หน่วย​ความ​จำ ซ่อน​รายละเอียด​ฐาน​ข้อมูล มี1 repository ต่อ1 Aggregate RootTactical Design ด้วย​ซ้ำ DDD เป็น​เรื่อง​ของ​การ​แก้​ปัญหา​ผ่าน​การ​ร่วมมือ​มากกว่า​ตัว design pattern
  2. “DDD คือ framework” — ผิด DDD ไม่​ต้อง​ใช้ framework หรือ​ฐาน​ข้อมูล​พิเศษ model ใน code ยึด​หลัก POCO/POJO (ปลอด​จาก infrastructure) และ​เป็น architecturally agnostic — แต่ละ bounded context เลือก​สถาปัตยกรรม​ของ​ตัวเอง​ได้
  3. “DDD คือ​กระสุน​เงิน (silver bullet)” — ผิด DDD ใช้​แรง​มาก ต้อง​มี​ฝ่าย​ธุรกิจ​ที่​ร่วมมือ​และ​ทีม​ที่​ทุ่มเท จึง ไม่​คุ้ม กับ domain ง่ายๆ อย่าง block ทั่วไป​ที่​แทบ​ไม่มี​ตรรกะ​ธุรกิจ

DDD ไม่ใช่ pattern language แต่​เป็น ปรัชญา​ที่​มุ่ง​ส่ง​มอบ​คุณค่า​ผ่าน​การ​สื่อสาร​และ​ความ​ร่วมมือ โดย​มี​ภาษา​และ domain เป็น​ศูนย์กลาง ส่วน​ซอฟต์แวร์​เป็น​เพียง “ผลพลอยได้” (artifact) ของ​กระบวนการ​นั้น


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

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

  • Strategic Design — ขยาย​ความ strategic patterns ที่​บท​นี้​แนะนำ (subdomain, model, ubiquitous language, bounded context)
  • Tactical Design — ภาพ​รวม​ของ tactical patterns/building blocks ที่​บท​นี้​เกริ่น​ไว้​ก่อน​ลง​รายละเอียด​ใน Part III
  • Subdomain — อธิบาย​การกลั่น domain ใหญ่​ออก​เป็น subdomain และ​การ​หา core domain ตาม​ที่​บท​นี้​กล่าว​ถึง
  • Bounded Context — ขยาย​ความ​เรื่อง​ขอบเขต​ที่​ล้อม​แต่ละ model ไว้​ไม่​ให้​ปน​กัน​จน​กลาย​เป็น BBoM
  • Ubiquitous Language — รายละเอียด​ของ​ภาษา​กลาง​ที่​บท​นี้​ชี้​ว่า​เป็น​หัวใจ​ของ​การ​สื่อสาร​ใน DDD

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

ข้อ 1 / 4

ตามหนังสือ อะไรคือสาเหตุหลักที่ทำให้ซอฟต์แวร์ซับซ้อนจนกลายเป็น Big Ball of Mud?