گپی در مورد طراحی نرمافزار با ChatGPT داشتم که خلاصه مفاهیم مطرح شده در آن را اینجا می نویسم. مطالب در مورد DDD، Aggregate، Aggregate Root، Value Object، Bounded Context، زبان فراگیر و Entity است.
در طراحی نرمافزار، Aggregate مجموعهای از اشیاء (objects) است که با هم در ارتباطند و معمولاً یکی از آنها به عنوان Aggregate Root انتخاب میشود. فرض کنید یک خرید آنلاین دارید. Aggregate ممکن است شامل شیئهایی مانند سبد خرید، محصولات در سبد، اطلاعات مشتری و غیره باشد. در این مثال، سبد خرید میتواند به عنوان Aggregate Root انتخاب شود که بقیه اشیاء (محصولات، اطلاعات مشتری و ...) به طور مستقیم یا غیرمستقیم با آن در ارتباط هستند.
شیءای است که ارزش خود را بر اساس خصوصیتهای خود دارد و توسط مقدار آن تشخیص داده میشود، نه با شناسهای که به آن اختصاص داده شده باشد. یک Value Object میتواند تاریخ، مختصات مکانی، آدرس و غیره باشد. برای مثال، تاریخ تولد یک فرد به عنوان Value Object در نظر گرفته میشود؛ زیرا مقدار تاریخ تولد بر اساس خصوصیات خود (سال، ماه، روز) تشخیص داده میشود و معمولاً به شناسه نیازی ندارد. یک Value Object میتواند مجموعهای از چندین خصوصیت (مقدار) باشد، اما اگر مقداری که مد نظر است، به تنهایی یک مقدار معین باشد، همچنان میتوان آن را به عنوان Value Object مدلسازی کرد. بنابراین، هر چند که Value Object معمولاً ترکیبی از چندین مقدار است، اما میتواند به عنوان مدلسازی برای مقادیر تکی نیز استفاده شود.
این مفهوم نشان دهندهٔ محدودهای از دامنهی مسئله و مفهومهای مشخص در آن است. فرض کنید شما یک سیستم فروش آنلاین دارید. Bounded Context ممکن است شامل قسمتهایی مانند مدیریت محصولات، مدیریت سفارشها، مدیریت مشتریان و غیره باشد. هر کدام از این بخشها میتوانند یک Bounded Context جداگانه باشند که در آنها مفاهیم و قوانین خاص خود را دارند و ارتباطات خود را با بخشهای دیگر دارند.
برای ایجاد یک سفارش جدید، بخش مدیریت سفارشها نیاز به دسترسی به اطلاعات محصولات دارد.
ارتباط بین این دو Bounded Context به این صورت است که بخش مدیریت سفارشها از خدماتی که توسط بخش مدیریت محصولات ارائه میشود برای دریافت اطلاعات محصولات (مانند نام، قیمت، و ...) استفاده میکند.
بخش مدیریت محصولات خودش اطلاعات محصولات را مدیریت میکند و نیازی به دسترسی به جزئیات سفارشها ندارد.
در اینجا، هر Bounded Context دارای مفاهیم و قوانین خود است و تمرکز مختص به خود را دارد. ارتباطات بین این Bounded Context ها به منظور انجام عملیاتهایی مانند ساختن سفارشها است که هر کدام از این Bounded Context ها مسئولیتهای خود را برعهده دارند و با استفاده از رابطهای مشخص با یکدیگر ارتباط برقرار میکنند.
مزیت اصلی DDD این است که به توسعهدهندگان کمک میکند تا مسائل دامنه مسئله را به بهترین شکل ممکن مدلسازی کنند و با استفاده از آن مدلها، سیستمهای نرمافزاری ایجاد کنند که با دامنه مسئله همگام و سازگار هستند.
این مفهوم به زبان مشترکی اشاره دارد که بین تیم توسعه نرمافزار و متخصصان دامنه مسئله (Domain Experts) تعریف میشود. این زبان باید برای همه اعضای تیم قابل فهم و قابل استفاده باشد. زبان فراگیر باید مفاهیم و اصطلاحات مرتبط با دامنه مسئله را به صورت دقیق و یکسان تعریف کند و از طریق آن، ارتباط و هماهنگی بین اعضای تیم تضمین شود. این زبان باید در تمامی مستندات مربوط به پروژه (مانند مستندات موردی، کد، مدلهای دامنه و ...) استفاده شود تا ابهامات درکی حل شده و دامنه مسئله به خوبی مدلسازی شود.
یک Entity به یک واقعیت معین در دامنه مسئله اشاره دارد که دارای هویت مدیریتی است. به عبارت دیگر، هر Entity دارای یک شناسه منحصربهفرد است که آن را از دیگر موجودیتها تمایز میدهد. Entity معمولاً دارای ویژگیها (attributes) و روابط (relationships) با سایر موجودیتها است. برای مثال، در یک سیستم مدیریت فروشگاه، مشتریان، محصولات و سفارشها میتوانند به عنوان Entity مدلسازی شوند.
یک Aggregate مجموعهای از موجودیتها است که با هم در یک واحد معنایی گردآوری شدهاند و توسط یک Aggregate Root مدیریت میشوند. Aggregate معمولاً برای کنترل یکدستی عملیاتهای مرتبط با یک یا چند موجودیت استفاده میشود و ممکن است شامل محدودیتها و قوانین دامنهای خاص باشد.
یک Aggregate میتواند تنها شامل یک موجودیت باشد. این اغلب در مواردی رخ میدهد که نیاز باشد یک موجودیت خاص به تنهایی قوانین و محدودیتهای دامنهای را اعمال کند، یا اینکه طراحی سیستم به گونهای باشد که انتظار میرود در آینده موجودیتها یا Value Objects بیشتری به آن Aggregate اضافه شوند.
از Value Object ها به عنوان مقادیر کمکی و یا جزئیاتی که به Entity ها یا سایر موجودیتها ارتباط مستقیمی ندارند، استفاده میشود.
برای روشنتر شدن این تفاوت، بیایید به این مثال نگاه کنیم:
در یک سیستم مدیریت کتابخانه، کتاب میتواند به عنوان یک Entity مدلسازی شود. هر کتاب دارای یک شناسه یکتا (مانند شماره شابک) است و ممکن است ویژگیهایی مانند عنوان، نویسنده و تعداد در دسترس را داشته باشد.
اما، اگر به مفهوم مقداری مانند "تاریخ انتشار" فکر کنید، این یک مثال از یک Value Object است. تاریخ انتشار یک مقدار است که ممکن است در بسیاری از موجودیتها مانند کتابها، مقالات، فیلمها و ... استفاده شود. این مقدار همیشه به تنهایی مفهومی معنیداری ندارد.