Какие проблемы возникают при передаче Context в UseCase в Android?

«Какие проблемы возникают при передаче Context в UseCase в Android?» — вопрос из категории Архитектура, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Передача Context в слой UseCase нарушает архитектурные принципы и создает следующие проблемы:

  1. Нарушение чистой архитектуры — UseCase становится зависимым от Android-специфичного компонента, что усложняет его повторное использование вне Android-контекста.
  2. Утечки памяти — Если сохраняется ссылка на Activity или Fragment, это может препятствовать их сборке мусора после уничтожения.
  3. Сложность тестирования — Требуется создание моков Context или использование Robolectric, что замедляет и усложняет unit-тесты.
  4. Проблемы с жизненным циклом — Обращение к невалидному (уничтоженному) 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)
}