Domain Driven Design یا به اختصار DDD مبحثی است که در سال های اخیر مورد توجه جامعه ی نرم افزاری قرار گرفته و رویکرد بسیاری از شرکت های نرم افزاری را برای تحلیل و توسعه ی نرم افزارها مورد تاثیر قرار داده است. این مبحث اولین بار در سال ۲۰۰۳ توسط آقای Eric Evans در کتاب Domain Driven Design مطرح گردید.
Domain Driven Design چیست؟
DDD رویکردی برای تولید و توسعه ی نرم افزارهای بزرگ با فرآیندها و قوانین زیاد، پیچیده و در حال تغییر می باشد. اصطلاح Domain به حوزه و دامنه ی اصلی فعالیت نرم افزار اطلاق می شود که نرم افزار برای پیاده سازی آن توسعه می یابد. هسته ی اصلی DDD مجموعه ای از مفاهیم و تکنیک هاست که برای تحلیل Domain و ساخت یک مدل از روی آن (Domain Model) به کار برده می شود. تمرکز و توجه اصلی این رویکرد بر روی توسعه ی این مدل می باشد. تحلیل و طراحی Domain Model اختصاصا به منظور تولید نرم افزار در ابعاد Enterprise و با فرآیند های پیچیده و زیاد مناسب می باشد. Domain Model طراحی شده با جزئیات دقیق بوده و مفاهیم و قوانین (Business Rules) در آن پیاده سازی میشوند.
DDD بر زوایای دیگری از فرآیند توسعه ی نرم افزار نیز تاثیر گذار است. برای مثال تاکید زیادی در ارتباط دو طرفه ی تیم توسعه ی نرم افزار و کاربران متخصص Domain (برای مثال انبارداران در سیستم انبار) دارد. از آنجا که ممکن است در این ارتباط دو طرفه، تیم توسعه ی نرم افزار در فهمیدن برخی مفاهیم و مسائل دچار اشتباه و دوگانگی شوند لذا ایجاد زبان یکسان بین دو تیم (Ubiquitous Language) در مورد مفاهیم Domain امری الزامی است. DDD همچنین راهکارهایی برای تقسیم نرم افزار به بخش های جدا و مستقل (مفهوم Bounded Context) و همچنین ارتباط این بخش ها با یکدیگر ارائه میکند. این امر سبب می شود تا فرآیند توسعه ی نرم افزار به صورت موازی بین چند تیم انجام شده و همچنین معماران سیستم را قادر می سازد تا از معماری ها و تکنولوژی های مختلف در بخش های مختلف استفاده نمایند.
همانطور که مطرح شد، رویکرد Domain-Driven برای نرم افزارهای بزرگ و پیچیده مناسب می باشد. لذا استفاده از آن در پروژه های کوچک و ساده و یا پروژه هایی که صرفا نیاز به ذخیره و خواندن اطلاعات دارند و Business خاصی ندارند، ممکن است تنها زمان و هزینه ی پروژه را افزایش داده و مزیتی خاصی به همراه نداشته باشد.
مفهوم Domain Model
در اغلب پروژه های نرم افزاری، دغدغه ی اصلی تیم توسعه، طراحی دقیق و درست فرآیند ها و قوانین نرم افزار می باشد. زمان و هزینه ای که صرف تحلیل، پیاده سازی و تست فرآیندها و Business نرم افزار می شود بسیار بیشتر از زمان و هزینه ای است که صرف موارد فنی و زیر ساخت نرم افزاری می شود. تیم توسعه ی نرم افزار می تواند با تمرکز بر روی Domain و طراحی مدل (Domain Model) از روی آن و همچنین با رعایت مفاهیم و تکنیک های DDD از پیاده سازی درست این فرآیندها اطمینان پیدا می کنند.
Domain Model مدلی انتزاعی از دامنه ی فعالیت نرم افزار است که توسط تیم توسعه ی نرم افزار در قالب یک مدل شی گراء طراحی می شود. این مدل ممکن است در طول زمان و با تغییر فرآیند ها تغییر یافته و تکمیل شود. Domain Model تنها یک ساختار داده ای نبوده و مجموعه ای از داده ها، رفتارها و قوانین (Business Rule) می باشد. از آنجا که مهم ترین چیز در طراحی Domain Model اطمینان از صحت فرآیند ها و Business نرم افزار می باشد، لذا هنگام طراحی از پرداختن به دغدغه ها و نکات فنی زیر ساختی و دیتابیسی خودداری می شود (مفهوم Persistence Ignorance).
اکثر مباحث مطرح شده در DDD در راستای تحلیل و توسعه ی Domain Model می باشد که در قالب مفاهیمی مانند Entity، Aggregates، Value Object و … پیاده سازی می شود. در مطالب بعدی به بررسی این مفاهیم و تکنیک ها خواهیم پرداخت.