#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, который все еще слишком низкоуровневый: мне трудно понять, почему интерфейсу нужно будет асинхронно управлять дюжиной функций только для входа пользователя.