Overview of Redux and Redux Toolkit
Tags: redux, webdev, learning, frontend
Published: 2024-02-18 17:04:35

বর্তমান সময়ে ওয়েব ডেভেলপমেন্টের জগতে জটিল এবং ডাইনামিক অ্যাপ্লিকেশন তৈরি করা খুবই সাধারণ। আর এই ধরনের কাজে স্টেট ম্যানেজমেন্ট একটি গুরুত্বপূর্ণ বিষয়। Redux হলো একটি জনপ্রিয় জাভাস্ক্রিপ্ট লাইব্রেরি, যা ডেভেলপারদেরকে স্টেট ম্যানেজমেন্টে করতে সাহায্য করে। এই ব্লগে আমরা রিডাক্স কী, কেন এবং কীভাবে কাজ করে সে সম্পর্কে বিস্তারিত আলোচনা করব। 

## Redux কি?

রিডাক্স হলো জাভাস্ক্রিপ্টের জন্য একটি লাইব্রেরি যা অ্যাপ্লিকেশনের স্টেট ম্যানেজমেন্টকে সহজ করে তোলে। এটি একটি পৃথক স্টোরে অ্যাপের সমস্ত ডাটা সংরক্ষণ করে এবং কঠোর  কিছু নিয়মাবলি মেনে চলে যা ডাটার সামঞ্জস্য ও ধারাবাহিকতা নিশ্চিত করে। এটি প্রধানত React এর সঙ্গে ব্যবহৃত হয় তবে অন্যান্য JavaScript এর অন্যান্য  লাইব্রেরিগুলোর সাথেও এটি ব্যবহার করা যেতে পারে।  রিডাক্স ব্যবহার করা হলে অ্যাপ্লিকেশনের স্টেট কন্ট্রোল করা সহজ হয় এবং ডেটা ফ্লো স্থির হয়।  

## রিডাক্স ব্যবহারের উদ্দেশ্য?

রিডাক্স এর একটি গুরুত্বপূর্ণ লক্ষ্য হলো ডেটা এবং স্টেটকে একটি সিঙ্গল সোর্স অফ ট্রুথে রাখা। অর্থাৎ এটি অ্যাপ্লিকেশনের স্থানীয় অথবা গ্লোবাল স্টেটের ভ্যারিয়েবলগুলি সবাই একই স্থানে থাকতে হয়। এটি মানে একই ডেটা বা স্টেট পুনরাবৃত্তি করতে হবে না, সবকিছুই একটি স্থানে থাকতে থাকবে যাতে সবাই তাকে অ্যাক্সেস করতে পারে।

## Redux এর  মূল বৈশিষ্ট্যগুলি হল:

**১. অনুমানযোগ্য (Predictable):**

- রিডাক্স নির্দিষ্ট কিছু নিয়ম অনুসরণ করে, যা স্টেট পরিবর্তনের ফলাফল আগে থেকেই অনুমান করা সহজ করে তোলে।
- অ্যাকশনগুলো সর্বদা একই ফলাফল দেয়, তাই আপনি নিশ্চিত থাকতে পারেন যে অ্যাপ্লিকেশন ঠিকঠিক কীভাবে আচরণ করবে।
- এই নিয়মাবলির ফলে ডিবাগিং এবং টেস্টিং অনেক সহজ হয়ে যায়, কারণ আপনি সবসময় নিশ্চিত থাকতে পারেন যে অ্যাকশনের প্রতিক্রিয়ায় স্টেট কীভাবে পরিবর্তিত হবে।

**২. কেন্দ্রীভূত (Centralized):**

- রিডাক্সে আপনার অ্যাপ্লিকেশনের সব ডাটা একটি একক "স্টোরে" সংরক্ষিত থাকে।
- এটি কোনো কম্পোনেন্ট বা ফাইল সিস্টেমে ছড়িয়ে থাকে না, ফলে এটি খুঁজে পাওয়া এবং পরিচালনা করা অনেক সহজ।
- যেকোনো কম্পোনেন্ট স্টোরের সাথে সংযুক্ত হতে পারে এবং প্রয়োজনীয় ডাটা অ্যাক্সেস করতে পারে।
- এই কেন্দ্রীভূতকরণের ফলে স্টেটের সামগ্রিক অবস্থা সহজে বোঝা যায় এবং পরিবর্তনগুলি ট্র্যাক করা সহজ হয়।

**৩. ডিবাগযোগ্য (Debuggable):**

- রিডাক্সের নিয়মাবলি এবং সরঞ্জামগুলি ডিবাগিংকে খুব সহজ করে তোলে।
- "Redux DevTools" নামক একটি অ্যাড-অন স্টোরে প্রতিটি পরিবর্তনের ইতিহাস দেখতে এবং কোন অ্যাকশন কোন পরিবর্তন ঘটালো তা ট্র্যাক করতে দেয়।
- Immutable স্টেট আপডেটের কারণে, পূর্ববর্তী স্টেটগুলো সর্বদা সংরক্ষিত থাকে, যা সমস্যা খুঁজে বের করতে সহায়তা করে।

**৪. নমনীয় (Flexible):**

- রিডাক্সের মূল কাঠামোটি নমনীয় এবং বিভিন্ন ধরণের অ্যাপ্লিকেশনে এটি ব্যবহার করা যেতে পারে।
- অতিরিক্ত লাইব্রেরি এবং মিডলওয়্যার ব্যবহার করে আপনি এর কার্যকারিতা আরও বাড়িয়ে তুলতে পারেন।
- রিডাক্স টুলকিট নামক একটি অফিসিয়াল লাইব্রেরি রয়েছে যা বয়লারপ্লেট কোড কমিয়ে দেয় এবং কিছু অতিরিক্ত ফিচার যেমন createSlice ফাংশন সহ প্রদান করে।


## Redux Toolkit কি??
 

রিডাক্স টুলকিট হলো রিডাক্সের একটি অফিশিয়াল লাইব্রেরি যা রিডাক্স ব্যবহার করা সহজ এবং সুনির্দিষ্ট করে করার জন্য ডিজাইন করা হয়েছে। এটি রিডাক্সের বিভিন্ন বৈশিষ্ট্য সহজে এবং একটি সিম্পল ইন্টারফেস দিয়ে ব্যবহার করা করার জন্য তৈরি করা হয়েছে।
রিডাক্স টুলকিট হলো রিডাক্সের সরলীকৃত সেট আপ কিট, যা রিডাক্স এপ্লিকেশন ডেভেলপমেন্ট করা সহজ করে। এটি রিডাক্সের বিভিন্ন বৈশিষ্ট্যগুলির সমন্বয়ে একটি পরিপূর্ণ প্যাকেজ হিসাবে তৈরি করা।  


## Redux Toolkit এর  মূল বৈশিষ্ট্যগুলি হল:

**১. সহজ (Simple):**

- রিডাক্স টুলকিট সেটআপ process টিকে স্বয়ংক্রিয় করে এবং বয়লারপ্লেট কোড reduce করে, ফলে জটিল রিডাক্স লজিক লিখতে কম সময় লাগে।
- createSlice ফাংশনের মতো featureগুলি অ্যাকশন, reducer এবং আপডেট লজিক লেখাকে সহজ করে তোলে।

**২. মতামতপূর্ণ (Opinionated):**

- রিডাক্স টুলকিট একটি নির্দিষ্ট পদ্ধতিতে রিডাক্স ব্যবহার করার জন্য উত্সাহিত করে। এটি কিছু ক্ষেত্রে flexibility কমিয়ে দেয় কিন্তু এর ফলে কোড বেশি মেইন্টেইনযোগ্য এবং বুঝতে সহজ হয়।
- এই opnion গুলো সাধারণত ভালো অনুশীলনগুলোকে প্রতিফলিত করে এবং রিডাক্স ব্যবহারের possible  ভুলগুলো এড়াতে সাহায্য করে।

**৩. শক্তিশালী (Powerful):**

- রিডাক্স টুলকিটের মূল শক্তি হলো রিডাক্সের শক্তি বজায় রেখে তা আরও user friendly করে তোলা।
- অতিরিক্ত ফিচার যেমন createSlice এবং thunk মিডলওয়্যার জটিল কাজগুলো সহজ করে এবং আরও ডেভেলপমেন্টকে  powerfull করে।

**৪. কার্যকর (Effective):**

- রিডাক্স টুলকিটের লক্ষ্য হলো ডেভেলপমেন্ট প্রক্রিয়াকে দ্রুত, সহজ এবং আরও কার্যকর করে তোলা।
- স্বয়ংক্রিয়করণ,  simple API এবং অতিরিক্ত ফিচারগুলির মাধ্যমে এটি ডেভেলপারদের সময় বাঁচায় এবং কোডের গুণমান উন্নত করে।


## রিডাক্স এবং রিডাক্স টুলকিটের পার্থক্য:

1. কোড simplification: রিডাক্স টুলকিট ব্যবহার করা হলে কোড লিখা সহজ হয় এবং বড় অ্যাপ্লিকেশনে সহজে ব্যবহার করা যায়।
2. structure: রিডাক্স টুলকিটে বিল্টইন ফিচার সমৃদ্ধ, যা রিডাক্সে সাধারণভাবে apply করা যায় না।
3. User ফ্রেন্ডলি: রিডাক্স টুলকিটে ডিফল্ট কনফিগারেশন থাকে যা ব্যবহারকারী ফ্রেন্ডলি এবং নির্ভুল।



## How Redux Works??

রিডাক্স নিয়ে কাজ করার সময় আপনি অবশ্যই কিছু শব্দ বারবার শুনবেন: store, action,reducer, dispatch, payload, middleware, subscribe। আজকে আমরা এই শব্দগুলোর অর্থ এবং রিডাক্সে তারা কিভাবে কাজ করে সে সম্পর্কে বিস্তারিত আলোচনা করব।

**স্টোর (Store):**

- এটাই রিডাক্সের হৃদপিণ্ড। এখানেই আপনার application এর সব ডাটা সংরক্ষিত থাকে।
- এই ডাটা একটি একক অবজেক্টের আকারে থাকে।
- যেকোন সময় আপনি স্টোরে থাকা ডাটার একটি স্থির চিত্র পেতে পারেন।

**অ্যাকশন (Action):**

- অ্যাকশন হলো এমন একটি অবজেক্ট যা স্টোরে পরিবর্তন করতে চায়।
- এটির মূলত  দুটি মূল অংশ আছে:
- টাইপ (Type): এটি নির্দিষ্ট করে কী ধরনের পরিবর্তন (যেমন, "Summation_Added", "USER_LOGGED_IN") হবে তা নির্ধারণ করে।
- পে-লোড (Payload): এটি পরিবর্তনের জন্য প্রয়োজনীয় অতিরিক্ত ডাটা (যেমন, নতুন আইটেমের বিবরণ, ব্যবহারকারীর তথ্য) সরবরাহ করে।
 
**রিডিউসার (Reducer):**

- রিডিউসার হলো একটি ফাংশন যা অ্যাকশন এবং current স্টোরের স্টেট নিয়ে নতুন স্টেট তৈরি করে।
- এটি Immutable নীতি মেনে চলে, অর্থাৎ এটি পুরানো স্টেট পরিবর্তন করে না, বরং একটি নতুন অবজেক্ট তৈরি করে।


**ডিসপ্যাচ (Dispatch):**

- ডিসপ্যাচ হলো সেই প্রক্রিয়া যার মাধ্যমে আপনি একটি অ্যাকশনকে স্টোরে পাঠান।
- স্টোর তারপর সেই অ্যাকশনটিকে সংশ্লিষ্ট রিডিউসার এর কাছে পাঠায়।
- আপনি যেকোনো জায়গা থেকে, যেকোনো সময় অ্যাকশন ডিসপ্যাচ করতে পারেন।

**পে-লোড (Payload):**

- অ্যাকশনের একটি অংশ, অতিরিক্ত ডাটা যা স্টোরে পরিবর্তন করতে প্রয়োজন হয়।
- উদাহরণস্বরূপ, "Booking_done" অ্যাকশনের পে-লোড হতে পারে নতুন নাম, বুকিং এর  বিবরণ এবং দাম।

**মিডলওয়্যার (Middleware):**

- মিডলওয়্যার হলো এমন অতিরিক্ত ফাংশন যা অ্যাকশন ডিসপ্যাচ হওয়ার পর এবং নতুন স্টেট তৈরি হওয়ার আগে কাজ করে।
- এটি কিছু বিশেষ কাজ করতে পারে, যেমন asynchronous অপারেশন চালানো (API কল করা), লগ রেকর্ড করা, ইত্যাদি।

**সাবস্ক্রাইব (Subscribe):**

- আপনি যখন স্টোরে পরিবর্তন শোনার জন্য সাবস্ক্রাইব করেন, তখন রিডাক্স আপনাকে একটি ফাংশন দেয়।
- এই ফাংশনটি স্টোরে পরিবর্তন হলে কল করা হয়, এবং আপনি আপনার UI আপডেট করতে পারেন।


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tmqwo2ypyogwik2joqvo.png)



**Redux এর uni-directional data flow:** 

Redux এর ডেটা ফ্লো একদিকে(uni-directional) ঘটে। এটি একটি স্টেট কন্টেন্টার (state container) যা জাভাস্ক্রিপ্ট অ্যাপ্লিকেশনের জন্য তৈরি হয়েছে।


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uri414pzetcj6hgj5mc7.png)
এই ডায়াগ্রামটি Redux এর মৌলিক ধারাগুলি প্রতিষ্ঠান করে।
**Action:**

- অ্যাপ্লিকেশনের অবস্থা পরিবর্তন করতে বা আপডেট করতে যে অপারেশন বা ইভেন্ট সংগঠিত হয় তা বুঝায় 
- State এবং view উভয়ই সংযুক্ত, যা  state এর পরিবর্তন করতে এবং view থেকে user এর ইন্টারঅ্যাকশন গুলো show করে।

**State:**

- অ্যাপ্লিকেশনের যে কোনও নির্দিষ্ট state বা অবস্থা  বুঝায়।
- অ্যাকশন এর মাধ্যমে  আপডেট করা হয় এবং view  কীভাবে দেখতে হবে তা নির্ধারণ করে।

**View:**

- ব্যবহারকারীরা তাদের স্ক্রিনে দেখতে পান—অ্যাপ্লিকেশনের UI
- State এর পরিবর্তন দেখায় । 




## রিডাক্সের সুবিধা

রিডাক্সের ব্যবহারের কিছু সুবিধা হলো:

- **সিম্পল ব্যবহার এবং টেস্টিং করা সহজ:** রিডাক্সের কোড সিম্পল এবং টেস্টিং করা সহজ, যা ডেভেলপারদের কাজকে সহজ করে।

- **কম্পোনেন্ট ইন্ডিপেন্ডেন্ট Hook :** রিডাক্সে কম্পোনেন্ট ইন্ডিপেন্ডেন্টলি ফাংশনাল হয়, যা একটি কম্পোনেন্টের অবস্থান ও লোকাল স্টেট নিয়ন্ত্রণ করা সহজ করে।

- **ডেভটুলস ব্যবহার করা সহজ:** রিডাক্সের সাথে বিভিন্ন ডেভটুলস ব্যবহার করা সহজ, যা ডাটা ফ্লো এবং স্টেট পর্যালোচনা করা সহজ করে।

- **কেন্দ্রীভূত স্টেট ম্যানেজমেন্ট:** রিডাক্স একটি একক স্টোরে সমস্ত অ্যাপ ডাটা রাখে, যা ডাটাকে সহজে খুঁজে পাওয়া এবং পরিচালনা করা সহজ করে তোলে।

- **Predictable State Updates:** রিডাক্স নির্দিষ্ট নিয়মাবলি অনুসরণ করে স্টেট পরিবর্তন করে, যা ডিবাগিং এবং টেস্টিং সহজ করে তোলে।

- **Improved Performance:** স্টেট পরিবর্তনের সঠিক ট্র্যাক রাখার কারণে, রিডাক্স performance উন্নত করতে পারে।

- **Reusability:** রিডাক্সের কম্পোনেন্ট-ভিত্তিক নকশাটি কোড reusability বাড়িয়ে তোলে।



## রিডাক্সের সীমাবদ্ধতা:
 

- **বড় অ্যাপ্লিকেশনে কমপ্লেক্সিটি:** বড় অ্যাপ্লিকেশনে রিডাক্সের ব্যবহার করলে কোডের কমপ্লেক্সিটি বাড়তে পারে।
- **Boilerplate Code:** রিডাক্স ব্যবহার করার জন্য বেশ কিছু বয়লারপ্লেট কোড লেখার প্রয়োজন হয় যা শুরুতে কিছুটা জটিল মনে হতে পারে।
- **Overkill for Simple Application:** ছোট এবং সহজ অ্যাপ্লিকেশনের জন্য রিডাক্স অতিরিক্ত জটিলতা তৈরি করতে পারে।



## কেন রিডাক্স টুলকিট পুরানো রিডাক্সের তুলনায় ভালো?

- **সহজ কোড লেখা:** রিডাক্স টুলকিটে কোড লেখা সহজ হয়েছে, কারণ এটি createSlice এবং createReducer এই ফাংশনগুলি প্রদান করে, যা সহজে একটি place এ  রিডাক্স রিডিউসার তৈরি করতে সাহায্য করে।
- **Immutability সহজ করতে:** Immutability বোর্ড রিডাক্স টুলকিটে সহজ হয়েছে, যা ডেটা রিডাক্স স্টোরে আপডেট করতে সহজ মেথড প্রদান করে।
- **অটোমেটিক স্টেট ম্যানেজমেন্ট:** রিডাক্স টুলকিট অটোমেটিক স্টেট ম্যানেজমেন্ট প্রদান করে, যা কোড লেখা এবং বোর্ড কমতে সহজ করে।
- **কনফিগারেশন সুবিধা:** configureStore ফাংশন রিডাক্স টুলকিটে রয়েছে, যা কনফিগারেশন ও ডেভেলপমেন্ট সহজ করে।

সারাংশঃ রিডাক্স টুলকিট হলো রিডাক্সের অফিশিয়াল লাইব্রেরি যা রিডাক্সের ব্যবহার করা সহজ এবং সুনির্দিষ্ট করে করার জন্য ডিজাইন করা হয়েছে। এটি রিডাক্সের বিভিন্ন বৈশিষ্ট্য সহজে এবং একটি সিম্পল ইন্টারফেস দিয়ে ব্যবহার করা করার জন্য তৈরি করা হয়েছে।