Как управлять зависимостями докладчика при использовании Dagger/MVP?

У меня есть докладчик, который имеет несколько зависимостей, которые предоставляются ApplicationComponent, Теперь общая схема, которую я использовал, это использовать @Inject конструктор для ведущего.

Но у меня есть случай, когда у докладчика около 6 зависимостей. Является ли в этом случае инжектор конструктора лучшей практикой? Я нахожу конструктор очень громоздким в такой ситуации. Есть ли другой способ, по которому я скучаю?

1 ответ

Решение

Как и в комментарии EpicPandaForce, наличие большого количества зависимостей в Presenter может быть признаком того, что докладчик делает слишком много. Действительно, в MVP для Президента легко выродиться в "божественный объект". Тем не менее, кажется, что многопараметрический конструктор предпочтительнее, чем изменяемые классы с геттерами и сеттерами, или для внедрения свойств, которое, как в комментарии, скрывает количество зависимостей.

Если вы не можете провести рефакторинг своего докладчика, например, найдя абстракцию более высокого уровня, от которой он зависит, типы проблем, возникающие у конструкторов с большим количеством параметров, рассматриваются в главе 2 " Эффективной Java" Джошуа Блоха.

Одним из вариантов является преобразование конструктора в конструктор (эффективный элемент Java 2). Так что вместо:

public Foo(Bar bar, Baz baz, Zap zap) {
    this.bar = bar;
    this.baz = baz;
    this.zap = zap;
}

У тебя есть:

public class FooBuilder {
    private Bar bar;
    private Baz baz;
    private Zap zap;

    public FooBuilder setBar(Bar bar) {
        this.bar = bar;
        return this;
    }

    public FooBuilder setBaz(Baz baz) {
        this.baz = baz;
        return this;
    }

    public FooBuilder setZap(Zap zap) {
        this.zap = zap;
        return this;
    }

    public Foo createFoo() {
        return new Foo(bar, baz, zap);
    }
}

Это просто сгенерированный Builder, который вы получаете с помощью Android Studio Refactor/Replace constructor with builder функция.

В качестве альтернативы вы можете извлечь объект параметра, однако, возможно, при этом вы нарушите закон Деметры:

class FooParams {
    final Bar bar;
    final Baz baz;
    final Zap zap;

    FooParams(Bar bar, Baz baz, Zap zap) {
        this.bar = bar;
        //etc
    }
}

public Foo(FooParams fooParams) {
    this.fooParams = fooParams;
    fooParams.baz.doBazThings(); //etc
}
Другие вопросы по тегам