---
title: اثرات جانبی
description: با اصول اولیه اثرات جانبی در ReArch آشنا شوید.
---

# اثرات جانبی
هرچند اثرات جانبی ممکنه توی نگاه اول گیج‌کننده به نظر بیان، ولی دلیل منحصربه‌فرد بودن ReArch همینن.  
هر وقت یه قابلیت توی پیاده‌سازی اصلی ReArch موجود نباشه،  
احتمالاً فقط باید یه اثر جانبی بسازی تا اضافه‌ش کنی!

اثرات جانبی توی پیاده‌سازی دارت/فلاتر به شدت از هوک‌های React الهام گرفته شدن،  
ولی یه سری تفاوت‌های کلیدی دارن.  
توی پیاده‌سازی Rust، اثرات جانبی یه پارادایم کاملاً جدید هستن و ممکنه نیاز به یه کم تطبیق داشته باشن.

## نظریه
<Info>
  این بخش یه مقدار عمیق‌تر به نظریه می‌پردازه نسبت به بخش‌های دیگه مستندات؛  
  اگه بخوای می‌تونی ازش رد شی و مستقیم بری سراغ مثال‌ها.
</Info>

توی ReArch، اثرات جانبی این‌طوری مدل‌سازی شدن:  
- یه سری داده تغییرپذیر خصوصی (که فقط خود اثر جانبی بهشون دسترسی داره)  
- یه راه برای تغییر دادن اون داده خصوصی *خارج* از ساخت (که به نوبه خودش بازسازی رو فعال می‌کنه)  

بعد، اثرات جانبی یه API ارائه می‌دن که دور داده خصوصی‌شون و هر تغییر خارجی‌ای می‌پیچه.

برای یه مثال ملموس، بیایم اثر جانبی state رو بررسی کنیم.  
API اثر جانبی state، حالت فعلی و یه تابعی برای تنظیم اون حالت فعلیه.  
داخلاً، داده تغییرپذیر خصوصی فقط خود حالت فعلیه،  
و تغییری که بازسازی رو فعال می‌کنه فقط یه تابعه  
که داده خصوصی (حالت فعلی) رو به یه حالت جدید تنظیم می‌کنه.

هرچند ممکنه به نظر نیاد،  
ولی می‌تونی *هر* اثر جانبی‌ای رو با همین روش مدل‌سازی کنی.

به‌علاوه، در حالی که کپسول‌ها یه گراف جریان داده/وابستگی تشکیل می‌دن، اثرات جانبی یه *درخت* تشکیل می‌دن.  
این به اثرات جانبی اجازه می‌ده که اثرات جانبی خصوصی خودشون رو داشته باشن، و ترکیب‌پذیری رو ساده‌تر می‌کنه.

## یه مثال
<Error>
  توی دارت، به‌صورت شرطی `use.fooBar()` رو فراخوانی نکن!  
  توی Rust، به‌صورت شرطی `register(effect())` رو فراخوانی نکن!  
  این کار یه خطا به حساب میاد؛  
  *هرگز* `use.fooBar()` یا `register(effect())` رو توی یه شرط `if` نپیچ.  
  ReArch احتمالاً به محض اینکه این رو خراب کنی اعتراض می‌کنه، ولی نمی‌تونه ۱۰۰٪ موارد رو بگیره.
</Error>

اینجا یه مثال سریع داریم که نشون می‌ده چطور از چند اثر جانبی استفاده کنی.  
برای اطلاعات بیشتر، کتابخونه اثرات جانبی و مستندات API رو ببین.

<CodeGroup title="استفاده از اثرات جانبی">
  ```dart
  // یه کپسول اسباب‌بازی که از چند اثر جانبی استفاده می‌کنه  
  (Something, void Function(int)) usesSideEffects(CapsuleHandle use) {
    // اول، بیایم یه حالت تغییرپذیر بسازیم  
    final (state, setState) = use.state(1234);

    // بعد، بیایم یه نمونه از یه شیء با استفاده از این حالت بسازیم  
    final somethingMadeWithState = use.memo(() => Something(state), [state]);

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

	// ...و بیایم اون شیء رو همراه با یه راه برای تنظیم حالت برگردونیم  
    return (somethingMadeWithState, setState);
  };
  ```

  ```rust
  // کپسولی که تعداد دفعاتی که ساخته می‌شه رو می‌شماره  
  fn count_builds(CapsuleHandle { mut get
