Files
MonthlyPaymentApp/.artifacts/15926d7b-894e-47f6-892f-6114218cde2d/analysis_results.artifact.md
T

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 شروع کنیم که تغییراتی کم‌ریسک اما بسیار موثر در تمیزی پروژه هستند.