Ответ
Передача Context в слой UseCase нарушает архитектурные принципы и создает следующие проблемы:
- Нарушение чистой архитектуры — UseCase становится зависимым от Android-специфичного компонента, что усложняет его повторное использование вне Android-контекста.
- Утечки памяти — Если сохраняется ссылка на
ActivityилиFragment, это может препятствовать их сборке мусора после уничтожения. - Сложность тестирования — Требуется создание моков
Contextили использование Robolectric, что замедляет и усложняет unit-тесты. - Проблемы с жизненным циклом — Обращение к невалидному (уничтоженному)
Contextприводит кIllegalStateExceptionили крашам.
Решение: Передавайте в UseCase только необходимые данные или абстракции, а не Context.
// Плохо: Зависимость от Android Context
class GetUserNameUseCase(private val context: Context) {
fun execute(): String = context.getString(R.string.user_name)
}
// Хорошо: Передача конкретных данных
class GetUserNameUseCase(private val userName: String) {
fun execute(): String = userName
}
// Альтернатива: Использование абстракции (например, для ресурсов)
interface StringProvider {
fun getString(@StringRes resId: Int): String
}
class GetUserNameUseCase(private val stringProvider: StringProvider) {
fun execute(): String = stringProvider.getString(R.string.user_name)
}