Sobes.tech
Middle

Оё бо истифодаи Dagger дар таҳияи барномаҳои Android шносӣ?

sobes.tech AI

Ҷавоб аз AI

Бале, ман шиносем. Dagger як рамка барои ворид кардани вобастагиҳо (Dependency Injection, DI) дар Java ва Android мебошад, ки дар вақти ҷамъоварӣ компилютсия мешавад ва имкон медиҳад, ки код оптимизатсияшуда, самаранок ва осон тестшаванда эҷод шавад.

Концепсияҳои асосӣ иборатанд аз:

  • Модулҳо (Modules): Вобастагиҳоро таъмин мекунанд. Бо @Module ишора карда мешаванд. Дар дохили модул, методҳо бо @Provides нишон медиҳанд, ки чӣ гуна вобастагиро эҷод кардан мумкин аст.
    @Module
    public class AppModule {
    
        @Provides
        // таъмин мекунад контексти барнома
        Context provideAppContext(Application application) {
            return application.getApplicationContext();
        }
    
        @Provides
        // таъмин мекунад SharedPreferences
        SharedPreferences provideSharedPreferences(Context context) {
            return context.getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
        }
    }
    
  • Компонентҳо (Components): Модулҳоро пайваст мекунанд ва вобастагиҳоро ворид мекунанд. Бо @Component ишора карда мешаванд. Компонентҳо "графҳои вобастагиҳо" мебошанд.
    @Singleton
    @Component(modules = {AppModule.class})
    // компоненти барнома
    public interface AppComponent {
    
        // метод барои ворид кардан ба MainActivity
        void inject(MainActivity activity);
    
        // метод барои гирифтани SharedPreferences аз граф
        SharedPreferences getSharedPreferences();
    }
    
  • Воридкунӣ (Injection): Процеси ворид кардани вобастагиҳо. Бо @Inject барои майдонҳо ё конструкторҳо истифода мешавад.
    public class MainActivity extends AppCompatActivity {
    
        @Inject
        // вобастагии, ки Dagger ворид мекунад
        SharedPreferences sharedPrefs;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // Dagger кодро барои эҷоди компонент ва ворид кардан мебарорад
            ((MyApplication) getApplication()).getAppComponent().inject(this);
    
            // акнун sharedPrefs дастрас аст
            String value = sharedPrefs.getString("key", "default");
            Log.d("MainActivity", "Маъно аз SharedPreferences: " + value);
        }
    }
    
  • Ҳудудҳо (Scopes): Имкон медиҳанд, ки давраи ҳаёти вобастагиҳоро идора кунанд. @Singleton барои вобастагиҳо бо давраи ҳаёти барнома, инчунин анотацияҳои махсус барои минтақаҳои маҳдуд (масалан, @PerActivity).
    @Scope
    @Retention(RetentionPolicy.RUNTIME)
    // минтақаи махсус барои фаъолият
    public @interface PerActivity {}
    

Dagger инчунин аз зеркомпонентҳо (@Subcomponent) барои эҷоди графҳои хурдтар ва ҳиерархӣ, ки барои барномаҳои модулӣ ё вобастагиҳо бо давраи кӯтоҳ (масалан, сессияҳои корбар ё экранҳои мушаххас) муфид аст, дастгирӣ мекунад.

Афзалиятҳои асосии истифодаи Dagger:

  • Маҳорати иҷроиш: Коде, ки дар вақти компилютсия истеҳсол мешавад, хароҷоти вақти иҷроиро дар муқоиса бо рамзҳои DI рефлексивӣ кам мекунад.
  • Таҳқиқшавандагӣ: Графи вобастагиҳо бо компилятор санҷида мешавад, хатогиҳо дар вақти сохтмон ошкор мешаванд, на дар вақти иҷроиш.
  • Тестшавандагӣ: Восита медиҳад, ки вобастагиҳои воқеиро бо объектҳои mock дар вақти тестро иваз кардан осон аст.
  • Тавсиф ва нигоҳдорӣ: Вобастагиҳои компонентҳоро равшан тасвир мекунад.