آیا MVP ناجی ماست؟

سطح آموزش: #پیشرفته

توی این پست متوجه شدیم که MVC چیه و یادگرفتیم چطور پیاده‌سازیش کنیم. همچنین دیدیم یک مشکل اساسی در استفاده از MVC داریم. و مشکل اینه که با توجه به ذات اندروید استفاده از اون یک مقدار دشواره.

MVP در برنامه‌نویسی چیست۱؟

MVP مخفف Model View Presenter هست. نقش model و view همونه که در مورد MVC بود. اما توی این الگوی توسعه به جای controller از presenter استفاده میکنیم. در presenter ما منطق رفتاری UI رو هم پیاده‌سازی می‌کنیم و تمام فراخوانی‌های View رو در presenter پاسخ میدیم. presenter از view جدا شده و از طریق interface باهاش در ارتباطه.

فرق MVC و MVP چیست؟

اگر نمونه کدهایی که توی آموزش MVC بهشون لینک دادم رو بررسی کرده باشید میدونید که در این الگوی طراحی مدل میتونه مستقیما view رو تحت تاثیر قرار بده. اما در MVP این امکان بصورت مستقیم وجود نداره.

همچنین در مدل ام وی سی، viewها میتونستن برای خودشون منطقی داشته باشن و متدهایی رو پیاده‌سازی کنن. ولی در mvp یک view صرفا جنبه نمایش داره و به خودی خود هیچ منطق (logic) ـی رو پیاده نمیکنه. (فکر کنم تا حالا متوجه شدید که view در mvp رفتاری مانند layoutها در اندروید داره)

از طرفی view و model هیچ رابطه‌ی مستقیمی با همدیگه ندارن. model میتونه یک رخدادی رو فراخونی کنه ولی presenter هست که به رخداد (event) واکنش نشون میده و بر اساس اون view رو آپدیت میکنه.

تفاوت دیگه اینه که در MVP بخش presenter هست که به رویدادهای کاربر پاسخ میده. درک این مسئله توی برنامه‌نویسی وب خیلی ساده‌تره. برای مثال وقتی روی یک گزینه کلیک میشه در مدل MVC خودِ View میتونه به این کلیک رو گوش بده (listen) و برای اجرای منطق به سراغ controller بره. اما در mvp حتی listen کردن‌ها در presenter اتفاق میفته.

    

همونجوری که توی تصویر هم می‌بینید توی MVC اگر model تغییری داشته باشه view واکنش نشون میده بنابراین باید منطق بیشتری در view پیاده‌سازی بشه. اما در MVP تمام عملیات view در presenter انجام میشه.

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

برای پاسخ دادن به این سوال اول باید بدونید که اندروید به طور ذاتی Single responsibility principle نیست.

Single responsibility principle چیست؟

Single responsibility principle بیان میکنه که هر ماژول یا کلاس مسئول یک وظیفه‌ی مشخصه. ولی توی اندروید به وضوع این مسئله نقض میشه. مثلا یک اکتیویتی در عین حال که UI رو نمایش میده و با کاربر در تعامل هست (از طریق listenerها)، با preferenceها هم در ارتباط باشه و مستقیما مقادیری رو در اون‌ها بنویسه. یا برای استفاده از یک فرگمنت باید مستقیما از اکتیویتی استفاده کرد. بنابراین کلاسی مثل اکتیویتی در اندروید قطعا بیش از یک وظیفه داره.

برای همین اندروید یک ناسازگاری ذاتی با MVP و MVC (کلا هر Single responsibility principleـی) داره. اما در نهایت ما نیاز داریم که یک الگو برای طراحی نرم‌افزارمون داشته باشیم.

 

 

به دلیل اینکه در اندروید اکتیویتی‌ها و فرگمنت‌ها وظایف خیلی زیادی رو بر عهده دارن و با توجه به تفاوت‌هایی که درباره MVP و MVC گفتم پیاده‌سازی MVP در اندروید ساده‌تر و تمیزتر خواهد بود.

رابطه view و presenter در MVP خیلی شبیه به رابطه activity و layoutها در اندروید هست. در حالیکه برای داشتن رابطه view و controller ما احتیاج داریم اکتیویتی رو طوری طراحی کنیم که شامل بخش view بشه. چون نیاز داریم به تعامل‌های کاربر در view پاسخ بدیم و این کار در xml شدنی نیست. از طرفی وظایف زیادی به عهده اکتیویتی و فرگمنت هست که در زمره وظایف controller قرار میگیرن و برای جدا کردن این وظایف از activity/fragment ناچاریم به طور فزاینده‌ای از توابع و interfaceهایی استفاده کنیم که کد رو ناخوانا و پیچیده میکنن.

نتیجه

الگوهای طراحی mvp و mvc رو یادگرفتیم و فهمیدیم چه تفاوت‌هایی دارن. همچنین دیدیم که بهتره در اندروید از mvp استفاده کنیم. برای مشاهده پیاده‌سازی عملی mvp داخل اندروید به این پست مراجعه کنید.

 

پی‌نوشت: برای مطالعه بیشتر راجع به مباحثی که در این پست مطرح شد میتونید به این لینک‌ها سر بزنید: +  +  +  +  +

 

 


۱- دلیل اینکه تاکید کردم در برنامه‌نویسی اینه که معمولا حروف مخفف بیش از یک معنی دارن. مثلا SCM در مدیریت مخفف Supply Chain Management هست در صورتی که توی نرم‌افزار به عنوان مخفف Software Configuration Management یا Source Code Management به کار میره.

اما کاربرد دیگه MVP در Minimum Viable Product هست. این لغت این روزها توی دنیای استارتاپ‌ها خیلی استفاده میشه و از اونجایی که خیلی از استارتاپ‌ها این روزا توی حوزه IT و بخصوص اپلیکیشن‌ها هستن حدس زدم احتمالا به گوشتون خورده و برای اینکه اشتباه نگیرید یک تاکید مضاعفی کردم که منظور من اینجا از MVP پترنِ Model-View-Presenter هست.

7 دیدگاه برای “آیا MVP ناجی ماست؟

    1. بعد از اینکه راجع به Rx صحبت کنیم دوباره راجع به MVP و MVVM صحبت می‌کنم. به نظر من خیلی تفاوتی بین mvp و mvvm وجود نداره. در اصل هر دوی این‌ها نشات گرفته از تفکر همون mvc هستن که به خاطر خاص بودن محیط اندروید (به خاطر وجود اکتیویتی‌ها و لایف سایکل‌ها) تغییرات جزئی کرده و اسم متفاوت گرفته. mvvm از سه بخش model, view, view model تشکیل شده و کاری که view model میکنه تا حدودی همون کاری هست که presenter توی mvp انجام میده با این تفاوت که توی مدل mvp بخش view فقط جنبه نمایش داره در صورتی که توی مدل mvvm بخش view کارهای bindin و unbinding رو هم میکنه. البته خیلی مدل‌های mvp هم من دیدم که دقیقا شبیه به mvvm نوشته شدن.
      نظر شخصی من اینه که اگر توی mvp بخوایم از DataBinding استفاده کنیم عملا میریم به سمت mvvm.
      واقعیت اینه که توی اندروید هیچ استاندارد واحدی وجود نداره که چطور باید مثلا mvvm کد نوشت و اگر به سورس کدهای مختلف از یک مدل نگاه کنید می‌بینید که همه با هم تفاوت‌هایی جزئی دارن. همچنین وقتی به دو مدل مختلف mvp و mvvm هم نگاه کنید می‌بینید علی‌رغم برخی تفاوت‌ها، شباهت‌های خیلی زیادی به هم دارن.
      در نهایت ما هدفمون رسیدن به یک الگوی طراحیه که راحت بشه تستش کرد و به سادگی قابل توسعه باشه. اینکه اسمش رو mvp بذاریم یا mvc یا mvvm خیلی تفاوتی نمی‌کنه.
      شما اگه مقاله خاصی رو خوندید لینکش رو بذارید که من بهتر متوجه شم منظورتون از mvvm دقیقا چه تکنیک‌هایی هست.

      1. درسته خوب حق با شماست تقریبا. تو mvvm اتفاق قشنگی که می افته لایه ویو میتونه خودش شامل یه سری پردازش ها باشه. برای هندل کردن کلیک و بقیه این موارد هم خیلی خوب کار کرده و اندروید خودش این رو ساپورت میکنه به نظر من که خیلی با این کار کردم کدهای بسیار تمیز تر و خوش دست تر از بقیه رو داره. کلا همون طور که فرمودید دیتابایندیگ اتفاق می افته و کلا استفاده از findViewById از پروژه حذف میشه و دیگه نگران کست های اشتباه نیستیم

      2. درسته که همونطوری که گفتین mvp , mvvm تفاوت زیادی شاید نداشته باشن و ما هدفمون رسیدن به طرحی هست که راحت بشه تستش کرد و توسعه داد اما واقعا سوال اینکه که از کدوم اینا استفاده کنیم ، هر کدوم مزیت هایی دارن و مدل نوشتاریشون تفاوت داره ( با تمام شباهت ها ) ؛ البته من همه اینی که میگم رو خوندم ، هنوز استفاده نکردم ، تو سایت ها همچنان دنبال اینم که از کدوم استفاده کنم و این شد که سایت شما رو هم پیدا کردم ، از یکی از دوستان هم که داشتم مشورت میگرفتم که mvp رو شروع کنم میگفت گوگل mvvm رو پیشنهاد داده ( اما خب من یه گشت کوچیک زدم هنوز به همچین متنی برنخوردم ) ؛ به هر حال نظرتون چیه ؟ من با چی شروع کنم ؟ میخوام کارم واقعا مهندسی و نو باشه در زمینه برنامه نویسی اندروید

        1. من چون خیلی با data binding ارتباط برقرار نمی‌کنم به نظرم mvp بهتر از mvvm هست و خودم از mvp استفاده می‌کنم و به زودی آموزش کاملش رو میذارم. این که دوستتون می‌گفت گوگل mvvm رو پیشنهاد کرده شاید به این دلیل بوده که گوگل data binding رو ارائه کرده و mvvm هم ازش استفاده می‌کنه ولی من ندیدم به طور رسمی جایی گوگل از mvvm صحبت کرده باشه کما اینکه اگر آموزش‌های مختلف رو نگاه کنید شاید بین دو تا mvvm هم تفاوت‌های زیادی باشه.
          همچنین میتونید به این لینک سر بزنید. انواع مختلفی از پیاده‌سازی‌ها برای mvp و mvvm توسط مهندس‌های گوگل انجام شده که می‌تونید با هم دیگه مقایسشون کنید.

پاسخ دهید

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