معماری MVVM در برنامه نویسی اندروید
سلام توسعه دهنگان عزیر در این مقاله به معماری MVVM در برنامه نویسی اندروید می پردازیم شاید تا به حال اسم Architecture (معماری) MVVM را نشنیده باشید در ادامه با ما همراه باشید تا علت استفاده از معماری MVVM به جای معماری MVP را متوجه شوید.
Architecture (معماری) چیست ؟
بهتر از ساده ترین مباحث جلو بریم تا در نهایت به مفهوم MVVM برسیم معماری یا Architecture با توجه به ویکی پدیا معماری نرم افزار اشاره می کند به ساختار لول بالای سیستم نرم افزار که باعث ایجاد نظم و انضباط در ساختار نرم افزار می شود و کلی چیز دیگه که اصلا سر و تهی ندارد ! تعریف ما (برنامه نویسان) از Architecture (معماری) همانند زیر است :
به عبارت ساده ، تصمیم گیری و اجرای یک معماری خاص یا یک الگوی طراحی خاص،که سبب حل مسائل می شود که ما توسعه دهندگان همیشه با آن مواجه هستیم را معماری یا معماری نرم افزار گویند.
برخی از مشکلات
برخی از مشکلات رایج مانند کدگذاری کثیف باعث می شود حتی تغییر کوچکی در یک قسمت از کد به تغییرات / اشکالات در بخش دیگری از کد منجر می شود.
راه حل
اندروید خودش mvc است یعنی در همه جای اکتیویتی کم و بیش خودش مسول است.شاید در ابتدای امر فرض کنید چقدر خوب هست که خودش همه چیز را مدیریت می کند ولی در اصل اینکار فقط بستن برنامه نویس است شما به جز ویژگی های اندروید هیچ کار خاصی نمی توانید انجام دهید یعنی فقط استفاده از متدهایی که من به شما ارئه میدهم و شما مجبورید از آن استفاده کنید و اینجاست که مشکلات تازه شروع می شوند.
در طی مدتی کم خیلی از معماری هایی مانند MVP, FLUX, MVI, MVVM به منظور حل خطا ها به وجود آمدند.
MVP چیست ؟
presenter واسط بین model و view هست presnter اطلاعات رو از model میگیره و به صورت یک مدل جامعی دیتا (یک شکل داده مثلا json پارس شده ) رو به یه فرمت خاص به View تحویل میده
اگر بخوایم به این صورت بگیم که
View ما میشه اکتیویتی یا فرگمنت ها و…. بخشی است که منتظره , یک کاربر باهاش کاربکنه یعنی باهاش interaction انجام بده بهش میگن user interaction.
Presenter : بهش میگن interactor یعنی بخشی که یک کاری رو انجام میده به اصطلاح case handler هست. یعنی شما یه متودی داری که یکسری Listener داره این میشه بخش Presenter شما.
Model : یک نوع interface که وظیفه ی مدیرت داده ها را دارد.
Presenter : بخش میانی بین ,model و view است و کار آن آپدیت کردن Model است این بخش کار منطقی را نیز در دست دارد.
View : هم نتیجه هایی که به صورت منطقی توسط Presenter انجام شده است را نمایش میدهد.
Mvc چیست ؟
Model : چیزی که باید render شود.
View: چگونه Render شود.
Controller: رویداد های و ورودی کاربر را شامل می شود.
در نهایت چرا MVVM ؟
بی نهایت مقاله و صحبت درباره معماری ها وجود دارد و می توانیم قبول کنیم که محبوب ترین این معماری ها که خیلی flexiable و به صورت گسترده مورد استفاده قرار می گیرد MVP است که در بالاتر آن را تشریح کردیم.
باید این رو قبول کرد که همیشه یک چیز مثل mvp همیشه عالی نیست همیشه راهی برای بهتر بودن وجود دارد.
Google معماری MVP را برای اندروید عرضه کرد حتی خود Google درحال استفاده از معماری MVVM است و از آن هم پشتیبانی می کند !
MVP ساده شده شکل زیر است.
MVVM را در شکل زیر خلاصه کردیم.
برای هر اکتیویتی یا فرگمنت (VIEW) نیازمند Presenter است این یکی از سخت ترین شرایط است. Presenter نگهدارنده Reference برای اکتیویتی است و اکتیویتی نگهدارنده Reference برای Presenter است یعنی ارتباط دوطرفه (عکس یک) یکی از ارتباط هایی که شاید بدترین ارتباط ممکن باشد چون مدیریت این ارتباط زمانی که View ها زیاد شود فوق العاده سخت خواهد بود.
ViewModels یک کلاس ساده است که ارتباط منطقی و model پروژه را مدیریت می کند. اگر متوجه این بخش نشدید لینک زیر را مطالعه کنید.
سلام من یه سوال در مورد ساخت کلاس repository تو معماری mvvm دارم.میدونم وقتی که داریم از دیتابیس استفاده میکنیم به ازای هر موجودیت یک repository باید ساخته بشه تا logic رو توش پیاده سازی کنیم.اما من دارم یه فروشگاه اینترنتی مینویسم و موردی که برام پیش اومده به این صورته:من چند تا activity دارم که توی اونها چندین spinner وجود داره که اطلاعات این spinner ها از سرور میاد(یعنی من باید چند تا درخواست با رتروفیت بزنم تا اطلاعات رو از سرور دریافت کنم و توی اسپینرها نمایش بدم) و بعدش وقتی که کاربر انتخاب هاشو از طریق اسپینرها انجام داد, و مثلا روی دکمه ثبت خرید کلیک کرد,این اطلاعات داخل یه مدل set میشه و یه درخواست خرید میره سمت سرور.حالا سوال من به این شکله:من بعضی از این اسپینرها رو توی activity های دیگه هم دارم,خب حالا تکلیف چیه؟من باید برای هر activity یه repository بسازم و درخواست های سمت سرورم رو توش بزنم یا فقط یه repository داشته باشم ؟(میدونم که به ازای هر view ما یک viewmodel داریم و در مورد repository اینطور نیست اما خب الان باید چه کنم؟اگر فقط یه repository داشته باشم این repository بزرگ و بزرگتر میشه وغیرقابل مدیریت)
سلام ، event driven در اندروید دقیقا چیه و چه کاربردی داره؟ ممنون میشم اگه یه نفر کامل توضیح بده!
مقاله خوب داشت پیش میرفت
ولی چرا آخرش این قدر سریع بسته شد؟؟