خانه / OOP / DDD / ِِِِDDD Aggregates

ِِِِDDD Aggregates

بر طبق تعریف آقای Eric Evans:

An AGGREGATE is a cluster of associated objects that we treat as a unit for the purpose of data changes.

Each AGGREGATE has a root and a boundary. The boundary defines what is inside the AGGREGATE. The root is a single, specific ENTITY contained in the AGGREGATE.

And:

The root is the only member of the AGGREGATE that outside objects are allowed to hold references to.

 

برخلاف اینکه ممکن است این مفهوم بسیار ساده به نظر برسه؛ اما همانطور که آقای Vaughn Vernon اشاره می کنند؛ یکی از مهمترین و اصلی مفاهیم تکنیکال DDD همین دو مفهوم مهم تشخیص و استفاده از آن هست.

“aggregates are one of the most important DDD patterns and one of the most misunderstood ones”.

همانطور که خود اصل و مفهوم DDD نه یک روش Coding که شامل مجموعه ای از روش ها و پترن ها و الگوها جهت کشیدن دانش و اصلاعات از دامین مسئله می باشد؛ در بحث تکنیکال در DDD هم ما بدنبال این هستیم که طراحی هایی که انجام می دهیم منعکس کننده و نمایش دهنده ی مدلهای مفهومی دنیای واقعی باشد. مثلا در صورت تغییر؛ ایجاد؛ یا واکشی یک واحدی از اطلاعات باید مطمئن شد که آیا این واحد در نظر گرفته شده؛ در دنیای واقعی و از دید بیزینس هم یک جز واحد می باشد یا خیر. به عبارتی قصد برهم زدن integrity از دید بیزینس را نخواهیم داشت. از این مورد نباید غافل شد که model کردن و model  کردن صحیح یکی از مشکلترین کارها می باشد.

در کانتکست DDD؛ Aggregate مفهومی است که شامل مجموعه ای از domain object ها که همه اینها با هم به عنوان یک واحد منطقی می توتنند در نظر گرفته شوند. یک مثال ساده و معروف از این domain objectها شامل Order و line-item های مربوط به آن order می باشد. مثالی دیگر می تواند Person و لیست Address های مرتبط با باشد. هرچند که اینها object ها جدا هستند ولی در عمل بهتر این می باشد که بصورت یک واحد در نظر گرفته شوند. و این هم به یک دلیل ساده می باشد؛ و آن اینکه مثلا آدرس های مرتبط با یک فرد بدون در نظر گرفتن خود فرد ممکن است معنی نداشته باشد. برای line-item های order نیز این امر می تواند صادق باشد. در واقع تمامی این objectها و componentهای درون Aggregate ها کامپوننت هایی هستند که در صورت تجمیع و ترکیب با هم مفهوم یک object یا entity واحد که از دید بیزینس نیز دارای مفهوم می باشد؛ را ایجاد می کنند.

Aggregate ها در واقع boundary consistency هستند اطراف این object های جدا از هم ولی منطقا مرتبط. در هر مجموعه Aggregate یکی از component ها یه عنوان Aggregate Root در نظر گرفته می شود. و تمامی ارتباطات و رفرنس های خارج از Aggregate با درون Aggregate از طریق این Aggregate Root انجام میشود. وظیفه ای اصلی Aggregate Root حفظ integrity کل Aggregate ها(هدفی که این مجموعه Object های جدا از هم رو به عنوان یک واحد در نظر گرفتیم) می باشد.

پس از تعریف Aggregate Rootها تمامی دسترسی ها؛ تغییرات؛ واکشی ها و … objectهای درون Aggregate از طریق این Aggregate Root انجام خواهد شد. مثلا در مورد line-itemها کلاینت دیگر هیچوقت اقدام به load کردن یک line-item بصورت مستقیم نمی کند. بلکه اینکار از طریق Aggregate Root انجام می شود.

خوب همانطور که متوحه شده اید ایده ای اصلی Aggregate Root از یک ایده بسیار ساده و پایه ای OOP نشات گرفته شده، یعنی Encapsulation. وظیفه ی کپسوله سازی ساختار درونی تمامی Aggregate ها از طریق Aggregate Root انجام می شود. Aggregate Root به عنوان Entry Point برای دسترسی به ساختار درونی Aggregate ها عمل می کند.

یکی از نکاتی در اینجا باید برای objectهای درون یک Aggregate در نظر گرفت بحث lifetimeاین objectها می باشد. بدیهی درون چنین کانسپت هایی lifetime این object ها محدود می شود به lifetime خود aggregate.

درباره ی masoud@admin

همچنین ببینید

مقدمه ای بر همزمانی در دات نت

Introduction on Concurrency in .NET همانطور که قبلا هم بیان کردم یکی از Concern ها …

Service Registration in Microservice

Service Registry در پست قبلی در باره ی یکی از جنبه های مهم معماری های …

پاسخ دهید

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

در تلگرام هم همراه شما هستم

اگر علاقمند به معماری نرم افزار و مبحث محبوب مایکروسرویس هستید؛ در کانال با ما همراه باشید. اطلاعات مفید زیادی در این کانال انتظار شما را می کشند. فقط کافیست دکمه ی پیوستن را بفشارید.

پیوستن بستن