Domain-Driven Design (DDD) چیست؟
رویکردی برای طراحی نرمافزار که دامنه کسبوکار و زبان مشترک بین توسعهدهنده و متخصص کسبوکار (Ubiquitous Language) را مرکز طراحی قرار میدهد.
چرا مهم است؟
وقتی منطق کسبوکار پیچیده است، مدلسازی دقیق دامنه (نه فقط جدولهای دیتابیس) از بروز باگهای ناشی از سوءتفاهم بین تیم فنی و کسبوکار جلوگیری میکند.
مفاهیم کلیدی
- Ubiquitous Language: واژگان مشترکی که تیم فنی و متخصص کسبوکار هر دو دقیقاً یک معنی از آن میفهمند و همان واژگان مستقیم در نام کلاسها/متدها بهکار میرود.
- Entity: شیئی که هویت (Id) دارد و در طول زمان تغییر میکند (مثل
Order). - Value Object: شیئی بدون هویت مستقل که فقط با مقدارش تعریف میشود (مثل
MoneyیاAddress) — دو Value Object با مقدار یکسان برابرند. - Aggregate / Aggregate Root: مجموعهای از Entity/Value Object که بهعنوان یک واحد Consistency با هم تغییر میکنند؛ فقط از طریق Aggregate Root قابل تغییرند.
- Bounded Context: مرز مشخصی که داخل آن یک مدل و یک معنی واحد از هر واژه معتبر است (مثلاً «Customer» در Bounded Context فروش معنایی متفاوت از «Customer» در Bounded Context پشتیبانی دارد).
مثال Aggregate Root
public class Order // Aggregate Root
{
private readonly List<OrderLine> _lines = new();
public IReadOnlyList<OrderLine> Lines => _lines;
public void AddLine(Product product, int quantity)
{
if (quantity <= 0) throw new InvalidOperationException("تعداد باید مثبت باشد.");
_lines.Add(new OrderLine(product, quantity)); // Invariant داخل Aggregate رعایت میشود
}
}
اشتباه رایج
❌ Anemic Domain Model: کلاسهای Entity که فقط شامل Property با Get/Set خالیاند و تمام منطق کسبوکار (Validation، قوانین) در Serviceهای بیرونی نوشته میشود. در DDD رفتار و قوانین باید داخل خود Entity/Aggregate باشد، نه پخششده در Serviceهای بیرونی.
خلاصه
DDD طراحی نرمافزار را حول دامنه کسبوکار و زبان مشترک تیم (Ubiquitous Language) میچیند. مفاهیم کلیدیاش Entity، Value Object، Aggregate Root و Bounded Context هستند. اشتباه رایج، Anemic Domain Model است — کلاسهایی بدون رفتار که تمام منطق در Serviceهای بیرونی نوشته شده.
