کارگاه عملی دو روزه Goal-Oriented Software Archietcture ...
0
+98 9120750671

چالش شماره ۲۱ DDD Plus – یک شخص، چند نقش، چند کانتکست

مرور چالش قبلی

در چالش شماره ۲۰ درباره مرز Aggregate و اشتباه رایج بزرگ‌کردن بی‌دلیل Aggregate صحبت کردیم. اینکه consistency boundary را با convenience اشتباه نگیریم.

http://domaindrivendesign.ir/ddd-plus-20/

اگر هنوز آن را نخوانده‌اید، قبل از حل این چالش برگردید و مرورش کنید. چالش ۲۱ ادامه طبیعی همان بحث است. این بار مسئله از جنس مرز نقش‌هاست، نه مرز داده‌ها.

پیش‌زمینه

فرض کنید شرکت شما یک پلتفرم SaaS سازمانی برای مدیریت پروژه و پرداخت است. محصول شما شامل دو سرویس مستقل است:

  • سرویس مدیریت پروژه
  • سرویس صورتحساب و پرداخت

هر کدام از این سرویس‌ها تیم مستقل دارند و دیتابیس مستقل.

سناریو

شرکت آلفا از پلتفرم شما استفاده می‌کند. در این شرکت با سناریوهای زیر مواجه هستیم:

  • تقی اشتراک سالانه را خریداری می‌کند.
  • نقی مدیر پروژه است و تسک‌ها را مدیریت می‌کند.
  • شهین و مهین اعضای تیم هستند.
  • در پایان ماه، تقی پرداخت صورت‌حساب پروژه‌ای را که نقی مدیریت کرده تأیید می‌کند.

در این سناریو باید در نظر داشته باشیم که نقش‌هایی از جمله:

  • خریدار اشتراک (Subscriber / Payer)
  • مدیر پروژه (Project Manager)
  • عضو تیم (Contributor)

ممکن است یک نفر باشند. ممکن است سه نفر مختلف باشند. در واقع باید گفت که پیچیدگی دقیقاً از همین‌جا شروع می‌شود.

اگر همه این‌ها را “User” صدا بزنید(احتمالا! بستگی به نظر شما دارد)، مدل شما از همان روز اول خراب است.

مسئله

با توجه به مستقل بودن سرویس‌ها و تفاوت نقش‌ها، به سوالات زیر پاسخ دهید:

بخش اول مدل‌سازی دامنه

آیا این‌ها را باید بصورت Entity مدل کنیم یا Role؟

بصورت مشخص‌تر باید گفت که یک Person داریم. پاسخ‌ خودتون رو تشریح بدید و دلیلش را هم بیان کنید. سعی کنید به یک مدل اکتفا نکنید و چند مدل برای این مسئله طراحی کنید.

Aggregateها چه هستند؟

زیر سوال: آیا Person داخل Project embed می‌شود.

آیا Bounded Context جدا لازم است؟

Context Map را برای مسئله بالا طراحی کنید

به عنوان راهنمایی به موارد زیر هم اشاره کنید

  • Identity & Access
  • Project Management
  • Billing
  • Notification

Ubiquitous Language

کاتالوگ UL را برای مسئله بالا طراحی کنید. نشان دهید که چگونه یک مفهوم با چرخیدن بین تیم‌ها و BC ها همچنان معنی و مفهومی یکپارچه خواهد داشت.

اهداف چالش این هفته

  • تفکیک Entity از Role
  • جلوگیری از نشت مفاهیم بین Contextها
  • طراحی Identity مستقل
  • حفظ consistency در سیستم توزیع‌شده
  • ایجاد observability واقعی
  • طراحی مدل قابل توسعه برای اضافه شدن سرویس‌های جدید

سؤال نهایی

اگر فردا سرویس HR اضافه شود و همان Person نقش Employee بگیرد، مدل شما آماده است یا باید Identity را بازنویسی کنید؟

اگر اضافه شدن یک Role جدید باعث تغییر Aggregate اصلی شود،مرزها را اشتباه کشیده‌اید.


ارسال دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *