انجمن برنامه نویسان البرز

تبلیغات

Aggregate و Facade Pattern در Domain Driven Design


در معماری Domain Driven Design یا DDD مفهومی به نام Aggregate وجود دارد. این مفهوم یک implementation تمام عیار از facade pattern است. قبل از اینکه به توضیح بیشتر aggregate بپردازم، بیایید الگوی Facade را با هم مرور کنیم.

Facade Pattern

تقریبا تمام Design Pattern ها یک ویژگی مشترک دارند. اینکه وقتی برای اولین بار آنها را میخوانید، اصلا متوجه کاربردشان نمیشوید و نمیفهمید به چه دردی میخورند :))

Facade Pattern هم از این قاعده مستثنی نیست.

اما Facade Pattern اصلا چه میگوید؟

Aggregate and Facade Pattern فرض کنید که من در کدم ۳ کلاس با اسم های Class1 و Class2 و Class3 دارم. دقیقا مطابق شکل. این کلاس ها متدهایی دارند که با هم تعامل دارند. مثلا وقتی که کلاس اول متد A را اجرا کند. بعد از آن میخواهیم از کلاس دوم متد B را اجرا کنیم و به همین ترتیب پیش برویم. در یک جمله یعنی اینکه میخواهیم چند متد از چند کلاس را فراخوانی کنیم و عملیاتی را انجام بدهیم. معمولا این کار را به این صورت انجام میدهیم که پشت فرم یا درون کنترلر یا درون کلاس یا هر جایی که نیاز باشد، از این کلاس ها نمونه یا Instance هایی میسازیم و متدهای آنها را فراخوانی میکنیم.

Facade Pattern هم کلاسی است که دقیقا همین کار را انجام میدهد. یعنی ما کلاسی داریم که متغیرها یا فیلدهایی از جنس Class1 و Class2 و Class3 دارد و متدهای آنها را فراخوانی میکند. شاید یک نمونه کد برای شما گویا تر باشد:


    public class Class1
    {
        public void MethodA()
        {
            //Do SOmething
        }
    }

    public class Class2
    {
        public void MethodB()
        {
            //Do SOmething
        }
    }

    public class FacadeClass
    {
        private Class1 _class1Field=new Class1();
        private Class2 _class2Field = new Class2();

        public void JobMethod()
        {
            _class2Field.MethodB();
            _class1Field.MethodA();
            //...
        }
    }

همانطور که در کد میبینید، کلاس۱ و کلاس۲ متدهایی دارند که در متد JobMethod در کلاس Facade استفاده شده اند.

ساده بود نه؟ همه Design Pattern ها ساده هستند. اما موضوع پیچیده این است که بفهمیم در چه جاهایی باید استفاده شوند. اگر کمی دقت کنید، حتما نمونه های استفاده از این Pattern را زیاد دیده اید. Controller ها در MVC و سرویس ها در Domain Driven Design همه و همه نمونه های استفاده از این Pattern هستند.

 

Aggregate

اگر با معماری DDD آشنایی ندارید، شاید این پاراگراف چندان به کار شما نیاید.

Aggregate یک مفهوم است که در معماری مبتنی بر Domain استفاده میشود. جان مطلب این است که در Domain تعدادی Entity وجود دارد. گاهی این Entity ها در تعامل با یکدیگر کار میکنند. بیایید یک مثال را در نظر بگیریم:

Aggregate and Facade Pattern
همانطوری که در شکل مشخص است، ما با ۴ Entity سر و کار داریم: Order یا سفارش – Order Item یا اقلام سفارش – VatRate و Customer

همانطور که قبلا صحبت کرده ایم، Domain Driven Design یک نوع توسعه مبتنی بر فرآیند است. اینطور در نظر بگیرید که یک مشتری میخواهد یک سفارش ثبت کند. این فرآیند چطور انجام میشود؟ مشتری یک Order میسازد و سپس تعدادی OrderItem میسازد و ID مربوط به Order را در OrderItem قرار میدهد؟ خیر. در دنیای واقعی ابدا اینطور نیست. در دنیای واقعی، مشتری یک سفارش میدهد و کالاهای مورد نظرش را اعلام میکند – سفارش میدهد –

پس مشتری اطلاعی ندارد که OrderItem چیست. مشتری فقط سفارش و کالا را میشناسد. و رویه به این صورت است که تعدادی کالا را سفارش میدهد.

Aggregate ها در واقع تعدادی از کلاس ها هستند که به طور گروهی و وابسته به هم، کار میکنند و از بیرون، فقط یکی از آنها دیده میشود! پس در پروسه سفارش دادن، مشتری فقط کلاس Order را میبیند و از جزئیات قضیه، آگاهی ندارد. درست مثل یک برگه کاغذ سفارش که ما یا در آن اسم کالایی را مینویسیم یا کالایی را از آن خط میزنیم. یا از Add Item استفاده میکنیم یا Remove Item.

یعنی در واقع مشتری فقط با کلاس Order سر و کار دارد و توسط متدهای AddItem یک کالا را اضافه و توسط RemoveItem یک کالا را حذف میکند. به این صورت، درگیر پیچیدگی های داخلی روابط میان Order و OrderItem و سایر چیزها نمیشود.

پس مجموع کلاس های Order,OrderItem و VatRate با هم تشکیل یک Aggregate میدهند. این Aggregate را یک فرم سفارش در نظر بگیرید که پر میشود و بعد از آن با این فرم سر و کار داریم

 

نتیجه گیری

همانطور که میبینید، Agrregate ها میتوانند به بهترین شکل توسط Facade Pattern پیاده سازی بشوند. در نظر بگیرید که کلاس Order شما یک Facade باشد و OrderItem را به صورت یک قیلد داشته باشد. سپس از طریق متد AddItem به OrderItem اقلامی را اضافه کند.

در مفاله بعدی درباره تفاوت های Order Item و Order صجبت خواهیم کرد.




کلمات کلیدی : DDD

نظر بدهید

یک دیدگاه برای “Aggregate و Facade Pattern در Domain Driven Design

  • مجتبی طغیانی گفته
    13 ژوئن 18

    ساده و عالی
    دست شما درد نکنه مهندس جان