RxJS (Reactive Extensions for JavaScript) একটি শক্তিশালী লাইব্রেরি যা অ্যাসিঙ্ক্রোনাস ডেটা স্ট্রিম এবং ইভেন্ট-ভিত্তিক প্রোগ্রামিংয়ে ব্যবহৃত হয়। অ্যাসিঙ্ক্রোনাস স্ট্রিমের মধ্যে Global State শেয়ার করার প্রক্রিয়াটি অ্যাপ্লিকেশনগুলির মধ্যে ডেটা সিঙ্ক্রোনাইজেশন এবং শেয়ার করার জন্য অত্যন্ত কার্যকরী। RxJS এর মাধ্যমে আপনি একটি সেন্ট্রাল স্টোর তৈরি করতে পারেন, যেখানে অ্যাপ্লিকেশনটির সমস্ত ডেটা এবং স্টেট থাকবে, এবং সেটি বিভিন্ন কম্পোনেন্ট বা সাবস্ক্রাইবারের মধ্যে শেয়ার করা হবে।
RxJS দিয়ে Global State শেয়ার করার ধারণা
Global State হল সেই স্টেট যা অ্যাপ্লিকেশনের একাধিক অংশের মধ্যে শেয়ার করা হয়। এটি এমন ডেটা বা অবস্থা যা পুরো অ্যাপ্লিকেশনজুড়ে প্রয়োজন হতে পারে, যেমন ইউজার ডেটা, থিম সিলেকশন, অথবা অ্যাপ্লিকেশন সেটিংস।
RxJS-এর মাধ্যমে আপনি Subject, BehaviorSubject, অথবা ReplaySubject ব্যবহার করে Global State তৈরি করতে পারেন এবং সেই স্টেটটি একাধিক সাবস্ক্রাইবারের মধ্যে শেয়ার করতে পারেন। এর মাধ্যমে একাধিক ভিউ, কম্পোনেন্ট, অথবা মডিউল একই ডেটা বা স্টেটের সাথে কাজ করতে পারে, যা অ্যাপ্লিকেশনের পারফরম্যান্স এবং কোড রিইউসেবিলিটি বৃদ্ধি করে।
1. BehaviorSubject দিয়ে Global State শেয়ার করা
BehaviorSubject হল RxJS এর একটি বিশেষ ধরনের Subject, যা সর্বশেষ মান সংরক্ষণ করে রাখে এবং নতুন সাবস্ক্রাইবারদের সেই সর্বশেষ মান পাঠায়। এটি Global State-এর জন্য খুবই উপযোগী, কারণ এটি অ্যাপ্লিকেশনের সর্বশেষ অবস্থা একটি সেন্ট্রাল অবস্থানে সংরক্ষণ করে রাখে।
উদাহরণ: BehaviorSubject দিয়ে Global State শেয়ার করা
import { BehaviorSubject } from 'rxjs';
// Global State এর জন্য BehaviorSubject
const globalState = new BehaviorSubject({ user: null, theme: 'light' });
// সাবস্ক্রাইবার ১
globalState.subscribe(state => {
console.log('Subscriber 1 - Current State:', state);
});
// Global State আপডেট
globalState.next({ user: { name: 'John Doe' }, theme: 'dark' });
// সাবস্ক্রাইবার ২
globalState.subscribe(state => {
console.log('Subscriber 2 - Current State:', state);
});
// আবার Global State আপডেট
globalState.next({ user: { name: 'Jane Doe' }, theme: 'light' });
আউটপুট:
Subscriber 1 - Current State: { user: null, theme: 'light' }
Subscriber 1 - Current State: { user: { name: 'John Doe' }, theme: 'dark' }
Subscriber 2 - Current State: { user: { name: 'John Doe' }, theme: 'dark' }
Subscriber 1 - Current State: { user: { name: 'Jane Doe' }, theme: 'light' }
Subscriber 2 - Current State: { user: { name: 'Jane Doe' }, theme: 'light' }
এখানে, BehaviorSubject ব্যবহার করে আমরা একটি globalState তৈরি করেছি, যেখানে ইউজার এবং থিমের অবস্থা সেন্ট্রালাইজড হয়ে আছে। যখনই স্টেট পরিবর্তিত হয়, সমস্ত সাবস্ক্রাইবাররা সর্বশেষ স্টেট পায়।
2. ReplaySubject দিয়ে Global State শেয়ার করা
ReplaySubject এমন একটি Subject যা পূর্ববর্তী মানগুলি পুনরায় সাবস্ক্রাইবারদের কাছে পাঠায়। আপনি ReplaySubject ব্যবহার করে Global State তৈরি করতে পারেন যা নতুন সাবস্ক্রাইবারকে পূর্ববর্তী স্টেটের মানও পাঠাবে।
উদাহরণ: ReplaySubject দিয়ে Global State শেয়ার করা
import { ReplaySubject } from 'rxjs';
// Global State এর জন্য ReplaySubject
const globalState = new ReplaySubject(2); // সর্বশেষ ২টি মান সংরক্ষণ করবে
globalState.next({ user: { name: 'John' }, theme: 'light' });
globalState.next({ user: { name: 'Jane' }, theme: 'dark' });
globalState.next({ user: { name: 'Sam' }, theme: 'light' });
// সাবস্ক্রাইবার ১
globalState.subscribe(state => {
console.log('Subscriber 1 - State:', state);
});
// নতুন Global State আপডেট
globalState.next({ user: { name: 'Mike' }, theme: 'dark' });
// সাবস্ক্রাইবার ২
globalState.subscribe(state => {
console.log('Subscriber 2 - State:', state);
});
আউটপুট:
Subscriber 1 - State: { user: { name: 'Jane' }, theme: 'dark' }
Subscriber 1 - State: { user: { name: 'Sam' }, theme: 'light' }
Subscriber 1 - State: { user: { name: 'Mike' }, theme: 'dark' }
Subscriber 2 - State: { user: { name: 'Sam' }, theme: 'light' }
Subscriber 2 - State: { user: { name: 'Mike' }, theme: 'dark' }
এখানে, ReplaySubject সর্বশেষ ২টি স্টেটের মান পুনরায় সাবস্ক্রাইবারদের কাছে পাঠিয়েছে এবং যখন নতুন সাবস্ক্রাইবার যুক্ত হলো, তখন সে পূর্বের মানগুলিও পেয়ে গেল।
3. Subject দিয়ে Global State শেয়ার করা
Subject সাধারণত একাধিক সাবস্ক্রাইবারদের মধ্যে একক Observable থেকে ডেটা শেয়ার করতে ব্যবহৃত হয়, তবে এটি আগের মানের history সংরক্ষণ করে না। এটি সাধারণত তখন ব্যবহৃত হয় যখন নতুন স্টেট ইনপুট থেকে আসে এবং তার প্রেক্ষিতে সাবস্ক্রাইবাররা প্রতিক্রিয়া জানায়।
উদাহরণ: Subject দিয়ে Global State শেয়ার করা
import { Subject } from 'rxjs';
// Global State এর জন্য Subject
const globalState = new Subject();
globalState.subscribe(state => {
console.log('Subscriber 1 - State:', state);
});
// Global State আপডেট
globalState.next({ user: { name: 'John' }, theme: 'light' });
globalState.next({ user: { name: 'Jane' }, theme: 'dark' });
// নতুন সাবস্ক্রাইবার
globalState.subscribe(state => {
console.log('Subscriber 2 - State:', state);
});
// Global State আবার আপডেট
globalState.next({ user: { name: 'Mike' }, theme: 'dark' });
আউটপুট:
Subscriber 1 - State: { user: { name: 'John' }, theme: 'light' }
Subscriber 1 - State: { user: { name: 'Jane' }, theme: 'dark' }
Subscriber 2 - State: { user: { name: 'Jane' }, theme: 'dark' }
Subscriber 1 - State: { user: { name: 'Mike' }, theme: 'dark' }
Subscriber 2 - State: { user: { name: 'Mike' }, theme: 'dark' }
এখানে, Subject ব্যবহার করে আমরা স্টেট আপডেট করছি, এবং নতুন সাবস্ক্রাইবাররা শুধু নতুন আপডেট পেয়েছে, আগের মানগুলো তারা পায়নি।
RxJS দিয়ে Global State শেয়ার করার সুবিধা
- Centralized State: RxJS দিয়ে স্টেট ম্যানেজমেন্ট করা হলে সমস্ত অ্যাপ্লিকেশন স্টেট একটি সেন্ট্রালাইজড জায়গায় থাকে, যা স্ট্রিমের মাধ্যমে একাধিক সাবস্ক্রাইবারের মধ্যে শেয়ার করা যায়।
- Reactive State: স্টেট পরিবর্তন হলে সমস্ত সাবস্ক্রাইবারকে স্বয়ংক্রিয়ভাবে আপডেট করার সুবিধা পাওয়া যায়। এটি reactive programming প্যাটার্ন অনুসরণ করে, যেখানে পরিবর্তনগুলো স্বয়ংক্রিয়ভাবে প্রতিক্রিয়া জানায়।
- Decoupling: স্টেটের সাথে সম্পর্কিত বিভিন্ন অংশের মধ্যে শক্তিশালী জোড় (coupling) থেকে মুক্তি পাওয়া যায়, কারণ স্টেট পরিবর্তনের কোনো নির্দিষ্ট নিয়ম বা সরাসরি যোগাযোগ প্রয়োজন হয় না।
- Efficiency: Global state ব্যবহারে কোড পুনঃব্যবহারযোগ্য হয়, এবং একই ডেটা একাধিক জায়গায় শেয়ার করতে পারা যায়, যা কার্যক্ষমতা বাড়িয়ে দেয়।
সারাংশ
RxJS দিয়ে Global State শেয়ার করা খুবই কার্যকরী, বিশেষত অ্যাসিঙ্ক্রোনাস এবং রিয়্যাক্টিভ অ্যাপ্লিকেশনগুলিতে। আপনি BehaviorSubject, ReplaySubject, এবং Subject ব্যবহার করে স্টেট শেয়ার এবং ম্যানেজ করতে পারেন, যা আপনার অ্যাপ্লিকেশনকে ডায়নামিক এবং মেইন্টেনেবল করে তোলে। RxJS এর মাধ্যমে centralized state management এবং reactive state updates নিশ্চিত করা যায়, যা উন্নত পারফরম্যান্স এবং কোড রিইউসেবিলিটি তৈরি করে।
Read more