آشنایی با Model View Presenter اندروید

آشنایی با Model View Presenter اندروید

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

در این مطلب قصد داریم تا درک بهتری را از اهمیت یک طراحی خوب برای پروژه اندروید در اختیار شما قرار دهیم و دلیل ناکارآمدی معماری استاندارد اندروید در برخی از شرایط را برای شما توضیح دهیم. در ادامه به شرح برخی از مشکلات بالقوه که در طول فرآیند توسعه یک اپلیکیشن اندروید رونمایی می کنند و نیز نحوه رفع این مشکلات و ارتقای قابلیت تست و ارتقای اپلیکیشن با کمک Model View Presenter یا همان الگوی MVP پرداخته خواهد شد.

در این مطلب آموزشی موارد زیر مورد بررسی قرار خواهند گرفت:

- ارزش اعمال الگوهای معماری شناخته شده در پروژه های نرم افزاری

- دلیل سودمندی تغییر معماری استاندارد اندروید

- مفاهیم کلیدی در الگوی MVP

- تفاوت بین MVC و MVP

- نحوه قرارگیری MVP در SDK اندروید

در بخش نخست این مطلب آموزشی تمرکز خود را بر روی تئوری الگوی MVP خواهیم گذاشت و در بخش دوم استفاده از آن در عمل را شرح خواهیم داد.

1. معماری اندروید

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

به طور کلی در فریم ورک یا SDK انتظار می رود تا همه چیز به روش خاصی انجام شود، اما این شرایط برای تمامی پروژه ها به نتیجه مطلوب و مورد انتظار نخواهد انجامید. گاهی اوقات روش از پیش تعریف شده و یا مناسبی برای انجام کارها وجود ندارد و از این رو تصمیم گیری های مرتبط با طراحی بر دوش طراح انداخته می شوند. در اندروید SDK انتظار می رود تا همه چیز به روش خاصی انجام پذیرد، اما این رویکرد همواره کارآمد نیست و بهترین گزینه پیش رو نمی باشد.

اندروید ارائه دهنده یک SDK بسیار خوب است، اما با این وجود الگوهای معماری آن کمی نامعمول اند و ممکن است در فرآیند توسعه برای شما مشکل ساز باشند و این شرایط برای پروژه های پیچیده که نیاز به تست و نگهداری طولانی مدت دارند دشوارتر می گردد. خوشبختانه برای رفع این مشکل چندین راه حل معماری در اختیار ما قرار گرفته و می توان آنها را بسته به شرایط مورد استفاده قرار داد.

مشکل چیست؟

پاسخ به این پرسش کمی دشوار است، برخی بر این باورند که هیچ مشکلی در استفاده از معماری اندروید وجود ندارد و می توان با استفاده از آن کار موردنظر را به انجام رسانید، اما آیا راه کارآمدتری نیز برای انجام کار وجود دارد؟ مسلما جواب این پرسش مثبت است.

ابزارهای ارائه شده توسط اندروید به همراه لی اوت ها، اکتیویتی ها و ساختارهای داده ها ما را در مسیر الگوی MVC هدایت می کنند. MVC یک الگوی خالص بوده که با هدف تفکیک نقش های مختلف یک اپلیکیشن ساخته شده است.

این معماری سه لایه را ایجاد می کند:

- Model

- View

- Controller

blog_17840_1

هریک از لایه ها مسئول یک جنبه از اپلیکیشن می باشند، Model پاسخگوی منطق کاری است، View به رابط کاربری مرتبط می شود و Controller در نقش واسطه ای جهت دسترسی View به Model ظاهر می شود، اما در صورتی که از نزدیک به بررسی و تجزیه و تحلیل معماری اندروید علی الخصوص رابطه بین View (اکتیویتی ها، فرگمنت ها و غیره) و Model (ساختار داده) بپردازید متوجه خواهید شد که نمی توان آن را MVC تلقی کرد، چرا که این معماری تفاوت هایی با MVC داشته و دارای قوانین منحصر به فرد خود می باشد و در صورتی که مایل به ساخت بهترین اپلیکیشن ممکن باشید، احتمالا سد راه شما قرار خواهد گرفت.

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

یک اکتیویتی یا فرگمنت مسئول فراخوانی لودر می باشد که خود به واکشی داده و بازگرداندن آن به والد خود می پردازد و وجود آن بستگی کاملی به والد دارد و هیچ تفکیکی بین نقش View (اکتیویتی/فرگمنت) و منطق کاری که توسط لودر به اجرا در می آید وجود ندارد.

blog_17840_2

چگونه می توان در اپلیکیشنی که داده (لودر) ارتباط قوی با ویو (اکتیویتی یا فرگمنت) دارد به تست واحد پرداخت، در حالی که تاکید فرآیند تست واحد بر روی آزمودن کوچک ترین جز ممکن از کد می باشد؟ در صورتی که در یک تیم کار کنید و مایل به تغییر قسمتی از کد نوشته شده توسط عضو دیگر تیم باشید، در شرایطی که پروژه پایبند یک الگوی معماری شناخته شده نبوده و هیچ نظمی در آن حاکم نباشد، اعمال تغییر برای شما بسیار دشوار خواهد شد.

راه حل این مشکل چیست؟

با جایگذاری و پیاده سازی یک الگوی معماری متفاوت قادر به رفع این مشکل می باشیم، خوشبختانه SDK اندروید به ما امکان گزینش بین راه حل های گوناگون را می دهد. الگوی MVC گزینه خوبی است، اما الگوی MVP گزینه بهتری به نظر می رسد. MVP نیز با فرضیات مشابه MVC توسعه یافته، اما دارای الگوی بهتر و کارآمدتری است که قابلیت تست اپلیکیشن را به حداکثر می رساند.

با در نظر داشتن معماری اندروید می توان به این نتیجه رسید که:

- اندروید برای جداسازی وظایف (separation of concerns) اهمیت چندانی قائل نیست.

- بهتر است معماری اندروید را به همان صورت که هست رها کرد، چرا که در غیر این صورت به مشکلاتی در آینده منجر خواهد شد.

- عدم وجود الگوهای معماری مناسب فرآیند تست واحد را به یک دردسر واقعی بدل می سازد.

- اندروید ما را قادر به گزینش چندین الگوی معماری جایگزین می سازد.

- MVP یکی از بهترین راه حل های در دسترس برای اندروید می باشد.

2. Model View Presenter در اندروید

همانطور که پیش تر نیز اشاره شد، جداسازی وظایف (separation of concerns) نقطه قوت اندروید نیست. خوشبختانه الگوی Model View Presenter این نقطه ضعف را به طرز چشمگیری ارتقا بخشیده و اپلیکیشن را به سه لایه تفکیک می کند:

- Model

- View

- Presenter

هر کدام از این لایه دارای مسئولیت های مختص به خود می باشند و ارتباط بین این لایه ها توسط Presenter مدیریت می شود، در حقیقت Presenter واسط بین بخش های مختلف است.

blog_17840_3

- Model دربرگیرنده منطق کاری اپلیکیشن بوده و نحوه ساخت، ذخیره سازی و تغییر داده ها را تحت کنترل می گیرد.

- View یک رابط غیرفعال است که داده ها را به نمایش گذاشته و عملیات کاربر را به Presenter هدایت می کند.

- Presenter در نقش رابط ظاهر می شود و داده ها را از Model بازیابی کرده و در View به نمایش می گذارد، علاوه بر این به پردازش عملیات کاربر که توسط View برای آن ارسال شده می پردازد.

تفاوت بین MVC و MVP

الگوی Model View Presenter بر پایه الگوی Model View Controller می باشد. از آنجایی که این دو دارای مفاهیم مشابهی هستند، تمایز قائل شدن بین آنها دشوار می باشد. Presenter و Controller دارای نقش مشابهی بوده و هر دو مسئول ارتباطات بین Model و View می باشند، اما Controller با آن شدت و جدیتی که Presenter دارد به مدیریت Model و View نمی پردازد.

blog_17840_4

در الگوی MVC لایه View تا حدودی هوشمند بوده و می توان داده ها را به طور مستقیم از Model واکشی کرد. در الگوی MVP، لایه View کاملا غیرفعال بوده و داده ها همیشه توسط Presenter بدست View می رسند. کنترلرهای موجود در MVC قابل اشتراک گذاری بین چندین View می باشند. View و Presenter در MVP دارای ارتباط یک به یک می باشد و Presenter تنها به یک View پایبند است.

- در MVP، لایه View قادر به دسترسی به Model نمی باشد.

- Presenter به یک View منفرد مرتبط است.

- View در الگوی MVP کاملا غیرفعال می باشد.

این تفاوت های مفهومی باعث می شوند تا الگوی MVP جداسازی وظایف بهتری را به انجام رسانده و قابلیت تست اپلیکیشن را با استفاده از جداسازی بهتر این سه لایه اصلی ارتقا بخشد.

آبجکت های اکتیویتی، فرگمنت و ویو

تفاسیر گوناگونی از نحوه پیاده سازی MVP در اندروید وجود دارد، به طور کلی اکتیویتی ها و فرگمنت ها برای نقش View ظاهر شده و مسئول ساخت Presenter و Model می باشند. View مسئول نگهداری Model و Presenter برای تغییرات پیکربندی است و آنها را از تخریب احتمالی View مطلع می سازد.

سایر آبجکت های View مانند RecyclerView به عنوان بخشی از لایه View در MVP می باشد. یک ارتباط یک به یک بین View و Presenter وجود دارد و گاهی اوقات مشکلات پیچیده نیازمند چندین Presenter می باشند.

آنچه تاکنون می دانیم

- با استفاده از الگوهای معماری و طراحی قادر به پیشرفت به شکل ساده تر و شفاف تری هستیم.

- اندروید فاقد یک الگوی معماری با ساختاربندی خوب می باشد.

- بدون استفاده از الگوهای طراحی پذیرفته شده و باثبات ممکن است با مشکلاتی در زمینه نگهداری و تست مواجه شویم.

- الگوی Model View Presenter جداسازی وظایف را بهبود بخشیده و تست واحد را تسهیل می بخشد.

- Presenter برقرارکننده ارتباطی بین View و Model است.

- View داده ها را به نمایش گذاشته و تعاملات کاربر را به سوی Presenter هدایت می کند.

- Model مسئولیت منطق کاری اپلیکیشن را بر عهده گرفته است.

- نقش View توسط اکتیویتی یا فرگمنت بر عهده گرفته شده است.

نتیجه گیری

در مطلب آموزشی بعدی به نحوه پیاده سازی Model View Presenter در اندروید خواهیم پرداخت و مفاهیمی را که در این مطلب فرا گرفته ایم به کار خواهیم بست و در نهایت پیچیدگی ها و معنای آنها را در اندروید مورد بررسی قرار خواهیم داد.

در پایان این آموزش شما قادر به پیاده سازی MVP در پروژه ها، ساخت فریم ورک خود و یا بکارگیری راه حل های شناخته شده می گردید.

 

http://code.tutsplus.com برگرفته از

اینها را هم بخوانید

نظرات کاربران

  1. avatar
    وحید
    سلام آیا MVP در PHP هم کاربرد دارد؟

    به این نظر پاسخ دهید