Как управлять зависимостями докладчика при использовании 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
}