Info
Відкрити сторінку на телефоні
Теги: #Dependency Injection #patterns

Dependency Injection: шаблон проектування для відокремлення коду

Dependency Injection (DI) — це концепція в програмуванні, яка допомагає зменшити залежність компонентів системи один від одного та полегшує їхню заміну, розширення та тестування. У DI, об'єкти передаються компонентам через зовнішній постачальник (ін'єктор), замість того, щоб їх створювати всередині самого компонента.

В основі DI лежить принцип інверсії керування (Inversion of Control, IoC). Замість того, щоб компонент сам створював свої залежності, вони надаються йому ззовні. Це може бути здійснено за допомогою конструктора, методів, або інших механізмів.

Розглянемо простий приклад на мові програмування, наприклад, Java.

Приклад без DI:

                        
public class UserService {
    private UserRepository userRepository;

    public UserService() {
        this.userRepository = new UserRepository();
    }

    public void saveUser(User user) {
        userRepository.save(user);
    }
}

                        
                    

У цьому прикладі UserService володіє UserRepository. Проблема полягає в тому, що UserService жорстко залежить від конкретної реалізації UserRepository, що робить код менш гнучким, важчим для тестування та заміни.

Приклад з DI:

                        
public class UserService {
    private UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void saveUser(User user) {
        userRepository.save(user);
    }
}

                        
                    

У цьому прикладі UserService отримує UserRepository через конструктор. Це робить його більш гнучким, оскільки тепер можна легко змінити або замінити UserRepository без впливу на UserService. Це полегшує тестування і підтримку коду в майбутньому.

DI робить програми більш гнучкими, облегшує тестування та сприяє відновленню коду. Цей підхід особливо корисний у великих проектах з багатьма взаємозалежними компонентами.