تاکنون معماری های زیادی برای کاهش هزینه های نرم افزار برای مشتریان و افزایش طول عمر نرم افزار ابداع شده است. از multi-layered تا multi-tiered و به دنبال آن یک معماری دامنه گرا(Domain Oriented Architecture).
در شکل زیر نمونه ای از لایه های یک web application را مشاهده می کنید:
برای هدف بحث، بیایید فرض کنیم که یک اپلیکیشن ساختگی Educator Tools داریم که برای کمک به اوایای مدرسه در مدیریت دانشآموزان دبیرستانی طراحی شده است.
تفکیک نگرانی(Separation of Concerns یا به اختصار SoC هم گفته می شود) چیست؟ در علوم کامپیوتری، جداسازی نگرانیها (SoC) یک اصل طراحی برای جدا کردن یک برنامه کامپیوتری به بخشهای مجزا است، به طوری که هر بخش به یک نگرانی جداگانه میپردازد. ما از این اصل برای جداسازی ماژول های برنامه برای مدیریت برنامه های کاربردی مقیاس پذیر(scalable applications) استفاده می کنیم.
تصویر بالا فقط نمونه ای از لایه ها در یک برنامه کاربردی است. در عمل، یک برنامه سازمانی ممکن است دارای لایه های بیشتر یا کمتری باشد. به عنوان مثال، در برنامه های کاربردی ساده ممکن است business logic و Data persistence در یک لایه باشد. از سوی دیگر، برنامههای پیچیده ممکن است لایههای Data persistence جداگانه برای انواع مختلف داده یا ذخیرهسازی داشته باشند.
تعريف Coupling : یک مقیاس اندازه گیری است برای اینکه بفهمیم دو کلاس/ماژول چقدر با هم در ارتباط هستند و چقدر روی هم تاثیر می گذارند .بهتر است که کلاسها/ماژول ها با هم ارتباط کمتری داشته باشند و در اصل ما دوست داریم که در مدلمان Coupling کم(Low Coupling) باشد.
خوب حالا می خواهم به مفهومی اشاره کنم که جدید نیست، اما این روزها رویکردی موثر برای ساخت اکثر برنامه های کاربردی وب محسوب می شود. این طراحی دامنه محور/Domain Driven Design (با نام مستعار DDD) است. ترکیب، بهبود و توسعه فوق العاده آن بر کاستی های مدل های قدیمی محبوب مانند N-Tiers، MVC، MVP، MVVM غلبه می کند.
در این پست و پست های بعدی، برخی از مفاهیم اساسی الگوی DDD را بررسی خواهم کرد و یک مثال عملی از نحوه اعمال موثر DDD در یک پروژه معمولی NET Core. ارائه خواهم کرد.
در سال 2003، اریک ایوان(Eric Evans) اولین کتاب را با عنوان "مقابله با پیچیدگی در قلب نرم افزار/Tackling Complexity in the Heart of Software" منتشر کرد که اولین مفاهیم را به DDD آورد. محبوبیت این الگو از آن زمان به طور تصاعدی افزایش یافته است. بسیاری از تیمها، کسبوکارها یا شرکت های توسعه نرمافزار از این مدل استفاده کردهاند و به موفقیتهای بزرگی در توسعه نرمافزار دست یافتهاند. بیایید تعدادی از بهترین تعاریف DDD را باهم ببینیم :
«طراحی دامنه محور DDD از مدلسازی مبتنی بر واقعیت کسبوکار مرتبط با عنوان use case های شما حمایت میکند. در زمینه ساخت برنامه های کاربردی، DDD در مورد مشکلات به عنوان دامنه/Domain صحبت می کند. حوزههای مشکلساز مستقل را بهعنوان Bounded Contexts توصیف میکند (هر Bounded Contexts با یک میکروسرویس می تواند مرتبط باشد) و بر زبان مشترک (Ubiquitous Language) برای صحبت در مورد این مشکلات تأکید میکند. همچنین مفاهیم و الگوهای فنی زیادی را پیشنهاد میکند، مانند domain entities با rich models و value objects و aggregates و aggregate root(بعدا بصورت مفصل راجع به آنها صحبت خواهیم کرد)
طراحی دامنه محور DDD یک رویکرد برای توسعه نرم افزار متمرکز بر کسب و کار(business) است. مشکلات و چالش هایی که در طول توسعه و نگهداری نرم افزار رخ می دهد، بیشتر از رشد مداوم کسب و کار ناشی می شود. بنابراین، DDD به ارتباط نزدیک توسعه نرم افزار و تکامل مدل کسب و کار کمک می کند.
طراحی دامنه محور DDD به حل مشکل ساخت سیستم های پیچیده کمک می کند. این الگو به معماران، توسعه دهندگان و کارشناسانی در این حوزه نیاز دارد تا ابتدا الزامات را دقیقاً درک کنند. سپس رفتارها را تعریف می کنند، قوانین را درک می کنند، اصول و منطق کسب و کار را در مجموعه بندها (Abstractions، Interfaces و غیره) اعمال می کنند. در مرحله بعد، توسعه دهندگان آنها را در لایه های دیگر (به عنوان مثال، Application Layer و Infrastructure layer) پیاده سازی خواهند کرد. امروزه، DDD به عنوان یک استاندارد برای توسعه معماری های محبوب مختلف، مانند Onion Architecture، Clean Architecture، Hexagonal Architecture و غیره تنظیم شده است.
قبل از پرداختن به جزئیات، برخی از مزایا و معایب طراحی Domain-Driven را توضیح خواهم داد تا به شما در درک اینکه آیا این مدل به خوبی با پروژه شما مطابقت دارد یا خیر، کمک کند.
مزایای DDD :
اول Loose coupling : بخشهای سیستم از طریق تعاریف و اصولی که در لایه Core (از جمله interfaces, abstract classes, base classes و غیره) گذاشته شدهاند، با یکدیگر تعامل خواهند داشت. پیاده سازی در لایه های باقی مانده تکمیل خواهد شد. پیاده سازی ها از طریق کتابخانه های DI (IoC، AutoFac,...) خواهد بود.
دوم Flexibility یا انعطافپذیری: تعاریف سطح بالا به تیم اجازه میدهد تا بدون تأثیر قابلتوجه بر سیستم کلی، انعطافپذیری بیشتری با الزامات عملکردی جدید افزایش دهد و با آنها سازگار شود.
سوم Testability تست پذیری: همانطور که در بالا ذکر شد، جداسازی پیاده سازی از رابط های(interfaces) تعریف شده در لایه Core، آزمایش با داده های ساختگی یا همان قابلیت تست پذیری را بهبود می بخشد.
چهارم Maintenance نگهداری: DDD به وضوح کلاس ها را بین layers/tiers تقسیم می کند. به طور خاص، Domain منطق تجاری(business logic) را پیادهسازی میکند، Infrastructure مسئول data persistence است، و Application مدیریت API و منطق یکپارچهسازی را بر عهده دارد. پیروی از این رویکرد در نهایت به شما شانس نوشتن کدهای تمیزتر و قابل اعتمادتر را می دهد. به علاوه، تیم شما می تواند به راحتی کد را پیدا کند، تکرار آن را محدود کند و زمان نگهداری را کاهش دهد.
معایب DDD
اول Domain expertise متخصص دامنه: DDD به متخصص دامنه نیاز دارد. این بدان معناست که تیم شما باید حداقل یک متخصص دامنه داشته باشد. آنها به شما کمک می کنند تا تمام فرآیندها، رویه ها و اصطلاحات آن دامنه را تعریف کنید.
دوم Low interactions تعاملات کم: loose connection بین بخشهای مختلف مستلزم برقراری ارتباط و تبادل منظم تیم است. بنابراین قبل از اعمال رویکرد DDD، تیم باید ابتدا اصول آن را به تفصیل مورد بحث قرار دهد.
سوم Development costs هزینه های توسعه: کارشناسان دامنه و تیم باید مقدار زیادی کپسوله سازی(encapsulation) را در Domain Model پیاده سازی کنند. این اغلب منجر به توسعه و مدت زمان طولانی تر می شود که می تواند هزینه نسبتاً بالایی داشته باشد. بنابراین، برای پروژه های کوتاه مدت یا پروژه های بدون پیچیدگی دامنه زیاد مناسب نیست.
معماری پروژه های DDD معمولاً شامل سه بخش اصلی است: Domain, Infrastructure, Application. بسته به اندازه هر پروژه می توانیم این قسمت ها را در یک پروژه مرتب کنیم و یا در لایه های مختلف جدا کنیم.
بخش Domain: (بیشتر بخوانید : لایه ها در DDD - دامنه (Domain))
بخش Application :
بخش Infrastructure :
آموزش کاربردی DDD in ASP.NET Core - قسمت دوم
بیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Core