اگر فکر کردی برنامه نویسی اندروید یعنی اینکه تمام منطق برنامه، دیتابیس و UI رو بریزی توی شکم MainActivity و یه کلاس ۳۰۰۰ خطی بسازی، باید بگم داری "اسپاگتی" میپزی، نه اپلیکیشن! معماری MVVM اومده تا نذاره کد هات تبدیل به یه کلاف سردرگم بشن. توی جاوا، جایی که خبری از جادوی کاتلین نیست، اگر معماری نداشته باشی، پروژه ت خیلی زود تبدیل به "لگاسی" (Legacy) میشه که حتی خودت هم جرات نمیکنی بازش کنی.
در اینجا یاد میگیریم چطور با MVVM یک دژ مستحکم بسازیم، نه یک خانه پوشالی.
مثلث مقدس: تفکیک قوا
در دنیای قدیم (MVC یا کدنویسی شلخته)، اکتیویتی (Activity) خدای برنامه بود؛ هم تصمیم میگرفت چی نشون بده، هم میرفت از API دیتا میگرفت. اما در MVVM، اصل اول اینه: Separation of Concerns. هر کسی باید سرش تو کار خودش باشه.
-
لایه Model (مغز متفکر دیتا): این لایه اصلا براش مهم نیست دکمه های تو چه رنگی ان. کارش فقط کار با دیتابیس (Room) یا گرفتن اطلاعات از سرور (Retrofit) هست. مدل، فقط "داده" خالص رو میشناسه.
-
لایه View (ویترین بیخبر): اکتیویتی یا فرگمنت شماست. وظیفهش فقط و فقط "نمایش دادنه". نباید هیچ منطقی توش باشه. View فقط یه ناظره که منتظره ببینه ViewModel چی بهش میگه تا همون رو نشون بده.
-
لایه ViewModel (واسطه باهوش): این همون جاییه که جادو اتفاق میافته. دیتایی که Model میده رو میگیره، پردازش میکنه و آماده میکنه برای View. نکته کلیدی اینجاست: ViewModel هیچ رفرنسی به View نداره.
سیمکشی هوشمند: LiveData و Data Binding
خب سوال اینجاست: اگر ViewModel نباید View رو بشناسه، پس چطوری بهش میگه "آهای! لیست آپدیت شد"؟
-
روش جادویی (LiveData): اینجاست که الگوی Observer به دادت میرسه. ViewModel دادهها رو توی ظرفهایی به اسم
LiveData(یاMutableLiveData) میریزه. View (اکتیویتی) به این ظرفها "چشم میدوزه" (Observe میکنه). هر وقت داده داخل ظرف عوض شد، View خودکار آپدیت میشه. -
چرا جاوا؟ توی جاوا شاید مجبور باشی
getterوsetterبنویسی و کد بیشتری بزنی، اما ساختار همونه. ViewModel تغییر میکنه، LiveData خبر میده، و View فقطsetTextمیکنه.
تلهی مرگبار: Context در ViewModel
بزرگترین گناه کبیره در MVVM با جاوا اینه: "پاس دادن Context یا Activity به داخل ViewModel". این یعنی تیر خلاص به مدیریت حافظه! قانون طلایی: ViewModel باید بتواند حتی وقتی Activity نابود شد (مثلاً گوشی چرخید)، زنده بمونه. اگر رفرنس اکتیویتی رو نگهداره، باعث Memory Leak میشه. اگر نیاز به Context داری (مثلاً برای SharedPreferences)، از کلاس AndroidViewModel استفاده کن و Application Context رو بگیر، نه اکتیویتی رو!
نظم پادگانی: ساختار پروژه
/MyAndroidApp
/data
/model (POJO classes)
/repository (Logic for fetching data)
/remote (Retrofit interfaces)
/ui
/main
MainActivity.java
MainViewModel.java
/details
DetailsFragment.java
DetailsViewModel.java
/utils
این ساختار بهت میگه که هر فایلی دقیقاً کجاست. وقتی پروژه بزرگ شد، سپاسگزار این نظم خواهی بود.
چرا خودمون رو اذیت کنیم؟ (مزایا)
شاید بگی "خب که چی؟ همون روش قدیمی که راحتتر بود". اما MVVM دو تا سوپرپاور بهت میده:
-
ضدضربه در برابر چرخش (Rotation): توی روش سنتی، گوشی بچرخه، اکتیویتی نابود میشه و دیتا میپره. ولی
ViewModelباهوشه و در برابر چرخش صفحه مقاومه. دیتا سر جاش میمونه. -
تستنویسی راحت: چون منطق برنامه توی ViewModel هست و هیچ وابستگی به دکمهها و TextViewهای اندروید نداره، خیلی راحت میتونی با JUnit براش تست بنویسی.
نتیجهگیری
پیادهسازی MVVM در اندروید با جاوا یعنی:
-
خداحافظی با کدهای درهمتنیده (هر کلاس مسئولیت خودشو داره).
-
استفاده از LiveData (به جای اینکه View مدام بپرسه "چی شد؟"، ViewModel خودش خبر میده).
-
مدیریت چرخه حیات (Lifecycle Aware بودن).
-
پرهیز از نشت حافظه (Context رو دور از دسترس ViewModel نگه دار).
یادت باشه، MVVM اوایلش شاید پیچیده و پر از کد اضافه به نظر بیاد، ولی وقتی پروژهت بزرگ شد و خواستی یه فیچر جدید اضافه کنی و دیدی چیزی خراب نشد، اون موقع است که میفهمی ارزشش رو داشته. پس معمار باش، نه فقط کدنویس!
نظرات کاربران (0)