Как избавиться от количества обратных вызовов, улучшить дизайн?

#design-patterns #kotlin #dependency-injection #dagger-2 #kodein

#дизайн-шаблоны #kotlin #внедрение зависимостей #кинжал-2 #kodein

Вопрос:

Для Android: у меня есть

  • базовая библиотека с некоторыми базовыми функциями: libCore . libCore написан на Java и содержит некоторые базовые функции с вычислениями, не содержит никаких библиотек, связанных с Android, чистая Java. У него есть интерфейс, предлагающий эти функции внешнему кольцу
  • библиотека, которая использует это ядро: libModule . libModule написан на Kotlin и представляет собой библиотеку Android. libModule импортирует libCore и объединяет эти базовые вычисления с более сложными функциями.
  • наконец, мое приложение для Android: MyApp . MyApp — это приложение для Android, написанное также на Kotlin, оно просто импортирует libModule, а не libCore. На этом уровне мы хотим скрыть содержимое libCore и хотим видеть здесь любые материалы libcore..

введите описание изображения здесь

У меня есть батарея обратных вызовов из libModule в MyApp, которые я тем временем объединил с некоторыми классами-оболочками. Пример:

 class LoginCallbackWrapper {
 internal lateinit var authenticationCallback : AuthenticationCallback
 internal lateinit var loginCallback : LoginCallback
 internal lateinit var andDozenOtherCallback: DozenOtherCallbacks

 val isAuthInitialized = fun(): Boolean{
  return ::authenticationCallback.isInitialized
 }
 //.. also for the other callbacks

}
  

Кроме того, у меня есть другой CallbackWrapper с комбинированными обратными вызовами.

Я надеялся, что есть другой, более элегантный способ для такого количества обратных вызовов? Любой шаблон проектирования, другая библиотека.. Я что-то слышал о Dagger2. Так, может быть, с внедрением зависимостей?

Комментарии:

1. Я думаю, что для любой асинхронной задачи, которая потенциально долго выполняется в фоновом режиме, и у вас есть функции, которые, похоже, позволяют проверять, работает ли какая-либо из них в данный момент… вам придется каким-то образом вести учет этих длительных задач; сохранение ссылки и проверка состояния и т. Д. Даже если вы обернете их в сопрограммы, вам все равно нужно будет сохранить ссылку на задание, чтобы иметь возможность выполнить эту проверку … такое ощущение, что вы можете застрять с этим..

2. Что не так с вашими обратными вызовами? Spring предоставляет перехваты обратного вызова для всех событий своего жизненного цикла. Обычно такова природа программирования, управляемого событиями.

3. Терминологические придирки: это не то, что обычно называют адом обратного вызова. Я бы также избегал термина кластерный, поскольку он имеет особое значение в отрасли (множественные экземпляры одного и того же процесса, настроенные для увеличения параллелизма)

4. @Aaron Hell <- количество и кластеризация <- комбинированный

5. Те обратные вызовы, которые вы написали, они находятся в libModule или MyApp? Возможно, работа с абстракцией в libModule не продвинулась достаточно далеко и предоставляет API, который все еще слишком низкоуровневый: мне трудно понять, почему интерфейсу нужно будет асинхронно управлять дюжиной функций только для входа пользователя.