پیشزمینه
شما در شرکت MyFlight.Com مشغول به کار هستید. این شرکت به شما این امکان را میدهد که بتوانید پروازها به اقصی نقاط دنیا از ایرلاینهای مختلف رزرو کنید.

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

صورت مسئله
با توجه به سناریوی مطرح شده، به سوالات زیر پاسخ دهید:
- مدلسازی (DDD):
- با استفاده از مفاهیم DDD، چگونه موجودیتهای
ایرلاین
،مسیر
ومحدودیت قیمت
را مدل میکنید؟ چه Value Object و Aggregateهایی را شناسایی میکنید و چرا؟ - آیا
ایرلاین
را به عنوان یک Aggregate Root در نظر میگیرید یا مسیر را؟ در نظر داشته باشید برای یک مسیر ممکن است هر ایرلاین بصورت جداگانه محدودیت قیمتگذاری فروش داشته باشد. چه موجودیتهای دیگری میتوانند Aggregate Root باشند و چرا؟ محدودیت قیمت
چگونه با Aggregate Root ارتباط دارد؟ آیا یک Value Object است یا Entity؟ دلایل خود را توضیح دهید.- فرض کنید Bounded Contextهای جستجو و قیمتگذاری در سیستم شما وجود دارد. آیا سناریوی بالا را در یک Bounded Context جداگانه مدل میکنید؟ دلایل خود را شرح دهید؟
- در صورتی که یک Bounded Context جداگانه برای پیادهسازی سناریوی بالا استفاده میکنید، Context Map بین این Bounded Context و سایر Bounded Contextها (مانند Booking یا Search یا Pricing) چگونه خواهد بود؟
- چگونه به UL در طراحی موارد بالا پایبند خواهید بود؟ جواب خود را شرح دهید. نامگذاری مفاهیم دامنه را شرح دهید.
- با استفاده از مفاهیم DDD، چگونه موجودیتهای
- نحوه بررسی قیمت پرواز (Domain Logic):
- با فرض اینکه لیستی از محدودیتهای قیمت ایرلاینها برای مسیرهای مختلف (شامل ایرلاین، مبدا، مقصد و حداکثر قیمت مجاز) و لیستی از پروازهای موجود برای نمایش به کاربر در اختیار داریم، چگونه قیمت هر پرواز را با محدودیتهای قیمت مربوط به آن مسیر و ایرلاین، در Domain Layer بررسی میکنید؟
- الگوریتم پیشنهادی شما چیست؟ آیا میتوان از Patternهایی مانند Specification یا Strategy در Domain Layer برای این منظور استفاده کرد؟
- چگونه به UL در طراحی قوانین دومین مسئله پایبند خواهید بود؟
- نحوه فیلتر کردن پروازها (Application Logic):
- با استفاده از Domain Model و Domain Logic طراحی شده، چگونه پروازها را در Application Layer فیلتر میکنید؟
- آیا میتوان این فیلتر کردن را به صورت Rule-Based یا declarative پیادهسازی کرد؟ مزایا و معایب هر رویکرد را توضیح دهید.
- در این لایه نحوهی پایبندی به UL را شرح دهید
- قابلیت Observability سیستم:
- لیست پروازهای ارائه شده هر ایرلاین که از محدودهی قیمتگذاری آن ایرلاین خارج شده و شما جلوی فروش آنرا گرفتهاید را بصورت یک alert در پنل مدیریت سیستم، به کاربر پشتیبانی نمایش دهید.
- بهینهسازی (Performance):
- با توجه به زیاد بودن تعداد مسیرها و پروازها، چگونه عملکرد سیستم را برای بررسی و فیلتر کردن پروازها بهینه میکنید؟
- آیا از caching (مانند Redis یا Memcached) در Domain Layer یا Application Layer استفاده میکنید؟ چه نوع دادهای را cache میکنید و با چه strategyای؟
- آیا از CQRS یا Event Sourcing برای بهبود performance سیستم Search یا Query side سیستم استفاده میکنید؟ چرا؟ مزایا و معایب استفاده از این الگوها در این سناریو چیست؟
اهداف چالش
- طراحی Domain Model مناسب برای مدیریت محدودیت قیمت ایرلاین با استفاده از مفاهیم DDD.
- پیادهسازی Domain Logic برای بررسی قیمت پرواز با استفاده از الگوهای طراحی مناسب.
- طراحی Application Layer برای فیلتر کردن پروازها و مدیریت خطاها.
- بهینهسازی عملکرد سیستم با استفاده از caching، CQRS یا سایر روشها.