ReArch = رویکرد بازتصور شده به طراحی و معماری اپلیکیشنها
ما باید تعاریف رو بیان کنیم و اولویتها و توضیحات دادهها رو فراهم کنیم.
ما باید روابط رو بیان کنیم، نه رویهها.-- گریس موری هاپر، مدیریت و کامپیوتر آینده (۱۹۶۲)
بهطور خاص، ReArch یه راهحل جدید برای اینهاست:
- ⚡️ مدیریت حالت
- 🧮 محاسبات افزایشی
- 🧱 مهندسی نرمافزار مبتنی بر کامپوننت
و همراه با اینها، این امکانات رو هم داره:
- واکنشپذیری از طریق کد اعلانی (declarative)
- اتصال سست (loose coupling) و تستپذیری بالا
- ترکیبپذیری در سطح اپلیکیشن از طریق رویکرد تابعی به وارونگی وابستگی
- ترکیب ویژگیها از طریق اثرات جانبی
کپسولهات (قطعات کپسولهشده از حالت) رو توی سطح بالا تعریف کن:
// کپسولها بهسادگی توابعی هستن که یه 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;// کپسولها بهسادگی توابعی هستن که یه 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
}