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

فلسفه طراحی دامنه محور برای اولین بار در سال ۲۰۰۳، در کتابی با عنوان Domain-Driven Design،توسط Eric Evans مطرح گردید و در آن از لزوم تمرکز بر روی پیچیدگی ذاتی دامنه فعالیت نرم افزار (Domain) صحبت شد. برای درک وفهم اینکه معماری Domain Driven Design یا به اختصار DDD چیست در ابتدا بهتر است به تعریفی از معماری نرم افزار بپردازیم:معماری نرم افزار : هر پروژه ای که انجام می شود نیازمند ساختار خاصی است. مثلا باید مشخص باشد بخش های مختلف نرم افزار چه ارتباطی با هم دارند و چگونه این ارتباطات تعریف شده است. ویا باید مشخص گردد دیتابیس و کلاسهای داده چگونه با لایه های UI در ارتباط هستند. به طور کلی تعاریف ساختار نرم افزار یا پروژه را معماری نرم افزار می گویند.اما اینکه چگونه معماری مناسب برای پروزه را انتخاب کنیم ؟ نکته بسیار مهمی است که باید حتما قبل از شروع یک پروژه به آن توجه کرد، این است که حتما بایستی معماری مناسب برای پروژه را به صورت صحیح انتخاب کنید. برای انتخاب معماری به صورت صحیح به مواردی همچون(زمان انجام پروژه، هزینه انجام پروزه، بزرگی و حجم پروژه، نیروی کار دخیل در پروژه، تشخیص تیم برنامه نویسی)توجه شود.معماری های زیادی برای نرم افزارها تعریف شده است. برخی از این معماری ها که کاربرد بیشتری دارند عبارتند از :· معماری چند لایه یا nTier· معماری تمیز (Clean Architecture)· معماری Broker· معماری Event-Bus· معماری DDDطراحی دامنه محور ، در واقع درک نیازهای واقعی کسب و کار مشتری است. طراحی دامنه محور صرفا بر اساس این فرضیات برای ترسیم کردن نیازهای کسب و کار در مدل دامنه است. طراحی دامنه محور همه چیز درباره چگونگی طراحی مدل دامنه شماست. به این معنا که هر کلاس دامنه باید یک رابطه مستقیم با آنچه که در دامنه کسب و کار است داشته باشد. DDD آدرس دهی چه در دنیای واقعی چه در دنیای فیزیکی است.برای شروع نوشتن یک سیستم ، باید بدانیم که مشتری چه چیزی را مد نظر دارد ، در حین فاز اولیه هیچگاه درباره برنامه نویسی و معماری آن فکر نمیکنید. هدف اصلی شما درک تمام شرایط کسب و کار مشتری و چگونگی مدل دامنه مورد نیاز او است.بنابراین چیزی که ما به دنبال آن هستیم بحث با مشتری درباره نیازهای کسب و کار او است .برای درک بهتر وقتی با، سوال اینکه طراحی دامنه محور چیست؟ مواجه می شویم،شش مفهوم مهم را با هم در قالب 6 سوال مرور کنیم. چون DDD یک مفهوم بسیار گسترده است.1. دامنه(Domain)چیست؟حوزه موضوعی که برنامه در حال توسعه روی آن اعمال می شود دامنه نامیده می شود. هنگام توسعه یک برنامه، همیشه خوب است که زمینه ای را که در آن کاربرد دارد، بدانید. گاهی اوقات چندین دامنه وجود دارد که یک سازمان می تواند در آنها فعال باشد. به عنوان مثال، یک شرکت می تواند در فروش، حمل و نقل و تعمیرات به طور همزمان فعال باشد.یک سازمان می تواند خود را به گونه ای متفاوت برای زیر دامنه ها سازماندهی کند. اگر در حال توسعه یک برنامه کاربردی برای فروش هستید، بهتر است از «فروش» به آن نگاه کنید. زبان برنامه توسعه‌یافته با کسب‌وکار همسو می‌شود و برنامه به طور کلی معنادارتر خواهد بود (E. Evans, 2003).2. زمینه محدود (Bounded context)چیست؟در توسعه دامنه محور، «زمینه محدود» یک مفهوم مهم است. این اطلاعات بیشتر در مورد نحوه برخورد با مدل های دامنه بزرگ و یک سازمان بزرگ می دهد. برای مقابله با یک مدل بزرگ، می‌توانید مدل را به مناطق مختلف تقسیم کنید که ما آن را «زمینه محدود» می‌نامیم.یک سازمان را می توان به یک بخش فروش و یک بخش پشتیبانی تقسیم کرد که هر کدام در چارچوب خود عمل می کنند. با کار در یک زمینه محدود یا محدود، کار آسان تر و بهتر سازماندهی می شود (M. Fowler, 2014).3. زبان همه جا حاضر(Ubiquitous Language) به چه معناست؟به عبارت اولیه، یک زبان همه جا حاضر، زبانی است که توسط تیم توسعه و کارشناسان دامنه مشترک است. از آنجا که آنها باید برای ایجاد یک حلقه بازخورد کوتاه با یکدیگر همکاری کنند، این کاملا منطقی استاین زبان نه تنها در مدل دامنه، بلکه در کد برنامه نیز باید استفاده شود. اگر تیم توسعه و تیم تجاری با هم کار نکنند، این شانس افزایش می‌یابد که زبان خود را توسعه دهند. این می تواند یک مانع زبانی بین آنها ایجاد کند (DDD2019).بیایید برخی از ویژگی های کلیدی زبان فراگیر را خلاصه کنیم:· باید در مدل دامنه بیان شود.· زبان توسعه‌دهنده «فنی» را از مدل دامنه دور نگه می‌دارد، که توسط کارشناسان دامنه قابل درک نیست.· تضادها و نادرستی هایی را که باید توسط متخصصان دامنه به مدل دامنه معرفی شود، کاهش می دهد.· با رشد برنامه تکامل می یابد4. لایه ضد فساد(Anti Corruption Layer) چیست؟برای جلوگیری از آلودگی دو دامنه، باید بین آنها مرز ایجاد کنید. هر دامنه زبان فراگیر و مدل دامنه خود را دارد. یک لایه ضد فساد بین دو مدل دامنه ترجمه می شود. لایه می تواند یک طرفه یا دو جهته باشد و اغلب توسط الگوهای شناخته شده (مانند آداپتور، نما، مترجم) اجرا می شود. باید در نظر داشته باشیم که ایجاد یک لایه ضد فساد می تواند زمان بر باشد. فقط در صورتی باید استفاده شود که بخواهید از دامنه خود در برابر تأثیرات بیرونی محافظت کنید (A Shirin, 2018).5. تفاوت بین موجود و شیء ارزش(“Entity” and a “Value Object”) چیست؟درک تفاوت بین Entities و Value Objects برای مدل‌سازی دنیای واقعی در یک برنامه بسیار مهم است. من تفاوت های اصلی بین آنها را در اینجا لیست می کنم (V Khorikov,2016)هویت: اشیاء ارزش هویت ندارند، در حالی که یک موجودیت دارای هویت است. ارزش اشیایی که مقادیر یکسانی دارند ذاتاً برابر هستند. موجودیت ها به تنهایی وجود دارند.چرخه حیات: اشیاء ارزشی به تنهایی زندگی نمی‌کنند و به یک موجودیت تعلق دارند. آنها را می توان به راحتی از بین برد و ایجاد کرد. موجودیت ها زندگی می کنند و تاریخ دارند.6. مجموعه(Aggregate) چیست؟جمع یک الگوی طراحی دامنه محور است. این مجموعه ای از اشیاء دامنه (به عنوان مثال نهاد، شی ارزش) است که به عنوان یک واحد واحد در نظر گرفته می شود. خودرو مثال خوبی است. از چرخ ها، چراغ ها و یک موتور تشکیل شده است. آنها از نظر مفهومی به هم تعلق دارند.هر انباشته ای یک ریشه ی کل دارد. در مثال ما، این ممکن است شماره شاسی باشد. این یکپارچگی کل را تضمین می کند. هر مجموع بیانگر یک مرز معاملاتی است. (M. Fowler)نتیجهپاسخ به این سؤالات به شما کمک می کنند که ایده خوبی از اینکه دقیقاً منظور از طراحی دامنه محور چیست بدهد.البته این مطالب را به عنوان یک راهنمای کامل نمی توان در نظر گرفت به علت اینکه،آنقدر در مورد این موضوع مطالب زیاد است به طوری که چندین منبع مطالعاتی انتخاب و آنها را مطالعه نمود.منابعhttps://towardsdatascience.com/what-is-domain-driven-design-5ea1e98285e4https://www.linkedin.com/learning/software-architecture-domain-driven-design/what-is-dddhttps://www.linkedin.com/pulse/domain-driven-design-dddin-microservice-architecture-deffo-fotso«این مطلب، بخشی از تمرینهای درس معماری نرم‌افزار در دانشگاه شهیدبهشتی است»