ویرگول
ورودثبت نام
Mohsen Farokhi - محسن فرخی
Mohsen Farokhi - محسن فرخیSenior .NET Developer
Mohsen Farokhi - محسن فرخی
Mohsen Farokhi - محسن فرخی
خواندن ۵ دقیقه·۳ سال پیش

Domain Driven Design - بخش سوم

Tactical Design و Model-Driven Development

در بخش‌های قبل، به مباحث Strategic Design پرداختیم و اهمیت ارتباط مستمر با Domain Expertها برای دستیابی به دانش دامنه و ایجاد Ubiquitous Language را بررسی کردیم. همچنین، نحوه شناسایی دامنه‌ها، مرزهای آن‌ها و ارزش‌گذاری دامنه‌ها را مورد بحث قرار دادیم. در این بخش، به مباحث Tactical Design و Model-Driven Development می‌پردازیم.

Domain Driven Design
Domain Driven Design


مفهوم Tactical Design در Domain-Driven Design

در مباحث Tactical Design، پس از شناسایی Subdomainها و Bounded Contextها (BC)، به بررسی ساختار این BCها می‌پردازیم. در DDD، اصول و روش‌هایی وجود دارد که به ما کمک می‌کند تا دامنه را به‌ صورت مؤثر مدل‌سازی کنیم. این اصول در قالب Building Blockها یا اجزای سازنده‌ی مدل دامنه ارائه می‌شوند.

در تصویر زیر، یک state diagram را می بینیم که از لحظه بوجود آمدن یک domain object تا از بین رفتن آن را مدل می کند.

این کاری است که بصورت نرمال انجام می دهیم و احتمالا، develop در این حوزه را تجربه کرده ایم.

Domain Model

مفهوم Domain Model یک مدل نرم‌افزاری است که بر اساس Problem Domain ایجاد می‌شود. این مدل قرار است نیازمندی‌های موجود در دامنه را برآورده کند. در زبان‌های شیءگرا، این مدل معمولاً به‌صورت کلاس‌های مختلف پیاده‌سازی می‌شود. به مجموعه‌ی این کلاس‌ها که با هم کار می‌کنند، Domain Model گفته می‌شود.


در راستای مدل کردن در DDD، با اجزای سازنده domain model یا Building Blockها روبرو می شویم.

Entity

اولین جزء سازنده‌ی مدل دامنه، Entity است. Entityها اجزایی از مدل دامنه هستند که از طریق یک Identifier شناسایی و ردیابی می‌شوند. این شناسه به ما امکان می‌دهد تا به Entityها اشاره کنیم و آن‌ها را در طول چرخه‌ی حیاتشان دنبال کنیم.

Value Object

در مقابل Entityها، Value Objectها قرار دارند. Value Objectها اجزایی از مدل دامنه هستند که فاقد شناسه‌ی منحصر به فرد بوده و از طریق مقادیرشان شناسایی می‌شوند. به عنوان مثال، یک شیء به نام Money که دارای ویژگی‌های Amount و Currency است، یک Value Object محسوب می‌شود. اگر دو شیء Money با مقادیر یکسان داشته باشیم، این دو شیء از نظر ما برابر هستند.


ویژگی های value object

  1. Identity-Less: به این معنا که Value Objectها فاقد شناسه‌ی منحصر به فرد هستند.
  2. Attribute-Based Equality: مقایسه‌ی دو Value Object بر اساس مقادیر آن‌ها انجام می‌شود.
  3. Immutable: به این صورت که Value Objectها معمولاً تغییرناپذیر هستند. برای تغییر آن‌ها، یک شیء جدید ایجاد می‌شود.
  4. Combinable: برخی Value Objectها می‌توانند با هم ترکیب شوند و یک شیء جدید ایجاد کنند.
  5. Self-Validation: به این معنی که Value Objectها خود را اعتبارسنجی می‌کنند و نمی‌توان آن‌ها را در حالت نادرست قرار داد.

Invariant

در مدل‌سازی دامنه، Invariantها شرایطی هستند که باید همیشه برقرار باشند. نقض این شرایط می‌تواند منجر به مشکلات جدی در مدل کسب‌وکار شود. به عنوان مثال، در یک سیستم حراجی، StartingPrice باید بزرگ‌تر از صفر باشد و Bidهای جدید باید از WinningBid بزرگ‌تر باشند.

Aggregate

مفهوم Aggregate یک الگوی طراحی در DDD است که به ما کمک می‌کند تا گراف‌های بزرگ از اشیاء را به اجزای مستقل و کوچک‌تر تقسیم کنیم. هر Aggregate شامل یک Aggregate Root است که به عنوان نماینده‌ی آن Aggregate عمل می‌کند.

قوانین Aggregate

  1. Aggregate Root باید یک Entity باشد: Aggregate Root باید دارای شناسه‌ی منحصر به فرد باشد.
  2. ارجاع به Aggregate Root: تنها می‌توانیم به Aggregate Root از خارج ارجاع دهیم و نمی‌توانیم به اجزای داخلی آن اشاره کنیم.
  3. Global Identity: Aggregate Root باید دارای شناسه‌ی منحصر به فرد در سطح global باشد.
  4. Transaction Boundary: هر Aggregate به عنوان یک مرز تراکنش در نظر گرفته می‌شود.
  5. حذف Aggregate: حذف یک Aggregate باعث حذف تمام اجزای آن می‌شود.
  6. Commit Aggregate: هنگام commit کردن یک Aggregate، تمام Invariantها باید برقرار باشند.

نتیجه‌گیری

در این بخش، به مباحث Tactical Design در Domain-Driven Design پرداختیم و اجزای سازنده‌ی مدل دامنه مانند Entity، Value Object، Invariant و Aggregate را بررسی کردیم. این مفاهیم به ما کمک می‌کنند تا مدل‌های دامنه‌ای ایجاد کنیم که هم از نظر ساختاری منسجم باشند و هم نیازمندی‌های کسب‌وکار را به‌طور کامل پوشش دهند. در بخش‌های آینده، به بررسی بیشتر این مفاهیم و روش‌های پیاده‌سازی آن‌ها خواهیم پرداخت.


به طور خلاصه، در حوزه‌ی Tactical Design، تمرکز از "فضای مسئله" به "فضای راه‌حل" منتقل می‌شود؛ یعنی وارد بخش فنی‌تری از مدل‌سازی دامنه می‌شویم که در آن ابزارها و الگوهایی برای پیاده‌سازی دقیق‌تر مفاهیم کسب‌وکار فراهم شده‌اند.

در این رویکرد، مفاهیم کلیدی و بنیادینی وجود دارد که عبارتند از:

✅ Entity

موجودیتی است با هویت یکتا که در طول زمان می‌تواند تغییر کند اما همچنان از طریق شناسه‌اش قابل ردیابی است. هویت هر Entity معمولاً با یک کلید یکتا مانند Id مشخص می‌شود.

✅ Value Object

در مقابل، Value Objectها فاقد هویت مستقل هستند و بر اساس مقادیرشان شناسایی می‌شوند. آن‌ها اغلب:

  • Immutable هستند (پس از ساخت، مقادیرشان قابل تغییر نیست)
  • دارای قابلیت Self-validation می‌باشند (خودشان اعتبارسنجی می‌کنند که در حالت معتبر ساخته شوند)

✅ Aggregate و Aggregate Root

هر Aggregate مجموعه‌ای از Entityها و Value Objectهاست که به‌عنوان یک واحد منطقی و یکپارچه در نظر گرفته می‌شود.
در هر Aggregate، باید یک Aggregate Root وجود داشته باشد که از نوع Entity است و به‌عنوان نقطه‌ی ورود اصلی برای دسترسی و مدیریت کل Aggregate عمل می‌کند.

ویژگی‌های مهم Aggregate شامل:

  • مرز تراکنشی (Transactional Boundary): تمام تغییرات باید از طریق Aggregate Root و در یک محدوده‌ی تراکنشی انجام شوند.
  • Invariants: شرایط و قواعدی که باید در سرتاسر عمر Aggregate برقرار باشند.
  • وابستگی ضعیف به سایر Aggregateها: ارتباط میان Aggregateها فقط از طریق شناسه (Id) انجام می‌شود، نه نگهداری مستقیم مرجع به Entityهای دیگر.
  • حذف یکپارچه: در صورتی که Aggregate Root حذف شود، تمام اجزای داخلی آن نیز حذف خواهند شد.
domain driven designdomain modelvalue object
۳
۰
Mohsen Farokhi - محسن فرخی
Mohsen Farokhi - محسن فرخی
Senior .NET Developer
شاید از این پست‌ها خوشتان بیاید