Light logo

کارخانه‌ها

با اصول اولیه کارخانه‌ها در ReArch آشنا شوید.

کارخانه‌ها

کارخانه‌ها (که گاهی بهشون کپسول‌های کارخانه هم می‌گن) اصلاً مختص ReArch نیستن؛
در واقع، ReArch این مفهوم رو از برنامه‌نویسی شیءگرا (OOP) قرض گرفته!
طبق تعریف ویکی‌پدیا:

در برنامه‌نویسی شیءگرا، کارخانه یه شیء برای ساختن اشیای دیگه‌ست؛
به‌صورت رسمی، یه تابع یا متدیه که اشیایی با پروتوتایپ یا کلاس متغیر برمی‌گردونه.

توی ReArch، کارخانه‌ها فقط کپسول‌هایی هستن که اشیا رو به‌صورت آنی (on-the-fly) می‌سازن
و می‌تونن یه سری پارامتر غیرکپسولی اضافی هم بگیرن.
هرچند کارخانه‌ها ممکنه توی نگاه اول پیچیده به نظر بیان،
ولی در واقع فقط یه نوع شکر نحوی (syntactic sugar) ساده هستن.

یه مثال

مثال کپسول کارخانه
int dependency1Capsule(CapsuleHandle _) => 0;
String dependency2Capsule(CapsuleHandle _) => 'سلام دنیا!';

MyObject Function(String, int) myObjectFactory(CapsuleHandle use) {
  // توجه کن که ما فقط قبل از برگردوندن closure کارخانه از `use` استفاده می‌کنیم؛  
  // این مهمه، چون نمی‌تونی `use` رو توی یه فاصله زمانی ناهمزمان (asynchronous gap) فراخوانی کنی.  
  // به عبارت دیگه، *توی بدنه خود کارخانه از USE استفاده نکن*.  
  final dep1 = use(dependency1Capsule);
  final dep2 = use(dependency2Capsule);
  return (dep3, dep4) => MyObject(dep1, dep2, dep3, dep4);
}

void usesFactoryCapsule(CapsuleHandle use) {
  final MyObject obj = use(myObjectFactory)('یه رشته', 1234);
  obj.doSomething();
}

کش کردن اشیای ساخته‌شده

اگه نیاز داری:

  • یه شیء ساخته‌شده توسط کارخانه رو کش کنی (مثلاً تا وقتی نمونه کارخانه تغییر نکرده)
  • اشیای قدیمی ساخته‌شده توسط کارخانه رو حذف کنی تا جلوی نشتی (leak) گرفته بشه (مثلاً وقتی یه شیء جدید ساخته می‌شه)

به کد زیر یه نگاه بنداز.

اگه با React یا flutter_hooks آشنا باشی، این کار برات خیلی طبیعی به نظر می‌رسه.
برای اطلاعات بیشتر، صفحه مستندات مربوط به اثرات جانبی رو ببین.

dart
کش کردن اشیای ساخته‌شده با کارخانه‌ها
MyCustomObject defaultParamMyCustomObjCapsule(CapsuleHandle use) {
  // کپسول کارخانه ما:  
  final objFactory = use(objFactoryCapsule);

  // یه کپسول دلخواه که ممکنه باعث بازسازی (rebuild) بشه  
  // حتی اگه خود objFactory تغییر نکنه:  
  final someString = use(someCapsule);

  // فقط وقتی objFactory یا someString تغییر کردن، myObj رو دوباره بساز  
  final myObj = use.memo(() {
    return objFactory(someString);
  }, [objFactory, someString]);

  // هر وقت myObj تغییر کرد، شیء جدید رو برای حذف ثبت کن  
  use.effect(() => myObj.dispose, [myObj]);

  return myObj;
}

این ترکیب از memo و effect خیلی رایجه،
مخصوصاً وقتی با FooBarControllerها کار می‌کنی،
پس بهتره زودتر یاد بگیری که چطور ازشون استفاده کنی.