4.3 KiB
گزارش تحلیل و پیشنهادات بهبود پروژه MonthlyPaymentApp
این گزارش شامل بررسی فنی ساختار پروژه و ارائه راهکارهای عملی برای بهبود کیفیت کد، نگهداری آسانتر و رعایت استانداردهای توسعه اندروید است.
۱. معماری و مدیریت وابستگیها (DI)
وضعیت فعلی
پروژه از DI دستی در کلاس PaymentApplication استفاده میکند. با رشد پروژه، مدیریت کارخانههای ViewModel (Factories) دشوار و مستعد خطا خواهد بود.
پیشنهاد
استفاده از Hilt (Dagger) برای مدیریت وابستگیها.
- مزیت: حذف کدهای تکراری در
ApplicationوActivityو سادهسازی فرآیند تست واحد. - اقدام: افزودن کتابخانههای Hilt به
build.gradle.ktsو استفاده از آنوتیشنهای@HiltAndroidAppو@HiltViewModel.
۲. بازنگری در ViewModels (اصل Single Responsibility)
وضعیت فعلی
فایل PersonViewModel.kt با حدود ۱۰۰۰ خط کد، تبدیل به یک God Object شده است. این کلاس همزمان وظایف زیر را انجام میدهد:
- مدیریت احراز هویت (Auth)
- مدیریت لیست افراد و پرداختها
- ارسال پیامکهای گروهی و تکی
- خروجی اکسل (Excel Export)
- جستجو در مخاطبین گوشی
پیشنهاد
تقسیم PersonViewModel به کلاسهای تخصصیتر:
AuthViewModel: برای لاگین و ثبتنام.PersonListViewModel: برای نمایش و فیلتر لیست افراد.SmsServiceیاSmsHelper: برای منطق ارسال پیامک.ExportManager: برای تولید فایلهای گزارش.
۳. جداسازی Context از لایه منطق
وضعیت فعلی
در متدهایی مانند processNextBulkSms(Context) یا exportYearlyReport(..., Context) در ViewModel، از Context استفاده شده است.
- مشکل: این کار باعث نشت حافظه (Memory Leak) احتمالی میشود و تستنویسی (Unit Testing) را غیرممکن میکند.
پیشنهاد
ViewModel نباید هیچ دانشی از Context داشته باشد.
- راهکار: برای مواردی مثل نمایش Toast یا شروع Intent، از یک
SharedFlowبرای ارسال UI Events به Activity استفاده کنید.
۴. بهبود لایه UI و Compose
وضعیت فعلی
فایلهایی مثل PersonScreen.kt و MainActivity.kt بسیار طولانی هستند. کامپوننتهای UI و منطق ناوبری در هم تنیده شدهاند.
پیشنهاد
- شکستن کامپوننتها: بخشهای مختلف صفحه (مانند SearchBar، PersonItem، Dialogs) را به فایلهای جداگانه در پکیج
ui.componentsمنتقل کنید. - String Resources: تمام رشتههای فارسی هاردکد شده (مانند "آیا از حذف قطعی... مطمئن هستید؟") را به فایل
res/values/strings.xmlمنتقل کنید.
۵. پیشنهادات فنی تکمیلی
- نوسازی پکیجها: پکیجهای
utilوutilsرا ادغام کنید تا ساختار پروژه تمیزتر شود. - Supabase Realtime: با توجه به استفاده از Supabase، مطمئن شوید که از قابلیت Realtime برای همگامسازی آنی دادهها بین دستگاههای مختلف استفاده میکنید.
- Room Migrations: برای دیتابیس محلی، استراتژی مهاجرت (Migration) را مشخص کنید تا در آپدیتهای بعدی، دادههای کاربر پاک نشود.
Tip
اگر مایل باشید، میتوانیم با راهاندازی Hilt یا انتقال متون به strings.xml شروع کنیم که تغییراتی کمریسک اما بسیار موثر در تمیزی پروژه هستند.