Domain-Driven Design คืออะไร (แบบไม่ใช่ตำรา)

domain driven design

ตอนที่ 1 ของซีรีส์ Domain-Driven Design ฉบับคนทำแอป & เกมจริง

ถ้าคุณเป็น developer ที่เขียนระบบมานานพอ คุณน่าจะเคยเจอสถานการณ์ประมาณนี้:

  • โค้ดเขียนถูกหมด แต่ระบบแก้ยาก
  • เพิ่ม feature นิดเดียว กระทบไปทั้งระบบ
  • business rule กระจัดกระจายอยู่ใน controller, service, widget, หรือแม้แต่ SQL
  • ไม่มีใครกล้าแตะโค้ดเก่า เพราะกลัวพัง

คำถามคือ ปัญหานี้เกิดจากภาษา หรือ framework จริงไหม?

คำตอบของ Domain-Driven Design (DDD) คือ: ไม่ใช่

ปัญหาหลักคือ เราออกแบบระบบจากมุมมองที่ผิดตั้งแต่ต้น


Domain-Driven Design ไม่ใช่ Architecture

หลายคนพอได้ยินคำว่า DDD จะนึกถึงสิ่งเหล่านี้ทันที:

  • Clean Architecture
  • Hexagonal Architecture
  • Folder ซับซ้อนหลายชั้น
  • Interface เต็มไปหมด

แต่จริง ๆ แล้ว DDD ไม่ใช่ architecture และไม่ใช่ pattern ชุดหนึ่งที่ต้องทำตาม

DDD คือ แนวคิดในการมองและออกแบบระบบ โดยให้ Domain (กฎของธุรกิจ) เป็นศูนย์กลาง

Architecture เป็นเพียง เครื่องมือ ที่ช่วยให้แนวคิดนี้อยู่รอดในโค้ด


แล้ว “Domain” คืออะไรกันแน่?

Domain ไม่ใช่ database

Domain ไม่ใช่หน้าจอ UI

Domain คือ:

ความรู้ กฎ เงื่อนไข และความหมายของสิ่งที่ระบบนี้ถูกสร้างขึ้นมาเพื่อจัดการ

ตัวอย่าง:

  • ระบบพนักงาน → กฎการขอ shift, การอนุมัติ, เงื่อนไขเวลา
  • ระบบจอง → เงื่อนไขการยกเลิก, การคืนเงิน, การทับซ้อนของเวลา

สิ่งเหล่านี้ ไม่ควรขึ้นกับ UI, database หรือ framework ใด ๆ


ปัญหาของระบบแบบ Data‑Driven / UI‑Driven

ระบบส่วนใหญ่เริ่มจากคำถามแบบนี้:

  • มีหน้าจออะไรบ้าง?
  • ต้องมีตารางอะไร?
  • API endpoint หน้าตาเป็นยังไง?

แล้วโค้ดก็มักจะออกมาในรูปแบบ:

Controller
  → Service
    → Repository
      → Database

ดูเหมือนจะเป็นระเบียบ แต่ปัญหาคือ:

  • Business rule ถูกยัดไว้ใน service แบบปนกันหมด
  • Entity เป็นแค่ถุงข้อมูล (Anemic Model)
  • ชื่อ class/field สื่อความหมายผิดจากธุรกิจจริง

ผลลัพธ์คือ:

ระบบ “ทำงานได้” แต่ไม่สะท้อนความจริงของ domain


DDD เปลี่ยนคำถามตั้งต้น

แทนที่จะถามว่า:

“จะเก็บข้อมูลยังไงดี?”

DDD จะเริ่มจากคำถามว่า:

“ในโลกจริง สิ่งนี้ ควรทำอะไรได้ และ อะไรที่ห้ามเกิดขึ้น

เช่น:

  • พนักงานขึ้นกะได้กี่ครั้งต่อวัน?
  • คำขอถูกแก้ไขได้เมื่อไหร่?
  • ใครมีสิทธิ์อนุมัติ?

คำถามเหล่านี้คือ Domain Question ไม่ใช่ Technical Question


หัวใจของ DDD ในประโยคเดียว

Business Rule ต้องอยู่ใน Domain และ Domain ต้องไม่พึ่งพาโลกภายนอก

เมื่อทำได้:

  • โค้ดจะอ่านเหมือนเอกสารอธิบายธุรกิจ
  • การเปลี่ยนกฎไม่กระทบทั้งระบบ
  • ระบบโตได้โดยไม่เละ

DDD ไม่ได้ทำให้เขียนโค้ดน้อยลง

ความจริงที่ต้องยอมรับคือ:

  • โค้ดจะเยอะขึ้น
  • ต้องคิดมากขึ้น
  • ช่วงแรกจะช้าลง

แต่สิ่งที่ได้คือ:

  • ความชัดเจน
  • ความมั่นใจในการแก้ระบบ
  • ระบบที่อธิบายตัวเองได้

DDD คือการ ลงทุนระยะยาว ไม่ใช่ shortcut


ตอนต่อไป

ตอนที่ 2: จาก Imperative → Declarative → Domain Thinking

เราจะเริ่มดูว่า mindset แบบเดิมของการเขียนโค้ด ทำให้ domain หายไปจากระบบได้ยังไง และจะเปลี่ยนมุมมองยังไงให้โค้ดสะท้อนความจริงมากขึ้น


ถ้าเราเคยรู้สึกว่า “โค้ดเราไม่ได้ผิด แต่ระบบมันดูไม่ใช่”

DDD น่าจะเป็นสิ่งที่คุณกำลังมองหาอยู่