Почему не стоит писать монолитные приложения без архитектуры

Ответ

Монолитные приложения без четкой архитектуры сложно поддерживать и масштабировать. Со временем код превращается в «спагетти», где бизнес-логика, UI и данные перемешаны. Это приводит к:

  1. Сложности изменений – любая правка затрагивает множество компонентов.
  2. Проблемам с тестированием – без разделения ответственности сложно покрыть код юнит-тестами.
  3. Низкой переиспользуемости – компоненты зависят друг от друга.

Пример плохого подхода:

class MainActivity : AppCompatActivity() {
    override fun onCreate() {
        val data = loadFromNetwork() // Бизнес-логика в UI-слое
        updateUI(data)
        saveToDatabase(data) // Работа с БД прямо в Activity
    }
}

Решение – использовать слоистую архитектуру (Clean, MVVM и т.д.), разделяя ответственность.

Ответ 18+ 🔞

Ёпта, ну вот смотри, как обычно бывает. Начинаешь проект — всё просто, красиво, пишешь код прям в активити, и вроде работает. А потом этот код превращается в такое пиздец-спагетти, что разобраться в нём — это как найти иголку в стоге сена, который ещё и подожгли. Бизнес-логика, отрисовка интерфейса и возня с базой — всё в одной куче, как будто тебе в голову наблевали и взболтали.

И что получается? А получается, блядь, три главные беды.

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

Вторая — проблемы с тестированием. Как ты это протестируешь, если всё склеено на соплях? Никак. Ты не можешь проверить логику отдельно от вьюхи. Это пиздопроебищно.

Третья — низкая переиспользуемость. Код, который должен быть универсальным, припаян намертво к конкретному экрану. Хочешь использовать ту же логику где-то ещё? Переписывай всё заново, потому что выдрать её оттуда — это тот ещё квест.

Вот, смотри на этот пример, просто ебать мои старые костыли:

class MainActivity : AppCompatActivity() {
    override fun onCreate() {
        val data = loadFromNetwork() // Бизнес-логика в UI-слое
        updateUI(data)
        saveToDatabase(data) // Работа с БД прямо в Activity
    }
}

Чувак, это же пиздец! Активти грузит данные из сети, потом сразу лезет в базу, и всё это в одном методе. Это как если бы повар в ресторане сам ехал на ферму за коровой, резал её на кухне, а потом ещё и мыл посуду. Полный распиздяй в коде.

Решение-то, на самом деле, не ракетостроение. Надо просто разделять ответственность. Использовать слоистую архитектуру — ту же Clean, MVVM, не важно как назвать. Суть в том, чтобы UI только показывал, отдельный слой занимался логикой, а за данные отвечал кто-то третий. Тогда и тестировать можно по отдельности, и менять что-то без страха всё развалить. А иначе проект накрывается медным тазом ещё на старте, просто ты этого сразу не замечаешь.