در این مقاله میخواهیم بررسی کنیم که ریداکس چیست و چه اهمیتی درزمینهی توسعهی وب دارد. بر اساس تعریف، ریداکس یک نگهدارندهی حالتِ قابل پیشبینی (Predictable State Container) برای اپلیکیشنهای جاوا اسکریپت است. برای درک بهتری از این تعریف، باید چند مورد از اصطلاحات این تعریف را برای شما روشن کنیم.
توضیح را ابتدا از واژهی حالت (State) شروع میکنیم. در واژگان برنامهنویسی و برنامهها، حالت نشاندهندهی همهی چیزهایی است که باهم ترکیب میشوند تا یک اپلیکیشن اجرا شود.
کلمهی بعدی، قابل پیشبینی (Predictable) است. این عبارت به معنی حالتی است که بدون وابستگی داشتن به محیطی که در آن در حال اجرا است؛ ثابت باشد.
حالا میتوانیم روی نگهدارنده (Container) بحث کنیم. نگهدارنده، یک اپلیکیشن کاملاً کپسوله شده است که همهی چیزهای مهم برای اجراشدن را شامل میشود.
بنابراین، یک نگهدارنده ی حالتِ قابل پیشبینی یک اپلیکیشن نگهداری شده است که قابلیت ادامهی اجرا را در یک حالت ثابت دارد. قطعاً این تعریف در مورد ریداکس، در مورد اپلیکیشنی است که با جاوا اسکریپت نوشته شده است.
یک نگاه عمیقتر به حالتها
این مثال را در نظر بگیرید. شما روی اسمارتفون خودتان از اپلیکیشن X استفاده میکنید. با استفاده از آن کارهایی انجام میدهید و سپس به اپلیکیشن Y رفته و روی آنهم کارهای متفاوتی انجام میدهید. وقتی در حال استفاده از اپلیکیشن Y هستید؛ یادتان میآید که کاری را که باید در اپلیکیشن X انجام میدادید را فراموش کردهاید. بنابراین به اپلیکیشن اول برمیگردید. حالا وقتی X را باز میکنید؛ آن را در همان حالتی میبینید که آخرین باز از آن خارجشدهاید.
این مفهوم حالت یا State است. اما بازهم میخواهیم بیشتر از این توضیح دهیم.
سه قانون برای حالتها وجود دارد:
- همیشه حالت یک اپلیکیشن در یک آبجکت خاص جاوا اسکریپت ذخیره میشود.
- باوجوداینکه حالت، از نوع فقط خواندنی (Read-Only) است؛ اما میتواند با توصیف یک تغییر با استفاده از یک اکشن در جاوا اسکریپت، تغییر یابد.
- تغییرات یک حالت، با استفاده از یک تابع کاهشدهنده اجرا میشود. این تابع ابتدا حالت فعلی را دریافت میکند. سپس با استفاده از یک اکشن، اگر تغییری صورت گرفته باشد؛ حالت جدید را برمیگرداند. یا هم درصورتیکه تغییری صورت نگرفته باشد؛ حالت اصلی را برمیگرداند.
مواردی که تا اینجا گفتیم؛ موضوعات پایهای هستند. اما ریداکس شامل جنبههای خیلی بیشتری است.
ریداکس چیست؟
ریداکس از جایی پدیدار شد که فیسبوک با ساختار مدل کنترلکنندهی نمایشی به مشکلاتی برخورد کرد. این ساختار یک الگوی طراحی نرمافزار است که یک اپلیکیشن را به سه کامپوننت تجزیه میکند: مدل (منطق مبتنی بر داده) ، نمایش (رابط کاربری اپلیکیشن) و کنترلکننده (رابط بین مدل و نمایش) . وقتی فیسبوک به مقیاس بندی گسترده نیاز پیدا کرد؛ ساختار قبلی آنها یعنی ساختار MVC ، پاسخگوی نیاز آنها نبود.
فیسبوک پس از مواجهه با این مشکل، از Flux رونمایی کرد. Flux یک روش یکطرفه برای بهروزرسانی کامپوننت نمایش و مدیریت اکشنهای سمت کاربر است.
در ژوئن 2015 ، آقای آبراموف (Dan Abramov) ریداکس را برمبنای Flux فیسبوک و زبان برنامهنویسی Elm ساخت. بزرگترین تغییراتی که آبراموف در ریداکس ایجاد کرد این بود که او فقط از یک محل ذخیرهسازی (Store) استفاده کرد و تقسیمکننده (Dispatcher) را حذف کرد.
یک محل ذخیرهسازی روشی است که مجموعهی دادهها دائماً مدیریت و ذخیرهسازی شوند. Flux از چندین محل ذخیرهسازی استفاده میکرد؛ اما ریداکس فقط از یک محل استفاده میکند. بنابراین اگر شما از تعداد بیشماری از کامپوننتها در یک اپلیکیشن استفاده کنید؛ فقط یک محل ذخیرهسازی برای مدیریت حالتهای آن کامپوننتها وجود خواهد داشت. این محل ذخیرهسازی میتواند هر حالتی را به حالت دیگر ببرد که همین موضوع آن را به یک مدل کاملاً مؤثر و کارآمد تبدیل میکند.
تقسیمکننده هم یک برنامهی خاص است که با یک زمانبند (Scheduler) در ارتباط است. این تقسیمکننده هر فرآیند را برای اجرا به حالت مطلوب ارجاع میدهد.
آیا ریداکس یک فریمورک است؟
بهطور خلاصه جواب این سؤال، خیر است. ریداکس بهجای اینکه بهصورت سنتی یک کتابخانهیا فریمورک باشد؛ یک ساختار جریان داده برای اپلیکیشنها است. توصیه میشود برای استفاده از ریداکس، از Toolkit ریداکس استفاده کنید. عناصر سازندهی بنیادی ریداکس، موارد زیر هستند:
- اکشن (Action)
- کاهشدهنده (Reducer)
- میانافزار (Middleware)
- محل ذخیرهسازی (Store)
یک فریمورک نرمافزاری، یک پلتفرم برنامهنویسی است که ممکن است شامل کتابخانههایی از کدها، یک کامپایلر و ابزارهای ضروری برای ایجاد اپلیکیشنها باشد. اما ریداکس فقط یک کتابخانهی سادهی جاوا اسکریپت، با یک وظیفه (Task) خاص است: مدیریت حالتها در اپلیکیشنهای جاوا اسکریپت.
بنابراین، درواقع ما با استفاده از ریداکس، اپلیکیشن نمیسازیم. بلکه از آن استفاده میکنیم تا از توانایی مدیریت حالتها در جاوا اسکریپت اطمینان پیدا کنیم.
بهعلاوه، ریداکس معمولاً به همراه کتابخانههایی مثل ریاکت و انگولار استفاده میشود. با ترکیب این موارد، توسعهی اینترفیسهایی که به حالتهای مطلوب وابسته هستند؛ امکانپذیر میشود.
همچنین، شما میتوانید با استفاده از یک فریمورک، یک اپلیکیشن کامل را کدنویسی کنید. اما وقتیکه آن اپلیکیشن پیچیدهتر میشود؛ استفاده از فریمورک برای مدیریت لیست دائماً در حال گسترش کامپوننتها و حالتهای آن، خیلی مشکل و حتی گاهی غیرممکن میشود. اما در مورد ریداکس اینطور نیست.
موارد استفاده از ریداکس چیست؟
در مورد برنامهنویسی، از ریداکس در اپلیکیشنهایی استفاده میشود که دادههای آن بین کامپوننتها به اشتراک گذاشته میشوند. برای مثال، فرض کنید شما یک برنامه دارید که از یک کامپوننت برای لاگین استفاده میکند. دادههای کامپوننت لاگین، با کامپوننت وضعیت کاربر به اشتراک گذاشته میشود. بهغیراز مواردی که استثنا هستند؛ از ریداکس بیشتر برای اپلیکیشنهای موبایل استفاده میشود. بعضی از برنامههایی که از ریداکس استفاده میکنند عبارتاند از:
- Debugger مرورگر فایرفاکس
- Franklin – یک ابزار ذخیرهی دنبالهی DNA ها
- GitHunt – مشابه Reddit است برای GitHub
- Datamaps – یک ابزار برای نمایش نقشهها
- ویرایشگر Glsl – یک ویرایشگر WebGL
- Favesound – یک ابزار پخش در Soundcloud
- Podbaby – یک برنامهی پخش پادکست در وب
- Gitchecker – نمایشدهندهی وضعیت پروژههای GitHub
مواردی که استفاده از ریداکس برای آنها کمتر مشاهدهشده:
- حالتهای رابطهای کاربری
- دادههای فرمی
- دادههای API ها
- ادامهی یک حالت بهطور خودکار
اما چیزی که بیشتر موردتوجه قرار میگیرد؛ لیست شرکتهای بزرگی است که در حال حاضر از ریداکس استفاده میکنند. این شرکتها شامل موارد زیر هستند:
- Robinhood
- Slack
- DoorDash
- Patreon
ریداکس، فرانتاند است یا بکاند؟
قبل از اینکه این سؤال را جواب بدهیم؛ خیلی ساده مفهوم فرانتاند و بکاند را باهم بررسی میکنیم.
- فرانتاند، به معنی رابط کاربری یا نرمافزار سمت کلاینت است.
- بکاند به مفهوم سرور است.
با توجه به این مفاهیم، ریداکس در کدام سمت قرار دارد؟ جواب ساده به این سؤال، هردو است. از ریداکس میتوان برای برنامههایی استفاده کرد که توانایی قابل پیشبینی بودن حالتهای ذخیرهسازی، برای آنها از اولویت بالایی برخوردار است.
باید بدانید که میتوان از ریداکس برای سمت کلاینت یا فرانتاند و رابط کاربری استفاده کرد. اما، ازآنجاییکه ریداکس، همان جاوا اسکریپت است؛ میتوانیم از آن در سمت سرور یا بکاند هم استفاده کنیم. البته ازآنجاییکه بهصورت سنتی، بکاند را به بدون حالت (Stateless) در نظر میگیرند؛ ممکن است این مسئله کمی متناقض به نظر برسد.
یک مثال خوب از استفاده از ریداکس در بکاند، بازیهای مالتی پلیری هستند که در مرورگرها اجرا میشوند. وضعیت هر بازیکن در این بازیها باید در سرور ذخیره شود تا همهی بازیکنها دید یکسانی از بازی داشته باشند. در این مثال، سرور حالت را ذخیره میکند و بهعنوان تنها منبع قابلاعتماد شناخته میشود.
آیا هنوز هم ریداکس مناسب است؟
مطالب زیادی مبنی بر از بین رفتن ریداکس و جایگزین شدن ابزار دیگری بهجای آن، در اینترنت وجود دارد. درواقع ریداکس هنوز هم خیلی مناسب است. با استفاده از پکیج رسمی ابزارهای ریداکس که برای سادهسازی موارد استفاده از آن، امکانات مفیدی را در اختیار ما قرار داده است؛ استفاده از این کتابخانهی جاوا اسکریپت، از همیشه سادهتر شده است.