Domain-Driven Design یعنی «طراحی نرمافزار با محوریت دامنه (Domain)».
به زبان ساده، DDD میگوید:
طراحی و معماری نرمافزار باید بر اساس منطق واقعی کسبوکار شکل بگیرد، نه صرفاً تکنولوژی یا ساختار دیتابیس.
دامنه همان دنیای مسئله است — یعنی فضای مفهومی که کسبوکار در آن کار میکند.
مثلاً:
برای یک شرکت بانکی، دامنه یعنی: حساب، تراکنش، کاربر، اعتبار، سود.
برای یک پلتفرم سفارش غذا، دامنه یعنی: مشتری، رستوران، منو، سفارش، پرداخت.
هرچه دانش و درک تیم از دامنه دقیقتر باشد، مدل نرمافزاری که میسازد، به واقعیت نزدیکتر است و احتمال شکست سیستم کمتر میشود.
مدل دامنه نمایش مفهومی از واقعیت کسبوکار است — شامل موجودیتها (Entities)، مقدارها (Value Objects)، قوانین، رفتارها و ارتباطات.
مدل فقط دیاگرام یا دیتاستراکچر نیست؛ یک زبان مشترک بین توسعهدهندگان و کارشناسان دامنه است.
📘 نکتهٔ کلیدی:
DDD میگوید که مدل دامنه باید:
از دل گفتوگو با متخصصان کسبوکار بیرون بیاید.
در کد منعکس شود — نه فقط روی وایتبرد.
زبان فراگیر یعنی واژگان مشترکی که بین تیم فنی و بیزنسی یکسان معنا دارند و در کل پروژه، از تحلیل تا کدنویسی، استفاده میشوند.
مثلاً در سیستم بانکی اگر واژهی “Account” در مستندات، کد و گفتگو همه یک معنی دقیق داشته باشد، تیم میتواند هماهنگ فکر کند و طراحی واضحتری بسازد.
📌 اگر زبان تیم دوگانه باشد (مثلاً کارشناس بگوید «کاربر ویژه» ولی برنامهنویس در کد بنویسد VIPUser بدون درک تفاوتش)، مدل از واقعیت جدا میشود.
یکی از مهمترین مفاهیم فصل ۱ است.
Bounded Context یعنی:
هر مدل دامنه فقط در یک «زمینهٔ مشخص» معتبر است.
به عبارت دیگر، کل سیستم را نباید با یک مدل واحد ساخت، چون هر بخش از کسبوکار قواعد خودش را دارد.
📍 مثال:
در یک شرکت تجارت الکترونیک:
دامنهی «فروش» (Sales) با مفاهیم سفارش و تخفیف سروکار دارد.
دامنهی «انبارداری» (Inventory) با موجودی و تحویل کالا کار میکند.
دامنهی «صورتحساب» (Billing) با پرداخت و فاکتور سر و کار دارد.
هرکدام از اینها یک Bounded Context است.
درون هر Context، «زبان فراگیر»، «قوانین» و «مدلها» خاص خودشان را دارند.
ولی ارتباط بین Contextها از طریق integration یا contractهای مشخص انجام میشود (مثلاً API یا Event).
وقتی تیم سعی کند برای کل سیستم فقط یک مدل سراسری بسازد، در عمل مدل بیشازحد پیچیده میشود و معنی واژهها در بخشهای مختلف متناقض میگردد.
مثلاً کلمهی “Customer” ممکن است در بخش فروش یعنی «خریدار»، ولی در بخش پشتیبانی یعنی «هرکسی که تماس گرفته».
Bounded Context جلوی این آشفتگی را میگیرد، چون میگوید:
هر واژه و مفهوم فقط در مرز مشخص خودش معنا دارد.
چون پروژههای نرمافزاری معمولاً در سه دامنه شکست میخورند:
سوءتفاهم بین بیزنس و توسعهدهنده
پیچیدگی بیدلیل در مدل
نبود مرز مشخص بین زیرسیستمها
DDD با:
تمرکز روی دامنه (Domain)
ساخت زبان مشترک (Ubiquitous Language)
تعریف مرزها (Bounded Context)
به تیم کمک میکند سیستمهایی بسازد که هم قابل فهم و هم قابل گسترش باشند.

تفاوت بین Domain و Model را توضیح دهی.
در گفتگو با بیزنس از Ubiquitous Language استفاده کنی.
سیستم را به چند Bounded Context بشکنی.
بفهمی چرا DDD دربارهی «تکنولوژی» نیست بلکه دربارهی «تفکر دامنهمحور» است.