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

مفهوم 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
Invariant
در مدلسازی دامنه، Invariantها شرایطی هستند که باید همیشه برقرار باشند. نقض این شرایط میتواند منجر به مشکلات جدی در مدل کسبوکار شود. به عنوان مثال، در یک سیستم حراجی، StartingPrice باید بزرگتر از صفر باشد و Bidهای جدید باید از WinningBid بزرگتر باشند.
Aggregate
مفهوم Aggregate یک الگوی طراحی در DDD است که به ما کمک میکند تا گرافهای بزرگ از اشیاء را به اجزای مستقل و کوچکتر تقسیم کنیم. هر Aggregate شامل یک Aggregate Root است که به عنوان نمایندهی آن Aggregate عمل میکند.

قوانین Aggregate
نتیجهگیری
در این بخش، به مباحث Tactical Design در Domain-Driven Design پرداختیم و اجزای سازندهی مدل دامنه مانند Entity، Value Object، Invariant و Aggregate را بررسی کردیم. این مفاهیم به ما کمک میکنند تا مدلهای دامنهای ایجاد کنیم که هم از نظر ساختاری منسجم باشند و هم نیازمندیهای کسبوکار را بهطور کامل پوشش دهند. در بخشهای آینده، به بررسی بیشتر این مفاهیم و روشهای پیادهسازی آنها خواهیم پرداخت.
به طور خلاصه، در حوزهی Tactical Design، تمرکز از "فضای مسئله" به "فضای راهحل" منتقل میشود؛ یعنی وارد بخش فنیتری از مدلسازی دامنه میشویم که در آن ابزارها و الگوهایی برای پیادهسازی دقیقتر مفاهیم کسبوکار فراهم شدهاند.
در این رویکرد، مفاهیم کلیدی و بنیادینی وجود دارد که عبارتند از:
✅ Entity
موجودیتی است با هویت یکتا که در طول زمان میتواند تغییر کند اما همچنان از طریق شناسهاش قابل ردیابی است. هویت هر Entity معمولاً با یک کلید یکتا مانند Id مشخص میشود.
✅ Value Object
در مقابل، Value Objectها فاقد هویت مستقل هستند و بر اساس مقادیرشان شناسایی میشوند. آنها اغلب:
✅ Aggregate و Aggregate Root
هر Aggregate مجموعهای از Entityها و Value Objectهاست که بهعنوان یک واحد منطقی و یکپارچه در نظر گرفته میشود.
در هر Aggregate، باید یک Aggregate Root وجود داشته باشد که از نوع Entity است و بهعنوان نقطهی ورود اصلی برای دسترسی و مدیریت کل Aggregate عمل میکند.
ویژگیهای مهم Aggregate شامل: