Android Настройка рабочего процесса для вкусов продуктов

У меня есть приложение с кучей вкусов продуктов, которые в основном представляют собой белые ярлыки одного приложения. Однако время от времени происходит некоторое отклонение от основного потока в каком-то аспекте, потому что клиент хочет чего-то немного другого. До сих пор мы редактировали код для этих случаев и использовали спагетти-код (множество «если» и «иначе»), чтобы гарантировать, что другие приложения не сломаются. Излишне говорить, что это не очень масштабируемый (или даже разумный) способ сделать это.

Одним из вариантов может быть запись классов действий в исходных папках productFlavor, т. е. src/flavor1/java/AnActivity.java, src/flavor2/java/AnActivity.java и т. д. Поскольку код productFlavor не может переопределять src/mainclasses, это потребует копирования одних и тех же классов для каждого нового варианта, даже если их нет. настройка. Мне этот вариант не очень нравится. Это приводит к большому количеству избыточного кода, а имена классов в конечном итоге становятся не такими описательными, поскольку все они должны иметь одинаковые имена, чтобы переопределить другие, даже если они могут делать что-то другое.

Другим вариантом может быть использование чего-то вроде Dagger для создания ObjectGraph и внедрения Intent для разных реализаций. Например, если это flavor1, при нажатии кнопки X вводится намерение для ActivityA, а если это flavor2, вводится намерение для ActivityB.

Это кажется лучшим способом сделать это, но я все еще не уверен, как реализовать классы, которые переопределяли бы привязки по умолчанию ObjectGraph.

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


person Saad Farooq    schedule 12.10.2013    source источник


Ответы (1)


Вот что я делаю...

In src/flavor1/java/com/myapp/Modules.java:

public class Modules {
  public static Object[] get(Application app) {
    return new Object[] {
      new MyAppModule(app),
      new Flavor1Module(app)
    };
  }
}

In src/flavor2/java/com/myapp/Modules.java:

public class Modules {
  public static Object[] get(Application app) {
    return new Object[] {
      new MyAppModule(app),
      new Flavor2Module(app)
    };
  }
}

In src/main/java/com/myapp/MyAppApplication.java:

ObjectGraph og = ObjectGraph.create(Modules.get(this));

MyAppModule имеет общие зависимости. Flavor1Module и Flavor2Module могут вносить дополнительные зависимости или переопределять зависимости из MyAppModule, если overrides=true.

person Jake Wharton    schedule 13.10.2013
comment
Буя! Вот и все... Я начинаю влюбляться в Dagger - person Saad Farooq; 13.10.2013
comment
О .. просто еще один связанный с этим момент. Если есть переопределения общих зависимостей, влияет ли это на какие-либо переопределения при тестировании. Другими словами, можно ли отменить переопределение? - person Saad Farooq; 13.10.2013
comment
Я не уверен на самом деле. Я не знаю, как это обрабатывается. Я склонен сказать, что последний модуль побеждает (поскольку они упорядочены), но мне придется покопаться. Поэкспериментируйте локально, прежде чем полагаться на такое поведение! - person Jake Wharton; 15.10.2013
comment
Да... Я пытался быть ленивым. Спасибо. - person Saad Farooq; 15.10.2013
comment
@JakeWharton, у меня тот же вопрос, но по поводу Dagger 2. Не могли бы вы взглянуть на это: stackoverflow.com/questions/34033452/< /а> - person ; 02.12.2015