---
title: ReArch
description: صفحه اصلی مستندات ReArch.
---

# ReArch

<p align="center">
<img src="https://github.com/GregoryConrad/rearch-docs/blob/main/assets/banner.jpg?raw=true" width="100%" alt="بنر" />
</p>

<p align="center">
ReArch = رویکرد بازتصور شده به طراحی و معماری اپلیکیشن‌ها

> ما باید تعاریف رو بیان کنیم و اولویت‌ها و توضیحات داده‌ها رو فراهم کنیم.  
> ما باید روابط رو بیان کنیم، نه رویه‌ها.  
>
> -- گریس موری هاپر، _مدیریت و کامپیوتر آینده_ (۱۹۶۲)
</p>

---

## ویژگی‌ها
به‌طور خاص، ReArch یه راه‌حل جدید برای این‌هاست:  
- ⚡️ مدیریت حالت  
- 🧮 محاسبات افزایشی  
- 🧱 مهندسی نرم‌افزار مبتنی بر کامپوننت  

و همراه با این‌ها، این امکانات رو هم داره:  
- واکنش‌پذیری از طریق کد اعلانی (declarative)  
- اتصال سست (loose coupling) و تست‌پذیری بالا  
- ترکیب‌پذیری در سطح اپلیکیشن از طریق رویکرد تابعی به وارونگی وابستگی  
- [ترکیب ویژگی‌ها از طریق _اثرات جانبی_](https://blog.gsconrad.com/2023/12/22/the-problem-with-state-management.html)

## به‌طور خلاصه
کپسول‌هات (قطعات _کپسوله‌شده_ از حالت) رو توی سطح بالا تعریف کن:
<CodeGroup title="تعریف کپسول‌ها">
  ```dart
  // کپسول‌ها به‌سادگی توابعی هستن که یه CapsuleHandle می‌گیرن.  
  // CapsuleHandle بهت اجازه می‌ده داده‌های کپسول‌های دیگه رو بگیری،  
  // و علاوه بر اون از یه سری اثرات جانبی متنوع هم استفاده کنی.  

  // این کپسول خاص یه شمارش رو از یه اپلیکیشن نمونه شمارش کلاسیک مدیریت می‌کنه،  
  // و از اثر جانبی state استفاده می‌کنه.  
  (int, void Function()) countManager(CapsuleHandle use) {
    final (count, setCount) = use.state(0);
    return (count, () => setCount(count + 1));
  }

  // این کپسول مقدار فعلی شمارش رو به علاوه یک برمی‌گردونه.  
  int countPlusOneCapsule(CapsuleHandle use) => use(countManager).$1 + 1;
  ```

  ```rust
  // کپسول‌ها به‌سادگی توابعی هستن که یه CapsuleHandle می‌گیرن.  
  // CapsuleHandle بهت اجازه می‌ده داده‌های کپسول‌های دیگه رو بگیری،  
  // و علاوه بر اون از یه سری اثرات جانبی متنوع هم استفاده کنی.  

  // این کپسول یه شمارش و یه راه برای افزایش اون شمارش رو فراهم می‌کنه.  
  fn count_manager(CapsuleHandle { register, .. }: CapsuleHandle) -> (u8, impl CData + Fn()) {
      let (count, set_count) = register(effects::state::<Cloned<_>>(0));
      let increment_count = move || set_count(count + 1);
      (count, increment_count)
  }

  // این کپسول شمارش رو به علاوه یک برمی‌گردونه.  
  fn count_plus_one_capsule(CapsuleHandle { mut get, .. }: CapsuleHandle) -> u8 {
      let (count, _increment_count) = get(count_manager);
      count + 1
  }
  ```
</CodeGroup>
