Pull to refresh

Dagger 2 для начинающих Android разработчиков. Внедрение зависимостей. Часть 2

Reading time 3 min
Views 27K
Original author: Hari Vignesh Jayapalan
Данная статья является третьей частью серии статей, предназначенных, по словам автора, для тех, кто не может разобраться с внедрением зависимостей и фреймворком Dagger 2, либо только собирается это сделать. Оригинал написан 1 декабря 2017 года. Перевод вольный.

image

Это третья статья цикла «Dagger 2 для начинающих Android разработчиков.». Если вы не читали предыдущие, то вам сюда.

Серия статей



Ранее в цикле статей


В последней статье мы подробнее разобрали зависимости и внедрение зависимостей. Также мы рассмотрели пример — битву бастардов, где создали класс War с сильными связями (hard dependencies).

Использование драконьего стекла


Давайте вспомним рассмотренный ранее пример — битву бастардов. У класса War есть две сильные связи: Boltons и Starks.

public class War {
    private Starks starks;
    private Boltons boltons;

    public War(){
        starks = new Starks();
        boltons = new Boltons();

        starks.prepareForWar();
        starks.reportForWar();
        boltons.prepareForWar();
        boltons.reportForWar();
    }
}

Пришло время воспользоваться драконьим стеклом и уничтожить Белых Ходоков. Да, мы будем использовать внедрение зависимостей, чтобы устранить сильные связи.

Вспомним идею внедрения зависимостей. Класс не должен создавать другие классы. Вместо этого он должен получать зависимости снаружи. Давайте получим зависимости Boltons и Starks снаружи, через конструктор класса War.

public class War {
    private Starks starks;
    private Boltons boltons;
    
    // Внедрение зависимостей(DI) - получение зависимостей из другого места через конструктор
    public War(Starks starks, Boltons boltons){
        this.starks = starks;
        this.boltons = boltons;
    }

    public void prepare(){
        starks.prepareForWar();
        boltons.prepareForWar();
    }

    public void report(){
        starks.reportForWar();
        boltons.reportForWar();
    }
}

Пример выше — это вариант внедрения зависимостей через конструктор. Вы, наверное, сейчас думаете, что итак постоянно делаете это в своих проектах. Верно, многие используют концепцию внедрения зависимостей, не подозревая об этом.

Класс War должен знать не только о том, как выполнить определенную задачу, но и том, где искать классы, в которых он нуждается для выполнения своих задач. Если мы предоставим всё необходимое для работы нашему классу снаружи, то избавимся от ранее рассмотренных проблем. Класс легко сможет работать с любыми экземплярами других классов, которые нужны ему для выполнения задач, и будет просто тестироваться в изоляции от них. В приложении, использующем внедрение зависимостей, объекты никогда не будут искать зависимости или создавать их внутри себя. Все зависимости предоставляются ему или внедряются в него готовыми к использованию.

В какой-то момент, конечно, кто-то должен создать экземпляры классов зависимостей и предоставить их объектам, которые в этом нуждаются. Обычно такая работа выполняется в точке входа в приложение. В обычном Java приложении, например, такой код можно найти внутри метода main(), как показано ниже. В Android это обычно делается в методе onCreate() внутри Activity.

public class BattleOfBastards {

    public static void main(String[] args){
        Starks starks = new Starks();
        Boltons boltons = new Boltons();

        War war = new War(starks,boltons);
        war.prepare();
        war.report();
    }
}

В классе BattleOfBastards мы создаем зависимости Boltons и Starks и внедряем из через конструктор в класс War. Зависимый класс War зависит от зависимостей Boltons и Starks.

Время по достоинству оценить себя и отпраздновать. Да, мы уничтожили Белых Ходоков (сильные связи)! Надеюсь, вы поняли концепцию того, что мы пытаемся разобрать.

Резюме


В этой статье мы поняли, что класс не должен создавать зависимости внутри себя. Вместо этого, он должен получать их снаружи.

Также мы увидели план простого внедрения зависимостей в действии. Мы взяли пример с битвой бастардов и попытались устранить сильные связи с помощью внедрения зависимостей.

media
image

Что дальше?


В следующей статье мы будем обсуждать библиотеку Dagger 2. Рассмотрим аннотации и то, как Dagger 2 облегчит нам работу по внедрению зависимостей, когда придется столкнуться с более сложными и запутанными проектами. Следующая статья выйдет через неделю.
Tags:
Hubs:
+2
Comments 0
Comments Leave a comment

Articles