پیاده سازی یک پروژه بر اساس معماری MVP – قسمت دوم
تقریبا ۶ ماهی از نوشتن قسمت قبلی این پست میگذره. تو این مدت مثالهای مختلفی از پیاده سازی معماری MVP توی اندروید رو بررسی کردم و با دیدن روش بقیهی دولوپرها تغییراتی رو روی مثال MVPم در گیت هاب دادم. توی این پست به صورت خلاصه تغییرات و دلیلهاش رو براتون توضیح میدم. اینجوری هم شما میتونید راحتتر سورس پروژه رو بررسی کنید و هم اگه نظری در مورد دلیل تصیمیماتم داشتید، میتونید توی نظرات بنویسید.
اولین تغییری که با باز کردن سورس پروژه حتما متوجه میشید، اضافه شدن پکیچهای جدید به اسم di و interactors و pojos به پروژه هست. به ترتیب دلیل اضافه شدن و کارشون رو میگم.
- پکیج di: همهی کلاسهایی که برای Dagger2 هست رو توی پکیج di گذاشتم، یکی از مزایای استفاده از Dagger2 اینه که باعث شده دیگه نیاز نباشه خودم dependencyها رو new کنم. مثلا اگه داخل یه presenter میخوام از دو تا interactor استفاده کنم، کافیه اسمشون رو توی constructor بنویسم و بقیه کارها رو Dagger2 برام انجام میده.
- پکیج interactors: این پکیج تقریبا مثل data توی نسخهی قبلیه که جایگزین اون شده. دیگه یه interface با پسوند اسمی datasource تعریف نمیکنم که هم یه کلاس به عنوان repository پیادهسازیش کنه و هم کلاسهایی داخل پکیج local و remote . الان دیگه بر اساس وظیفههای مختلف چند تا interactor درست میکنم که متدهای اونها از کلاسهای مختلف داخل پکیج local و remote دادهها رو جمعآوری و پردازش میکنند. مثلا کلاس UserInteractor شامل متدهای setTokenLocal، getTokenLocal، isUserLogged، logout و login میشه که این متدها مرتبط با احراز هویت کاربر هستند. در هر presenterیی که نیاز به اطلاعاتی از کاربر باشه کافیه که اسم این interactor رو توی constructor اون بنویسید. حالا پشت قضیه این interacotr احتمال داره خودش از سه کلاس مختلف که داخل پکیج های remote و local هست استفاده کنه. مثلا کلاس دیتابیس برای ذخیره اطلاعات کاربر توی دیتابیس، یه کلاس برای ذخیرهی توکن توی sharepref و یه کلاس هم برای دریافت توکن از وب سرویس. برای درک بهتر میتونید شکل زیر رو نگاه کنید.
- پکیج pojo: توی این پیکیج Entityها و کلاسهایی که برای تبدیل Jsonها استفاده میشن رو میذارم. خود این کلاس میتونه در پروژههایی که کلاسهای زیادی داره پکیجبندی بشه.
غیر از سه تا پکیج بالا که گفتم، دو تغییر پکیجی دیگه هم داده شده. اولین تغییر حذف شدن پکیج adapters هست. هر ویژگی که داخل پکیچ features هست اگه نیاز به adapter داشت، میتونه داخل خودش کلاس adapter رو در کنار بقیه فایلهاش نگه داره. دلیل این تصمیم این بوده تا جایی که میشه هر feature همه فایلهای مورد نیازش در کنار هم باشه تا در زمان توسعه یا اشکالزدایی کار راحتتر باشه.
تغییر دیگه هم جابهجایی customviews به داخل پکیج utils هست که تغییر مهمی نیست، فقط برای این بود کمی خلوتتر بشه ???
یه فایل gradle به اسم libraries هم اضافه شده که داخلش لیست کتابخونهها همراه با نسخهشون قرار داده شده. دلیل اضافه شدن این فایل اینه اگه پروژه ماژولهای مختلفی داره، چون همشون اسم کتابخونه و نسخهاش رو از این فایل میخونند دیگه ناهماهنگی نسخهها بین ماژولهای یه پروژه پیش نیاد. در انتهای فایل build.gradle ماژول app هم دو تیکه کد اضافه شده که اولی برای نامگذاری فایل apk نهایی بر اساس versionName هست و دومی برای sign کردن خودکار برنامه استفاده میشه.
به جای اینکه پست رو طولانی کنم، بهتره که خودتون کد رو بررسی کنید. من هر چند وقت تغییراتی که به نظرم بهتره رو روی این پروژه انجام میدم، اگه علاقمند هستید میتونید از گزینهی watch گیت هاب استفاده کنید تا از این تغییرات باخبر بشید. در آخر هم بگم این معماری و پکیجبندیهایی که گفتم بهترین روش نیست و من بر اساس تجربههای شخصیم یا مطالعه کدهای بقیه به دست آوردم درستش کردم.
لینک گیت هاب پروژه: https://github.com/abbas-oveissi/SearchMovies