Почему слой Presentation не должен напрямую взаимодействовать с данными

Ответ

Presentation слой должен быть "глупым" и отвечать только за отображение данных и обработку пользовательских действий. Прямое взаимодействие с данными нарушает принцип единственной ответственности и усложняет тестирование.

Вместо этого следует использовать паттерн MVVM или Clean Architecture, где:

  • Presentation слой получает данные через ViewModel/Presenter
  • ViewModel/Presenter получает данные из Domain/Data слоев

Пример с MVVM:

// Плохо (нарушение слоев)
class MyActivity : AppCompatActivity() {
    fun loadData() {
        val data = Database.getData() // прямое обращение к БД
        showData(data)
    }
}

// Хорошо
class MyViewModel : ViewModel() {
    private val repo = DataRepository()

    fun loadData() = repo.getData() // данные приходят через репозиторий
}

class MyActivity : AppCompatActivity() {
    private val viewModel: MyViewModel by viewModels()

    fun loadData() {
        viewModel.loadData().observe(this) { data ->
            showData(data)
        }
    }
}

Ответ 18+ 🔞

Э, слушай, а вот это реально больная тема, как будто на дворе 2002-й год. Смотри, есть такие разработчики — пидарасы шерстяные, которые в своём активити или фрагменте сразу лезут в базу данных или в сеть. Ёпта, ну что это за мартышлюшка? Это же пиздопроебибна уровня "Hello, World!".

Сам от себя охуел, когда такое вижу. Представь: у тебя вьюха, которая должна только кнопки показывать и скроллить, вдруг начинает впендюривать SQL-запросы. Это хитрая жопа, которая потом вылезет боком. Терпения ноль, ебать! Тестировать это — в рот меня чих-пых, потому что нужно базу мокать, контекст подсовывать... Овердохуища проблем.

Вот смотри на пример, тут всё ясно как божий день:

// Плохо (нарушение слоев) - делают так только распиздяи
class MyActivity : AppCompatActivity() {
    fun loadData() {
        val data = Database.getData() // Прямое обращение к БД из вьюхи! Ёб твою мать!
        showData(data)
    }
}

Видишь? Активти полезла за данными сама. Доверия ебать ноль к такому коду. Он хрупкий, как хуй с винтом.

А теперь правильный подход, чувак. Используй MVVM или там Clean Architecture, не важно как назвать, главное — смысл.

// Хорошо - здесь уже мозги включали
class MyViewModel : ViewModel() {
    private val repo = DataRepository() // Вьюмодель работает с репозиторием

    fun loadData() = repo.getData() // Данные приходят через правильные слои
}

class MyActivity : AppCompatActivity() {
    private val viewModel: MyViewModel by viewModels()

    fun loadData() {
        viewModel.loadData().observe(this) { data ->
            showData(data) // Активти ТОЛЬКО показывает то, что ей дали. Идеально.
        }
    }
}

Вот видишь разницу? Удивление пиздец! Вьюха стала глупой, как пробка. Её задача — сказать вьюмодели "эй, чувак, дай данные" и нарисовать то, что пришло. Откуда эти данные берутся — из базы, из сети, из файла, из жопы — ей похуй. Волнение ебать — как же это упрощает жизнь! Тестируешь вьюмодель отдельно, тестируешь вьюху отдельно с фейковыми данными. Красота.

Запомни раз и навсегда: Presentation слой — это хуй в пальто, который только рисует. Вся логика, вся работа с данными — это не его собачье дело. Не делай из своей вьюхи смерда пердящего, который всё на себе тянет. Разделяй ответственность, и будет тебе хиросима и нигерсраки в виде чистого и поддерживаемого кода.