
آموزش اصول طراحی دامنه محور Domain Driven Design
آموزش اصول طراحی دامنه محور Domain Driven Design یکی دیگر از آموزش های گروه آموزشی پرووید می باشد که در این قسمت آن را به شما معرفی می کنیم. این بسته ی آموزشی نیز یکی از دوره های آموزشی دیگر که در حوزه ی فارسی سازی آموزش های انگلیسی تنظیم شده است می باشد. عنوان این بسته ی آموزشی اصول Domain Driven Design است که با نام اصلی Domain Driven Design Fundamentals از شرکت Pluralsight منتشر شده است.
Domain Driven Design چیست؟
طراحی دامنه محور یا همان Domain Driven Design در واقع درک نیازهای واقعی کسب و کار مشتری است. ما باید درباره دامنه های مختلف مانند بانکداری، مخابرات، زنجیره تامین، مراقبت های بهداشتی و... دانش داشته باشیم. بنابراین در اینجا دامنه به معنی دانش کسب و کار درباره صنعت خاص است. به طور مشابه طراحی دامنه محور تمرکز بیشتری نسبت به نیازهای کسب و کار دارد نه به تکنولوژی. برای شروع نوشتن یک سیستم، باید بدانیم که مشتری چه چیزی را مد نظر دارد، در حین فاز اولیه هیچگاه درباره برنامه نویسی و معماری آن فکر نمیکنید. هدف اصلی شما درک تمام شرایط کسب و کار مشتری و چگونگی مدل دامنه مورد نیاز او است.

بنابراین چیزی که ما به دنبال آن هستیم بحث با مشتری درباره نیازهای کسب و کار او است. Domain Driven Design صرفا بر اساس این فرضیات برای ترسیم کردن نیازهای کسب و کار در مدل دامنه است. طراحی دامنه محور همه چیز درباره چگونگی طراحی مدل دامنه شماست. به این معنا که هر کلاس دامنه باید یک رابطه مستقیم با آنچه که در دامنه کسب و کار است داشته باشد.
نکته ای در مورد این بسته ی آموزش اصول طراحی نرم افزار Domain Driven Design
متاسفانه تعداد اندکی از ویدئوهای این مجموعه مشکل دار هستند. البته این مشکل هیچ ربطی به کم کاری وبسایت پرووید ندارد و از همان وبسایت اصلی Pluralsight می باشند. به منظور دوبله ی این بسته ی آموزشی از چندین وبسایت مختلف ایرانی اقدام به دانلود این بسته کردیم ولی متاسفانه همه ی آنها نیز مشکل ذکر شده را داشتند.

با این وجود محتوای آموزشی این بسته به قدری با ارزش و مفید است که این مشکل کوچک هیچ خللی در آن ایجاد نمی کند و ما اطمینان داریم با توجه به محتوای آموزشی، کیفیت دوبله و همچنین در دسترس بودن فایل های پروژه، می توانید بهترین استفاده را از این بسته ی آموزشی کنید.
شناسایی Subdomain و Bounded Context در طراحی دامنه
در Domain Driven Design، مدل نرمافزار باید با ساختار مسئلهای که قرار است حل کند هماهنگ باشد. آموزش Domain Driven Design Fundamentals از شناخت Problemهای نرمافزاری و بررسی Subdomainها شروع میکند و سپس تفاوت Subdomain و Bounded Context را مطرح میسازد. Subdomain بخشی از مسئله کسبوکار را مشخص میکند، درحالیکه Bounded Context مرزی برای کاربرد و تفسیر یک مدل دامنه در نظر میگیرد. شناخت این تفاوت به تیم کمک میکند مدلهای بزرگ را به بخشهای قابلفهمتری تقسیم کند و از یکسان فرض کردن مفاهیم مشابه در زمینههای متفاوت جلوگیری کند.
ایجاد واژهنامه مشترک نیز در این فرایند اهمیت دارد. وقتی اعضای تیم برای یک مفهوم کسبوکار از واژههای متفاوت استفاده میکنند، احتمال سوءتفاهم میان تحلیل، طراحی و پیادهسازی افزایش مییابد. این آموزش به تعریف اهداف و ساخت واژهنامه در کنار بررسی تاریخچه و دید کلی DDD میپردازد تا ارتباط میان زبان دامنه و مدل نرمافزار روشنتر شود. این رویکرد برای تیمهایی مفید است که با مسئلههای پیچیده سازمانی روبهرو هستند و نیاز دارند بخشهای مختلف سیستم را بر اساس مسئولیتهای کسبوکار مشخص کنند، نه فقط بر اساس ساختار فنی یا لایههای کد.
طراحی Entity، Value Object و Aggregate برای مدل دامنه
پس از تعیین مرزهای دامنه، نوبت به تعریف اجزایی میرسد که مدل نرمافزار را تشکیل میدهند. این آموزش Entityها، Value Objectها و Aggregateها را بررسی میکند و به مفهوم Aggregate Root نیز میپردازد. Entityها معمولاً با هویت مشخص خود شناخته میشوند، درحالیکه Value Objectها برای نمایش مفاهیمی به کار میروند که ویژگیهایشان اهمیت دارد. Aggregate نیز مجموعهای از اشیای مرتبط را در مرزی مشخص سازماندهی میکند و Aggregate Root نقطه دسترسی اصلی به آن مجموعه است. شناخت این مفاهیم در طراحی قواعد سازگاری و مسئولیتهای مدل دامنه کاربرد دارد.
در میان نمونههای آموزشی، تعریف Schedule Aggregate دیده میشود که امکان بررسی عملی ساختار یک Aggregate را فراهم میکند. همچنین آموزش به Repositoryها و مقایسه آنها با Factoryها میپردازد. Repository مسئولیت دسترسی به اشیای دامنه را از جزئیات ذخیرهسازی جدا میکند، درحالیکه Factory برای ساخت اشیای پیچیدهای کاربرد دارد که ایجاد آنها نیازمند منطق مشخصی است. در ادامه، Domain Eventها و Anti-corruption Layerها نیز در سرفصلها قرار دارند؛ این مفاهیم به مدلسازی رخدادهای دامنه و جداسازی مدل داخلی از مدلهای بیرونی کمک میکنند. مجموعه این موضوعات برای طراحی سیستمهایی با مرزهای دامنه روشن و قواعد کسبوکار مشخص مناسب است.
سرفصل مطالب آموزش اصول طراحی نرم افزار Domain Driven Design
فصل اول: مقدمه ای بر Domain Driven Design
- مقدمه
- تاریخچه ی Domain Driven Design
- در این دوره ی آموزشی چه چیزی را فرا خواهید گرفت؟
- مشارکت آقای Eric Evans در این دوره ی آموزشی
- دلیل اهمیت Domain Driven Design چیست؟
- دید سطح بالا از Domain Driven Design: تعامل با Domain Expert ها
- دید سطح بالا از Domain Driven Design: تمرکز بر روی SubDomain ها
- دید سطح بالا از Domain Driven Design: پیاده سازی SubDomain ها
- مزایای Domain Driven Design
- معایب Domain Driven Design
- نقشه ی مربوط به Domain Driven Design
- بررسی برنامه ی ساخته شده در این بسته ی آموزشی
- مهمترین موضوعات برای یادگیری
فصل دوم: مدل کردن Problem ها در نرم افزار
- مقدمه
- تعریف اهداف
- کسب اطلاعات در مورد Domain از طریق صحبت کردن با Domain Expert ها
- شکست Domain به SubDomain ها
- تمرکز بر روی یک SubDomain با یک Domain Expert
- اولیل مدل سطح بالا از SubDomain
- ساخت یک Bounded Context
- تفاوت بین یک SubDomain و یک BoundedContext
- فهمیدن Context Map ها
- صحبت آقای Eric Evans در مورد تعریف شفاف Context Boundary ها
- Bounded Context ها در برنامه ی ما
- Ubiquitous Language (زبان فراگیر) در یک Bounded Context
- کار بر روی یک Ubiquitous Language با یک Domain Expert
- واژه نامه
- جمع بندی
- منابع
فصل سوم: عناصر Domain Model
- مقدمه
- تعریف اهداف
- اهمیت فهمیدن واژه های Domain Driven Design
- تمرکز بر روی Domain
- تفاوت Anemic Domain و Rich Domain
- Entity ها در Domain Driven Design و در Bounded Context برنامه
- صحبت آقای Eric Evans در مورد اصل Single Responsibility در Entity ها
- صحبت آقای Eric Evans در مورد متدهای تساوی Entity ها
- نحوه ی پیاده سازی Entity ها در برنامه
- ارتباطات Association ها
- Value Object ها
- صحبت آقای Eric Evans در مورد متدهای Value Object ها
- Value Object ها در برنامه
- صحبت آقای Eric Evans در مورد کد Entity در Value Object ها
- Domain Service ها
- واژه نامه
- جمع بندی
- منابع
فص جهارم: Aggregate ها در Domain Driven Design
- مقدمه
- تعریف اهداف
- حل و فصل کردن پیچیدگی داده ای (Data Complexity)
- معرفی Aggregate ها و Aggregate Root ها
- تعامل بین Aggregate ها
- تکامل Appointment Aggregate در برنامه
- استفاده از Invariant ها برای فهم بهتر Aggregate ها
- پیشبرد مدل سازی و ریفکتورینگ
- استفاده از Scheduling به عنوان Aggregate جدید
- تعریف Schedule Aggregate در برنامه
- مرور نکات Aggregate ها
- واژه نامه
- منابع
فصل پنجم: Repository ها
- مقدمه
- تعریف اهداف
- معرفی Repository ها
- نکات و مزیت Repository ها
- مقایسه Repository ها و Factory ها
- استفاده از اینترفیس IRepository جنریک
- استفاده از Repository های جنریک در Domain Driven Design
- Repository های برنامه
- انجام ریفکتورینگ برای تفکیک و Separation بیشتر
- واژه نامه
- منابع
فصل ششم: Domain Event ها و Anti-corruption Layer ها
- مقدمه
- تعریف اهداف
- معرفی Domain Event ها
- پیاده سازی Domain Event ها در یک برنامه ی نمونه
- تعریف Domain Event ها در برنامه ی اصلی
- مرزهای Domain Event ها
- لایه ی Anti-corruption
- واژه نامه
- منابع
فصل هفتم: بهره مند شدن از مزایای Domain Driven Design
- مقدمه
- تعریف اهداف
- طراحی سیستم فعلی
- بررسی یک قابلیت جدید با Domain Expert برای پیاده سازی
- برنامه ریزی برای پیاده سازی قابلیت جدید
- قرار دادن یک Message Queue بین برنامه ها
- ترکیب Message Queue و Event و Service در برنامه
- بررسی دقیق جزییات پیاده سازی
- گسترش دادن بیشتر برنامه
- بررسی UI و ارتباط آن با Domain
- صحبت آقای Eric Evans در مورد Fallacy of Perfectionism
- نکته ی کلیدی این فصل
- واژه نامه
- منابع







