RxJava یا Coroutines کدام یک را باید انتخاب کنید؟ (قسمت دوم)
در مقاله قبلی به بررسی مفهمونی RxJava و Coroutines پرداختیم. در این مقاله بطور جامع تری به این مباحث میپردازیم
RxJava چیست؟
RxJava کتابخانه ای است که استفاده از برنامه نویسی واکنشی را در زبان برنامه نویسی جاوا هدف قرار می دهد. Rx مخفف Reactive Extensions (ReactiveX) است که پروژه ای است که پباده سازی برنامه نویسی واکنشی را برای زبان های برنامه نویسی مختلف فراهم می کند.
RxJava امکان نمایش عملکردی(functional) و اعلانی (declarative) هر عملیاتی را به عنوان یک جریان ناهمزمان از دادهها فراهم میکند که میتواند در هر thread ایجاد شود و توسط چندین شی از thread های مختلف مصرف شود.
کوروتین ها
کوروتین ها، بر خلاف RxJava، بر ارائه مکانیزمی برای نوشتن کد ناهمزمان تمرکز می کنند که ممکن است به طور جزئی به صورت متوالی و پشت سرهم اجرا شود، که امکان حذف callback ها در کد را فراهم می کند که به کد فشرده تر تبدیل می شود که تولید و بازنویسی آن آسان است.
Coroutine ها هنوز آزمایشی هستند، به این معنی که ممکن است از طریق سازندگان Kotlin دستخوش تغییرات شوند، اما با این وجود، آنها در حال حاضر feature های پایداری را ارائه می دهند و راهی فشرده برای حل رایج ترین مشکلات هنگام کار با نرم افزار ناهمزمان ارائه می دهند که کار آسانی نیست. این مقاله فقط سطح قابلیت ها و پیچیدگی های Coroutines را بدون پرداختن به سناریوهای پیچیده تر بررسی می کند.
Coroutine ها استفاده از callback های بازیافتی (recycled callbacks) را با تبدیل آنها به کدهای متوالیتر از طریق استفاده از توابع تعلیقی (Suspend Function) برای کدهای همزمانتر که همچنان میتوانند به راحتی در رشتهها جابهجا شوند، برطرف میکنند. Coroutineها این مزیت را دارند که مستقیماً با زبان Kotlin ادغام می شوند و در حالی که بسیار جدید هستند، در حال حاضر چندین برنامه کاربردی و حتی کتابخانه های دیگری وجود دارند که از آنها پشتیبانی می کنند.
روالها استفاده از تماسهای بازیافتی را با تبدیل آنها به کدهای متوالیتر از طریق استفاده از توابع تعلیق برای کدهای همزمانتر(more concurrent code) که همچنان میتوانند به راحتی در thread ها جابهجا شوند، برطرف میکنند. Coroutineها این مزیت را دارند که مستقیماً با زبان Kotlin ادغام می شوند و در حالی که بسیار جدید هستند، در حال حاضر چندین برنامه کاربردی و حتی کتابخانه های دیگری وجود دارند که از آنها پشتیبانی می کنند.
مزایا و معایب
Kotlin و Coroutines راهی برای نوشتن کدهای تمیزتر هستند و برای برنامهنویسی که قبلاً با برنامهنویسی شی گرا و concurrency(همزمانی) / multithreading(چند نخی) / asynchronism(ناهمزمانی) آشنا هستند کاملاً واضح و روشن باشد. از آنجایی که Coroutine با استفاده از Kotlin استاندارد نوشته می شود، این کتابخانه برای پروژه های جدید اندرویدی مناسب است زیرا گوگل کاتلین را به عنوان زبان جدید اندروید معرفی کرد.
وقتی صحبت از Coroutines به میان میآید، آنها یک راه آسان برای مدیریت threading ارائه میدهند و برای اجرای processe ها در background thread در صورت نیاز کاملاً مناسب هستند. این پارادایم همچنین اجرای آسان همزمانی و همزمانی ساختاریافته را فراهم می کند که به راحتی مقیاس پذیر و قابل نگهداری است،و باعث می شود چرخه تولید و کارایی زمان برنامه نویسان برای نوشتن کد، حل باگ ها یا سازماندهی و تمیز کردن کد بهتر شود.
کوروتین ها می توانند عملکرد کد را به میزان قابل توجهی بهبود بخشند و مانند جاوا و RxJava، امکان استفاده از آن به عنوان جریان(stream) وجود دارد. از سوی دیگر، این زبان و Coroutine کامل نیستند: آنها هنوز به طور کامل توسط جامعه پذیرفته نشده اند و اطلاعات آنلاین در مقایسه با API قدیمی Rx کامل نیست. علاوه بر این، اگرچه کاتلین و Coroutines به راحتی نوشته میشوند و کد واقعاً تمیز است، یک منحنی یادگیری برای Coroutines وجود دارد، که اگر کاتلین زبانی نباشد که توسعهدهنده از قبل بر آن مسلط است، میتواند حتی پیچیدهتر شود.
RxJava از ابتدا از جاوا پشتیبانی می کند، اما از طریق RxKotlin می توان آن را به راحتی در کاتلین نیز استفاده کرد. به عنوان مثال، این امکان مدیریت آسان حافظه نهان را بدون ایجاد کلاس های کش فراهم می کند. یکی از مهمترین چیزها و مزیت بزرگ RxJava کاهش 90 درصدی نشتی حافظه است که با جایگزینی مکانیسم های استاندارد اندروید امکان پذیر است، که مانند جمع آوری زباله(garbage) در C مهم است، زمانی که در حال توسعه برنامه های اندرویدی هستید دیگر نیازی به زیاد در نظر گرفتن آن نیست.
همچنین می تواند کد را برای بهبود پاسخگویی برنامه بهینه کند و امکان رشد و پیشرفت آن بسیار آسان خواهد بود، اما نگهداری آن به دلیل استفاده بیش از حد از آن بسیار سخت است. پیچیدگی آن چالش برانگیز است و تمایل به استفاده از آن در همه جا کد را بسیار پیچیده می کند، اشکال زدایی آن را سخت تر می کند و در نتیجه باعث می شود برنامه نویس زمان بیشتری را برای حل باگ ها، توسعه کدهای جدید پیرامون آن یا حتی حفظ یا بازنویسی کد صرف کند. ، از آنجایی که خطاها را بر نمی گرداند و تنها راه، اشکال زدایی کاملاً ابتدایی است.
به این دلیل که دیباگر نمیتواند به زنجیره Rx متصل شود و برای دیدن آنچه اتفاق میافتد به log ها نیاز دارید. نکته دیگر در مورد این کتابخانه این است که امکان انتشار null وجود ندارد،Coroutine ها را فقط می توان در Kotlin استفاده کرد، اما شاید نکته اصلی که باعث می شود Coroutine ها هنوز چندان مورد استفاده قرار نگیرند این است که RxJava قبلاً یک کتابخانه شناخته شده است، پس احتمالاً هرگز نیازی به استفاده از Coroutine ها نخواهید داشت، زیرا می توانید RxJava را با Kotlin نیز استفاده کنید.
نتیجه گیری
بنابراین، Coroutines یا RxJava؟ انتخاب سختی است و همچنین مقایسه آنها سخت است زیرا کاتلین Coroutines یک قیچر thin language است، در حالی که RxJava یک کتابخانه بسیار سنگین با تنوع بسیار زیادی از اپراتورهای آماده برای استفاده است.
هر دو برای حل یک مشکل طراحی شده اند، برنامه نویسی ناهمزمان، با این حال رویکرد آنها به این موضوع کاملاً متفاوت است. پس از تمام مرور کلی در مورد Coroutines و RxJava، ممکن است بپرسید کدام راه حل بهترین است. از نظر تعداد متدها، RxJava بزرگتر و واقعاً قدرتمندتر از راه حلی است که منحصراً بر اساس Coroutines است. اما با استفاده از Proguard و بهینه سازی کد آن می توان این تفاوت را از بین برد.
بنابراین، چه کسی پیروز است، یا از کدام رویکرد باید در کد تولید استفاده کنیم؟ خوب، این یک سناریوی مورد به مورد (case-to-case) است، اما اگر برنامه از قبل با RxJava اجرا میشود و کار میکند، آن را تعویض را نکنید.
اگر برنامه در هر ایجاد activity یک یا دو بار تماس های شبکه(network call) را اجرا می کند، از Coroutines استفاده کنید. اگر برنامه باید ساده باشد و توسط کدنویسان با تجربه کمتر خوانده شود، از Coroutines استفاده کنید. اگر برنامه هر نوع فیچرهای real time را اجرا می کند، از RxJava استفاده کنید.
اگر برنامه به سطوح بالایی از دستکاری داده بین واکشی(fetching) و انتشار(emitting) نیاز دارد، از RxJava استفاده کنید. اگر برنامه دارای معماری مبتنی بر جریان واکنشی(reactive stream) است، از RxJava استفاده کنید. اگر یک پروژه چند پلتفرمی مبتنی بر کاتلین Native است، از Coroutines استفاده کنید. اما به خاطر داشته باشید، حداقل اگر زبان برنامه نویسی کاتلین باشد، امکان استفاده از هر دو با هم وجود دارد.
دیدگاهتان را بنویسید