پیاده سازی یک پروژه بر اساس معماری MVP
توجه: ساختار پروژه تغییر کرده است.در یک پست جدید تغییرات توضیح داده می شود.البته اگر مایل هستید با استفاده از لینک آخر این پست میتوانید به پروژه ی قدیمی دسترسی داشته باشید.
مدت هاست که به صورت پراکنده در رابطه با معماری های نرم افزار در اندروید مطالعه می کنم. انعطاف اندروید به توسعه دهنده امکان می دهد که از معماری های مختلف مانند MVP ،MVVM ،Clean Arch و … در ساخت اپ استفاده کند. انتخاب یکی از این گزینه ها بسیار مشکل است، به همین دلیل تا زمانی که یکی از این معماری ها را برای اپ های خود انتخاب کنم، سعی کردم با استفاده از Package بندی مناسب پروژه و جداکردن کلاس ها از یکدیگر، قابلیت توسعه پذیری و نگهداری پروژه را بالا نگه دارم. به مرور و بر اساس تجربه ای که در ساخت اپ های جدیدتر پیدا کردم با بهبود ساختار پروژه ها، به یک اسکلت ثابت رسیدم اما بزرگترین کمبودی که همچنان در پروژه ها احساس می کردم، عدم امکان تست نرم افزار به دلیل در هم تنیدگی بخش UI (اکتیویتی و فرگمنت ها) با باقی بخش ها بود. به این ترتیب به مفید بودن مطالعه ی معماری ها پی بردم ولی تا زمانی که به شخصه در یک پروژه از آن ها استفاده نکرده ام نمی توانم مزایا و معایبش را درک کنم. به همین دلیل با یک پروژه ی تمرینی، از ساده ترین معماری یعنی MVP که از قدیم آشنایی بیشتری با آن داشتم، شروع کردم. برای اینکه پروژه ی تمرینی به پروژه های واقعی نزدیکتر باشد، از یک وب سرویس عمومی و رایگان به نام OMDb یا Open Movie Database کمک گرفتم که اطلاعات فیلم های مختلف را در اختیار عموم می گذارد.
در تمامی پروژه های قبل، برای ارتباط با وب سرویس از Volley استفاده کرده بودم اما از آنجا که Retrofit سازگاری بیشتری با RxJava دارد، در این پروژه آن را جایگزین Volley کردم. دلیل استفاده از Rxjava، مزیت های آن مانند ترکیب چند جریان داده ای از منابع مختلف به یک جریان داده ای و کنترل خطا است.
توضیحات مربوط به ساختار پروژه:
- از آنجا که ممکن است پکیج های adapters ،customview و utils در بخش های مختلف اپ استفاده شوند، بیرون قرار گرفته اند.
- پکیج data یا لایه ی Model وظیفه ی دریافت اطلاعات از منابع مختلف مثل وب سرویس، دیتابیس یا فایل ها را دارد، کلاسی که نام آن پسوند Repository را دارد نقش یک لایه روی همه منابع را دارد و براساس درخواست Presenter با تجمیع اطلاعات از منابع مختلف آن را در اختیار Presenter می گذارد.
- ایده ام برای پکیج feature از صحبت توسعه ی دهنده ی اپ sound cloud گرفته شده است که هر ویژگی به صورت جداگانه و بدون وابستگی به بقیه ی سیستم توسعه داده شود و برای ارتباط آن ها از EventBus ها استفاده کردم. البته احتمال تغییر در این بخش از ساختار پروژه زیاد است.
امیدوارم با کامل شدن کدهای اولیه ی این مثال بتوان در آینده نکته هایی که در مقاله های مختلف یاد می گیرم و یا خودم تجربه خواهم کرد را در این پروژه اضافه کنم.
خروجی پروژه در تصویر زیر قابل مشاهده است. بر اساس رشته ی وارد شده توسط کاربر، اطلاعات از وب سرویس به صورت صفحه به صفحه دریافت می شود و به آخر RecyclerView اضافه می شود. در این مثال از endless scroll استفاده شده است که با پایین رفتن کاربر اطلاعات جدید لود می شود.
لینک گیت هاب پروژه: https://github.com/abbas-oveissi/SearchMovies/releases/tag/v1.0