بهترین روش ها برای استفاده از ViewModel در اندروید

best practices for use viewmodel in android
اندروید

بهترین روش ها برای استفاده از ViewModel در اندروید

قبل از اینکه بخوام بهترین روش‌های استفاده از ViewModel رو بگم، باید به یه سوال پاسخ بدیم.

چرا باید از ViewModel استفاده کنیم ؟

ViewModel یکی از بهترین روش‌ها برای تفکیک نگرانی‌ها یا separation of concerns (SoC) هستش.

این روش به ما کمک میکنه که یه برنامه‌ای با قابلیت نگه‌داری راحت‌تر (maintainable) ، تست‌پذیری راحت‌تر (testable) و انعطاف‌پذیری بیشتری (extensible) داشته باشیم.

خیلی ساده بخوام بگم، یه برنامه درست و حسابی که خیلی راحت میشه توسعه‌ش داد.😀

از ViewModel توی معماری MVP هم میشه ازش استفاده کرد، ولی به شخصه ترجیح میدم که توی MVVM بیشتر ازش استفاده کنم.

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

این نابودی اطلاعات زمانی جدی و مشکل‌ساز میشه که عملیات سنگینی رو انجام بدین، مثل دریافت اطلاعات از سرور، دیتابیس یا هر عملیات سنگین دیگه‌ای…

تفکیک نگرانی‌ها یا separation of concerns (SoC) چیه ؟

چیزی نیست جز تقسیم وظایف مختلف و کنترل هر یک از آنها توسط بخش‌های مخصوص به خود.

اجازه بدید یک مثال واقعی بزنم تا بهتر بتونید SoC رو درک کنید.

توی یک شرکت نرم‌افزاری بخش‌های گوناگونی رو داریم که وظایف مخصوص به خودشون رو دارن.

بخش‌هایی مثل : منابع انسانی ، امور مالی ، تضمین کیفیت ، مهندسی و غیره…

توی برنامه‌نویسی هم همینطوره.

وظایف گوناگونی رو داریم که توسط بخش‌های مختلف صورت میگیرن.

مثلا : بعضی وظایف توی پس‌زمینه (background) انجام میشن، بعضی از وظایف باید توی ترد اصلی (UI Thread) انجام بشن که توسط ViewModel خیلی راحت می‌تونیم این موارد روی توی حالت‌های مختلف مدیریت کنیم.

نتیجه نهایی

ViewModel در اندروید، باعث میشه که حجم کد Activityها و Fragmentها کمتر بشه درنتیجه مشکلات مربوط به چرخه حیات (lifecycle) خیلی کمتر میشه.

این روش، یکی از بهترین روش‌ها هستش.

چرا که Activityها و Fragmentها چیزی نیستن جز پل ارتباطی بین سیستم‌عامل Android و اپلیکیشن ما.

این به این معناست که سیستم‌عامل هرموقع که بخواد خیلی راحت می‌تونه این موارد رو ازبین ببره، پس باعث افزایش سرعت و کارایی اپلیکیشن ما هم میشه.

خب بریم که این 4 تا روش رو بهتون توضیح بدم.

روش اول) Context رو پاس نده

خیلی از برنامه‌نویسان اندروید رو دیدم که Context رو به توابع ViewModel پاس (انتقال) میدن.

حتی اگه هدفتون برای استفاده کردن از ViewModel برای جداکردن عملیات سنگین از کدهای UI هم هست، بازم این کار رو نکنید.

این اتفاق معمولا زمانی رخ میده که برنامه‌نویس اطلاعی از تزریق وابستگی‌ها (Dependency Injection) نداره.

مثلا می‌خواد عملیاتی مثل ارتباط با اینترنت یا استفاده از SharedPreferences رو انجام بده.

چون این‌ها رو توی ViewModel پیاده سازی کرده، میاد Context رو هم به این کلاس پاس میده.

راه‌حل این مشکل استفاده از تزریق وابستگی‌ها مثل Koin – Dagger – Hilt هستش.

یا مثلا می‌خوان از ProgressBarها داخل کلاس ViewModel استفاده کنن میان و Context رو پاس میدن.

برای اینکار اصلا نیازی نیستش که Context رو پاس بدی، فقط کافیه از Sealed Class و LiveData استفاده کنید.

روش دوم) پاکسازی منابع

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

چرا که اگه به این موضوع توجه نکنیم ممکنه اندروید اجازه‌ی اجرا برنامه ما رو هم حتی نده.

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

یکی از بهترین مثال‌ها برای نشان دادن این مسئله در برنامه‌ نویسی مدرن اندروید ، نگهداری یک CompositeDisposable و افزودن تمام وظایف مربوط به RxJava به آن است.

حالا کافیه که توی متد onCleared اون رو پاکسازی یا dispose کنیم.

به این صورت خیلی راحت هم جلوی نشت حافظه (Memory leak) رو گرفتید و هم اینکه منابع سخت افزاری رو به درستی مدیریت کردید.

اگه از Coroutine استفاده می‌کنید، خیلی راحت میتونید همینکار رو با Coroutine Scopeها هم انجام بدین.

این بهترین روش برای نگه‌داری Scope داخل کامپوننت (component) مناسب مثل : ViewModel ActivityFragment برای محدود کردن عملکردهاست.

روش سوم) ارث‌بری از Base

توی روش قبل درمورد مزایای مدیریت منابع توضیح دادم.

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

بهتره برای اینکار یک کلاس پایه (base) برای ViewModelهای خودتون درست کنید، مثلا : Baseviewmodel

بعد بقیه ViewModelهای خودتون رو از این کلاس ارث بری کنید.

اینطوری فقط کافیه مدیریت منابع سخت‌افزاری رو یکبار توی Baseviewmodel بنویسید و توی بقیه ViewModelها هم اعمال بشه.

این عملیات ارث بری اصلا چیز جدیدی نیست و از همون اول هم توی اندروید بود.

فقط کافیه از این روش استفاده کنید.

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

مثلا AppCompatActivity که هممون ازش استفاده میکنیم به این شکل از کلاس‌ها ارث‌بری میکنه :

AppCompatActivity > FragmentActivity > Activity

این روش یه خوبی دیگه‌ای هم داره، باعث کوتاه شدن کدهاتون هم میشه.

یعنی خیلی راحت یکبار مینویسید و بقیه جاها خودش اعمال میشه.

از این روش اصلا غافل نشید.

روش چهارم) منطق‌های سنگین برنامه‌تون رو توی این کلاس پیاده‌سازی نکنید

ViewModel در اصل به این دلیل ساخته شد که کدهای مربوط به UI رو از سایر کارها جدا کنه.

اگه شما بیاین و منطق‌های سنگین برنامه‌تون رو توی این کلاس بنویسید درواقع یجورایی باعث کپی شدن boilerplate code میشید.

ما باید منطق‌های سنگین برنامه خودمون رو از این کلاس جدا کنیم، بهتره که اینجور موارد رو توی repositoryها بنویسیم.

این روش کمک زیادی برای تست پذیری و نگه داری برنامه میکنه.

 

راستی، من یک دوره‌ای رو درست کردم که به رایگان برنامه‌نویسی کاتلین رو بهت آموزش میدم.

این آموزش میتونه تو رو کاملا برای برنامه‌نویسی اندروید آماده کنه.

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

ثبت‌نام رایگان در دوره کاتلین
رایگان

دوره مقدماتی کاتلین برای برنامه نویسان اندروید

4.5/5
(4 امتیاز)
20 درس
مبتدی
آنچه یاد خواهید گرفت
آموزش از صفر برنامه نویسی کاتلین

دیدگاه خود را اینجا قرار دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

فیلدهای نمایش داده شده را انتخاب کنید. دیگران مخفی خواهند شد. برای تنظیم مجدد سفارش ، بکشید و رها کنید.
  • عکس
  • شناسه محصول
  • امتیاز
  • قیمت
  • در انبار
  • موجودی
  • افزودن به سبد خرید
  • توضیحات
  • محتوا
  • عرض
  • اندازه
  • تنظیمات بیشتر
  • ویژگی ها
  • Custom attributes
  • زمینه های دلخواه
مقایسه
لیست علاقه مندی ها 0