معرفی طراحی دامنه محور (Domain Driven Design)

طراحی دامنه محور ، در واقع درک نیازهای واقعی کسب و کار مشتری است. ما باید درباره دامنه های مختلف مانند بانکداری ، مخابرات، زنجیره تامین، مراقبت های بهداشتی و... دانش داشته باشیم . بنابراین در اینجا دامنه به معنی دانش کسب و کار درباره صنعت خاص است. به طور مشابه طراحی دامنه محور تمرکز بیشتری نسبت به نیازهای کسب و کار دارد نه به تکنولوژی .

معرفی طراحی دامنه محور (Domain Driven Design)

طراحی دامنه محور ، در واقع درک نیازهای واقعی کسب و کار مشتری است. ما باید درباره دامنه های مختلف مانند بانکداری ، مخابرات، زنجیره تامین، مراقبت های بهداشتی و... دانش داشته باشیم . بنابراین در اینجا دامنه به معنی دانش کسب و کار درباره صنعت خاص است. به طور مشابه طراحی دامنه محور تمرکز بیشتری نسبت به نیازهای کسب و کار دارد نه به تکنولوژی .

برای شروع نوشتن یک سیستم ، باید بدانیم که مشتری چه چیزی را مد نظر دارد ، در حین فاز اولیه هیچگاه  درباره برنامه نویسی و معماری آن فکر نمیکنید. هدف اصلی شما درک تمام شرایط کسب و کار مشتری و چگونگی مدل دامنه مورد نیاز او است.

بنابراین چیزی که ما به دنبال آن هستیم بحث با مشتری درباره نیازهای کسب و کار او است . طراحی دامنه محور صرفا بر اساس این فرضیات برای ترسیم کردن نیازهای کسب و کار در مدل دامنه است.

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

برنامه های معمولی از معماری زیر پیروی میکنند. معماری زیر همانطور که انتظار می رود کار میکند اما زمانی که به سیستم های شرکتی بزرگ وارد شود دچار اشکالات زیادی می شود.

معماری بالا زمانی که سیستم برای یک برنامه شرکتی بزرگ استفاده می شود با شکست مواجه می شود. نکات زیر ملاحظاتی برای طراحی دامنه است :

   . شما یک سیستم پیچیده برای توسعه دارید همراه با سیستم های خارجی جداگانه یا سیستم ارث بری ،تیم بزرگ یا چند تیم برنامه نویسی.

   . سیستم شما کارایی اجرای مشابهی در جاهای مختلف دارد .

   . برای موارد مشابه بیش از یک شیء دارید.

   . اشیائی دارید که دارای خواصی هستند که در واقع صفت آن شیء محسوب نمی شوند.

   . در میان موارد مرتبط رابطه ای وجود ندارد یا بسیار ضعیف است.

   . با توجه به اشیاء امکان ندارد فهمید که کل برنامه در چه مورد است.

   . کجا نیازهای کسب و کار با پیچیدگی ضروری تغییر میکنند.

   . کد لایه های سرویس روز به روز رشد میکنند .  

   . منطق کاری از دامنه و چارچوب کدنویسی جدا می شود.

   . اضافه کردن یا تغییر دادن سرویس تاثیری بر دامنه و دیگر سرویسها ندارد.

   . پیچیدگی در دامنه است نه در تکنولوژری.

مفاهیم طراحی دامنه محور

Context

متنها زمینه فضای solution هستند . تنظیماتی که در آن یک کلمه یا جمله معنای آن را تعیین میکنند.

Domain

موضوعی که یک کابر در یک برنامه به کار میبرد ،دامنه نرم افزار است. در یک سیستم بانکداری به صورت زیر آنهایی که دورشان خط کشیده ایم مدل های دامنه هستند.

Model

یک سیستم انتزاعی که جنبه های یک دامنه را توصیف میکند و می تواند مشکلات مر بوط به آن دامنه را حل کند. مدل دامنه می تواند یک دیاگرام ، کد نمونه یا حتی اسناد و مدارک نوشته شده از مشکلات باشد. نکته قابل توجه این است که مدل دامنه باید قابل دسترس و قابل فهم برای همه کسانی که با سیستم درگیر هستند باشد.

Domain Expert

کارشناس دامنه کسی است که صاحب بخش یا موضوعی خاص است.

یک سیستم بانکداری را در نظر بگیرید که می تواند دامنه های متفاوتی داشته باشد. بانکداری جزئی ، بانکداری شرکتی ، بخش وام ، سرمایه گذاری ،سرویس کارت ها ، ATM و ... . یک نفر با تخصص به یک دامنه خاص اختصاص داده شده است. برای با موفقیت به پایان رساندن یک سیستم بانکداری ، کارشناس هر دامنه با برنامه نویس ، مدیر پروژه و کاربر نهایی کار میکنند  .

Ubiquitous Language

یک زبان ارتباطی پیرامون مدل دامنه است و توسط همه اعضای تیم برای ارتباط همه فعالیت ها با نرم افزار  استفاده  می شود.

Bounded context

Bounded Context یک مرز در هر مدل دامنه ای که کار خاصی انجام می دهد است که آن را از دامنه های دیگر جدا نگه می دارد.

Context map

Context map یک یکپارچگی از همه مدل های دامنه در سیستم است. ممکن است هر مدل مستقل از بقیه توسعه یابد. در طول زمان نیاز است تا یکپارچگی برای پایان دادن به برنامه انجام گیرد.

معماری DDD و عناصر آن

اجزاء طراحی دامنه محور به صورت زیر می باشد.

Entity : یک شیء که می تواند با identifier  خود ، منحصر به فرد شناخته شود. Entity  می تواند به وسیله ids خودش یا با استفاده از ترکیب چند صفت معرفی شود. Entity  یک identity است.

حساب بانکی، شماره حساب وام ، اطلاعات وام گیرنده ، تعهد و ... نمونه هایی از Entity  هستند.

Value Object: یک شی که شامل صفتهایی می شود اما Identity قابل درک ندارد.

توضیحات یا خاصیت هایی که در مدل دامنه شما مهم هستند. مقدار اشیاء عمدتا در طبیعت تغییر ناپذیر است. Identity ندارند اما درباره چیزهایی که identity  دارند توضیح می دهند.

شخص : یک entity است.

آدرس : یک شیء مقدار است ، زیرا دو شخص می توانند یک آدرس داشته باشند.

Aggregate: مجموعه ای از اشیاء که به وسیله یک ریشه Entity با هم ارتباط دارند ، در غیر اینصورت با عنوان یک ریشه Aggregate شناخته می شود. ریشه aggregate ثبات تغییرات ایجاد شده در aggregate  را با منع اشیاء خارجی از اجرای منابع برای اعضای خود تضمین میکند.

Domain Event  : یک شیء دامنه است که یک رویداد را تعریف میکند ، و رویدادی است که کارشناس دامنه آن را نگهداری میکند.

Service  : سرویس را در طراحی دامنه محور می توان به 3  دسته تقسیم کرد :

Domain Services    . 

Application Services    . 

Infrastructure Services    . 

Domain Services  :  خدمات دامنه شامل عملیات ها ، یا روند کاری می شود وقابلیت هایی که دامنه نیاز دارد را فراهم میکند.

یک نمونه مثال برای آن کاتالوگ ها هستند که برای تجارت الکترونیک استفاده می شوند. کاتالوگ ها شامل اطلاعات یا خدمات حساب در دامنه حساب می شوند که با تمام اطلاعات مربوط به حسابها معامله دارند.

Application Service : خدمات برنامه ،خدماتی هستند که توسط جهان خارج استفاده می شوند که داده ها را ارائه می دهد . نمونه ای از این خدمات عملیات CRUD در دیتابیس است.

Infrastructure Services : سرویسی است که با منابع خارجی مستقیما در ارتباط است به طور مثال خدمات : دسترسی به فایل ، registery ، SMTP، دیتابیس و ...در برنامه.

آموزش سی شارپ

دانلود نسخه ی PDF این مطلب