По какой методологии работаешь на текущем проекте

Ответ

На текущем проекте мы используем MVVM (Model-View-ViewModel) с элементами Clean Architecture. Это позволяет разделять ответственности, упрощает тестирование и поддерживает реактивность через LiveData/Flow.

Пример структуры пакетов:

app/  
  ├── data/ (репозитории, API, DB)  
  ├── domain/ (use cases, entities)  
  └── presentation/  
      ├── view/ (Activity/Fragment)  
      └── viewmodel/  

Код ViewModel с LiveData:

class UserViewModel(repo: UserRepository) : ViewModel() {  
    private val _users = MutableLiveData<List<User>>()  
    val users: LiveData<List<User>> = _users  

    fun loadUsers() {  
        viewModelScope.launch {  
            _users.value = repo.getUsers()  
        }  
    }  
}  

Дополнительно применяем SOLID и KISS для читаемости кода.

Ответ 18+ 🔞

А, ну ты про архитектуру в андроиде спрашиваешь? Ёпта, сейчас все такие умные стали, только и слышишь — MVVM, Clean, SOLID. Будто без этого нихуя не работает.

Так вот, слушай сюда, пока не поздно. Мы на проекте юзаем MVVM (Model-View-ViewModel), да ещё и с припиздюлиной от Clean Architecture. Зачем? А чтобы, блядь, не было потом этой каши, где в одном файле и сетевой запрос, и кнопку красишь, и в базу пихаешь. Это же пиздец, чувак, через месяц сам свой код читать не сможешь, как китайскую грамоту.

Смысл в чём? Разделить всё по папочкам, чтобы каждая сущность знала своё место. Data — это там, где вся грязь: API, база данных, репозитории, которые всё это хавают. Domain — это уже мозги, use cases и бизнес-сущности, чистенькие, нихуя не знают про андроид. А Presentation — это уже наша витрина: активити, фрагменты и вьюмодели, которые между всем этим мостик.

Вот смотри, как это выглядит в коде, простой пример вьюмодели для пользователей. Главная фишка — LiveData (или Flow, если ты не лох и юзаешь корутины). Она как раз и делает эту реактивную магию: данные обновились — вью сама подтянулась.

class UserViewModel(repo: UserRepository) : ViewModel() {  
    private val _users = MutableLiveData<List<User>>()  
    val users: LiveData<List<User>> = _users  

    fun loadUsers() {  
        viewModelScope.launch {  
            _users.value = repo.getUsers()  
        }  
    }  
}  

Видишь? Вьюмодель дергает репозиторий, получает данные и кладёт их в MutableLiveData. А вью (активити или фрагмент) просто подписывается на users и рисует, что пришло. Никакого прямого общения, всё через этот прослойку. Красота, ёпта! Доверия ебать ноль между слоями, каждый сам за себя.

И да, не забудь про SOLID и KISS. Это не просто модные слова, чтобы в резюме писать. Это чтобы твой код не превратился в пиздопроебибну, где одно изменение в одном классе ломает половину приложения. Каждый класс должен делать одну хуйню и делать её хорошо. И пиши просто, без этих наворотов, которые только ты один понимаешь. Иначе придёт тимлид, посмотрит и скажет: «Чувак, ты веришь, что это будет работать? Будет вам хиросима и нигерсраки в продакшене».

Короче, идея простая: разделяй, властвуй и не создавай себе же проблем на ровном месте. А то потом сидишь и думаешь: «Какого хуя я это так написал?».