ইদানিং রিএক্টিভ প্রোগ্রামিং নিয়ে অনেক আলোচনা ও কাজ হচ্ছে। প্রশ্ন হচ্ছে রিএক্টিভ প্রোগ্রামিংটা আসলে কি এবং নরমাল ডেভেলপিং এর সাথে এর পার্থক্য কি ।

asked 27 Oct, 19:20

rakib%20hossain's gravatar image

rakib hossain
2879

edited 28 Oct, 03:23

Mosharraf%20Hosain's gravatar image

Mosharraf Hosain ♦
7618


Reactive Programming বোঝার জন্য আগে আমরা সাধারনত যেভাবে প্রোগ্রামিং করি - যাকে বলে ইমপারেটিভ প্রোগ্রামিং (imperative programming) -- সেইটার একটা বর্ণনা দেই।

Imperative programming হচ্ছে যেখানে আমরা লাইন বাই লাইন 'statement' এক্সিকিউট করে প্রোগ্রাম এর 'state' পরিবর্তন করি এবং এই 'state' পরিবর্তনটা সেই লাইন এবং তার আগের লাইনের computation এর উপর নির্ভর করে করে, পরের কোন পরিবর্তন বা কাজের উপর নির্ভর করে না। একটা উদাহরণ দেইঃ
ধরি আমার ৩ টা স্টেটমেন্ট আছে। যেইটাতে আমি কোনও একটা source থেকে A এবং B এর ভ্যালু নিয়ে সেখান থেকে C-এর মান হিসেব করেতারপরে সেইটা আমাদের ডিসপ্লে-তে দেখাই।

1) Get A and B
2) C = A + B
3) Display C

সুতরাং এখন যদি A=2 and B=3 হয়, তাহলে C-এর মান হিসেব করে তিনটা স্টেটমেন্ট এক্সিকিউট করা শেষে ডিসপ্লেতে 5 দেখাবে। এটা প্রত্যাশিত। এখন এক্সিকিউশন শেষে যদি source-এর A আর B এর value কোন কারণে বদলে যায়, তখনও কিন্তু ডিসপ্লেতে5ই দেখাবে, তাই না? কারণ source এর মান পরিবর্তিত হওয়ার আগে ওই তিনটি স্টেটমেন্ট এক্সিকিউশন হয়ে গেছে। এখন source এর মানের পরিবর্তনে কোন কিছু আসে-যায় না। ডিসপ্লেতে 5 ই দেখাতে থাকবে, যদি না আমরা ওই স্টেটমেন্টগুলো আবার এক্সিকিউট করি।

গ্রাফিক্যাল ইউজার ইন্টারফেস (GUI) সমৃদ্ধ সফটওয়্যার তৈরিতে এটি খুব সাধারন একটি ব্যাপার (common scenario) যেখানে Data/Event ক্রমাগত পরিবর্তিত হতে থাকে, কিন্তু Imperative এক্সিকিউশনের কারণে পরিবর্তনের ফলাফল স্বয়ংক্রিয়ভাবে পাওয়া যায় না। এই সমস্যার সমাধান করার জন্য আমাদেরকে ম্যানুয়ালি (manually) কিছু কাজ করতে হয়। হয়তোবা আমাদেরকে ডেটার পরিবর্তন হওয়ার ঘটনা detect করে ওই স্টেটমেন্ট তিনটাকে আবার রান করাতে হয়। তারপরে হয়তো ডিসপ্লেতে নতুন মানটি দেখানো হয়। কিন্তু এরকম হলে ভালো হতোনা যে, Data/Event পরিবর্তন হলে সব কিছু আপনাআপনি পরিবর্তিত হবে?

সেই capability সহজ ও সুন্দরভাবে নিয়ে আসার জন্যই Reactive Programming এর উৎপত্তি। Reactive শব্দটা এসেছেই আসলে এখান থেকে যে, এইটা 'Change' দেখে 'React' করে। মানে ঘটনা ঘটার প্রতিক্রিয়া হিসেবে কিছু কাজ করে। বাস্তব জীবনে বেশিরভাগ সফটওয়্যারের কাজের ধারা আসলে Reactive বা প্রতিক্রিয়াশীল। আমরা ব্যবহারকারীরা কোনো ইনপুট দিলে সফটওয়্যার তার প্রতিক্রিয়া হিসেবে কিছু কাজ করে। তাই Reactive programming সর্বস্তরে চালু হবার কথা ছিলো। কিন্তু আমাদের মস্তিষ্ক imperative and/or procedural ভাবে চিন্তা করতে স্বচ্ছন্দ বোধ করে; কারণ imperative programming এর এক্সিকিউশন synchronous। একটার পর একটা। তাই প্রোগ্রামারদের জন্য স্টেটমেন্ট দেখে বোঝা সহজ বা লেখা সহজ। সমস্যা হলো, বাস্তব জীবনে বেশিরভাগে সফটওয়্যার অ্যাপ্লিকেশনের data/event flow এর ধরন হচ্ছে asynchronous। Imperative Programming দিয়েও asynchronous programming করা যায়, কিন্তু অনেক ঝামেলা পোহাতে হয়। অনেক ক্ষেত্রে প্রোগ্রামাররা এই async-flow handle করতে গিয়ে অযথা অনেক বাগের উৎপত্তি ঘটায়। Reactive Programming-এ এসব কাজ করা অনেক সহজ, তাই ভুলের সম্ভাবনাও অনেক কম।

Reactive Programming-এর ধারণা সেই ১৯৭০ থেকে আছে, কিন্তু এইটা জনপ্রিয় হয় মাইক্রোসফট (microsoft)-এর Reactive Extensions (Rx) for .NET দিয়ে যেইটা ২০০৯ সালে রিলিজ করা হয়। এর পর বিভিন্ন প্রোগ্রামিং ভাষাতে এই extension ইমপ্লিমেন্ট হয়। যেমনঃ RxJava, RxJS (javascript), RxScala, RxPY (Python), RxJRuby ইত্যাদি।

Reactive Programming এর ইতিহাস জানতে চাইলে এই লিঙ্কগুলো দেখা যেতে পারে (ইংরেজিতে অবশ্য):

বিশেষ করে RxJava এর বিষয়ে আগ্রহী হলে বাংলায় এই সেশন দেখা যেতে পারে (Disclaimer: এই সেশনগুলো আমার নেওয়া, তাই ঢোল পিটাচ্ছি বলা যেতে পারে :P )

permanent link

answered 05 Nov, 13:41

oronno-oneous's gravatar image

oronno-oneous
1214

edited 07 Nov, 07:16

Tamim%20Shahriar%20Subeen's gravatar image

Tamim Shahriar Subeen ♦♦
5.8k1026

1

ধন্যবাদ ভাইয়া , এত সুন্দর করে বুঝালেন ! আমি প্রশ্ন করার দিন থেকেই মাঝে মাঝে নেট দেখতাম কিন্তু ক্লিয়ারলি বুঝতাম না আপনি ৫ মিনিট এ পুরো ক্রিস্টাল ক্লিয়ার করে দিলেন ।

(05 Nov, 18:09) rakib hossain
Your answer
toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or _italic_
  • **bold** or __bold__
  • link:[text](http://url.com/ "title")
  • image?![alt text](/path/img.jpg "title")
  • numbered list: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Question tags:

×194

question asked: 27 Oct, 19:20

question was seen: 658 times

last updated: 07 Nov, 07:16