یک هیستوری کوتاه از ReactiveX , RxJava

برنامه نویسی درباره حل مسائل و مشکلاته, و وقتی شیء گرایی اومد ,آنالیز و حل یک مشکل رو خیلی آسون کرد و ما هنوز ازش استفاده میکنم.

ولی به مرور زمان کسب و کار ها و برنامه ها پیچیده تر شدند و وقتی سال 2010 رسید, برنامه نویسا به این نتیجه رسیدند که شیء گرایی فقط بخشی از مشکلات رو حل میکنه.

مشکل اینجا بود که در برنامه های پیشرفته تر تعاملات بین شیء ها هم بیشتر و برنامه نویسی سخت تر میشد.

بعد Functional Programming اومد تا جای خالی رو پر کنi و متمم شیء گرایی باشه. ولی کافی نبود

 

یک رویکرد تابع گرای رخداد محور شروع به جلب توجه کرد. چند تا فریمورک واکنشگرا هم ساخته شدند مثل AKKa و  Sodium.

 

اما در مایکروسافت یک برنامه نویس به اسم Erik Meijer یک فریموورک واکنش گرا برای دات نت ساخت که  بهش Reactive Extensions  میگفتند.

و طی چند سال اخیر برای چند زبان و فریموورک ساخته شد. مثل JavaScript, Python, C++, Swift,  and Java

توی 2014 نسخه reactiveX جاوا نوشته شد, RxJava 1, بعدا هم توی 2016 نسخه دوم منتشر شد.

و تا الان همه ی زبان ها و فریموورک ها تحت jvm پشتیبانی شده. RxScala , RxGroovy, RxKotlin,RxAndroid,RxJava-JDBC,RxJavaFX 

 

RxJava بیشتر از یک کتابخانه است و بخش از اکوسیستم واکنشی است و بطور کلی یک رویکرد برنامه نویسی رو ارائه میده.

ایده اصلی ReactiveX اینه "events are data and data are events" یعنی رخداد ها دیتا هستند و دیتا رخداد ها.

 

بینش واکنشی

به جهان نگاه کنید , میبیند همه چیز در حال جنبش و حرکت هستند. زمین , آدم ها , حساب بانکی و آب و هوا و ... حتی یک سنگ هم در حرکته بدلیل حرکت کره زمین.

اگه در نظر بگیریم که همه چیز رو میشه مدل کرد بنا به حرکت , به عنوان برنامه نویس این یک کار نشدنی و خیلی سخته.

 

مسئله دیگه اینه که همه ـی ای رخداد ها غیر هم زمان هستند , و به هم تاثیر دارند.

همونجور که گفتیم برنامه نویسی واکنشی درباره جریان هایی از اطلاعات و رخداد هاست.

یک دونده و یک ماشین رو دو جریان جدا از دیتا درنظر میگیریم ممکنه که این دو با هم واکنش داشته باشند.

 

برای نوشتن برنامه های واکنشی توی جاوا میتونیم از callback ها و ابزار ها concurrency استفاده کنیم ولی

با RxJava خیلی راحت تره و مظمئن تر.

 

دوباره به جهان نگاه کنیم . خیلی چیز ها هستند که استاتیک هستند مثل کتاب یا یک سی دی آهنگ , ولی از دیدگاه دیگه ای یک کتاب یک دنباله (جریان) از کلماته.

ماشین و دونده هردو حالت و خواص(پراپرتی) های خودشون رو دارند ولی همچنین حرکت هم دارند. کتاب و سی دی هم وقتی که مصرف میشن به حرکت درمیان.

 

با ترکیب کردن رخداد ها و دیتا بهتر میشه که دنیا رو میشه طبیعی تر مدل سازی کرد

 

چرا باید RxJava یاد بگیریم؟

why reactive

اگر میخواهید برنامه های واکنش گرا یا واکنشی یا Reactive بسازید , بهترین راه RxJava

مثال برای اندرویدیها

سیستم عامل اندروید رو در نظر بگیرید

- ورودی های کاربر 

- تراکنش های اینترنتی

- تراکنش های io (ورودی و خروجی فایل) 

- پردازش گر 

این موارد همه Asyncronous یا غیر هم زمان و Blocking یا قلف کننده هستند.

یعنی معلوم نیست که

- کاربر کی کلیدی رو میزنه

- کی اینترنت به درخواست شما جواب میده

- یک فایلی با چه سرعتی لود میشه

- cpu یک مسئله رو در چقدر زمان پردازش میکنه

 

برنامه های اندروید بطور پیشفرض روی یک Thread به اسم MainThread اجرا میشن. و هر کدوم از موارد بالا ممکنه باعث بشه تا مین ترد بلاک بشه و به اصلاحی UI فریز بشه.

و اگر شما عملیاتی که ممکنه میت ترد رو بلاک کنه در مین ترد اجرا کنید خود فریموورک به شما گیر خواهد داااد.

راه حل هایی برای دور زدن این قضیه هست. مثل AsyncTask  که عملیات شما رو توی یک ترد دیگه انجام میده و عملیات شما رو Asynconous یا غیر هم زمان انجام میده.

ولی همونطور که اول گفتیم در برنامه های پیچیده , کار سخت تر میشه مثلن و مسائلی مثل Callback Hell پیش میاد.

callback hell

RxJava همه ی این کار ها رو بصورت غیر هم زمان انجام میده به راحتی. RxJava فواید دیگه ای هم داره زیاد دیگه ای هم داره که میگم در آینده

 

 

کی و کجا از RxJava استفاده کنیم؟

همیشه و همه جا. به همه چیر با رویکرد واکنشی نگاه کنید. تنها راه استادی در برنامه نویسی واکنشی اینه که برنامه ها رو از صفر واکنشی بسازید.

به همه چیر به دید Observable نگاه کنید. همیشه برنامه اتون با کلمات data , event Flow مدل کنید. وقتی اینکارو کردید میبینید که برنامه نویسی واکنشی همه چیز برای ارائه داره و "کیفیت برنامه های شما به طور چشم گیری افزایش می یابد"

 

وقتی که استاد برنامه نویسی واکنشی شدید , اونوقت میتونید تشخیص بدید که کجا رویکرد واکنشی مناسب نیست.