TGViewer
Андроидѣ | Михаил Белый Андроидѣ | Михаил Белый @foundout · 328 subscribers
Post #372 327
BaseViewModel

Вчера на ютубе попался видос с критикой базовых классов, таких как BaseActivity и BaseViewModel. Антипаттерны это и нарушение принципа единственной ответственности. Полностью согласен. Если с активити все ясно – одна на проект и base-класс не нужен, то вокруг вьюмоделей не прекращается дискуссия с момента их появления.

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

К какому выводу пришел автор видео? Давайте просто переименуем BaseViewModel в MviViewModel! Тьфу, блять! У меня она так всегда и называлась.

В общем простенькая структура со скрина остается. Если где-то придумали лучше – с радостью бы подсмотрел. Я стал мало копаться в чужом коде, насмотренность падает, ощущаю деградацию. Надеюсь безосновательно.

По сути у нас есть Compose и подход Model–View–Intent. Один источник истины в виде единого State. Предсказуемые переходы состояний и понятный контракт между UI и логикой. UI отправляет намерения, ViewModel их обрабатывает, обновляет State и при необходимости отправляет разовые события через отдельный поток эффектов. События можно перенести куда-нибудь, но много ли выиграем? Я пошел дальше – у меня две базовые вьюмодели. Корутинная вторая отвечает за общий хэндлинг ошибок. Тут исходники.

Вижу здесь как минимум три недостатка:
• Подвешивание one-off эффектов. Событие может приходить не в нужный момент из-за паузы UI.
• Гонка асинхронных интентов между собой при росте их количества.
• Нарушение принципа LSP, когда базовая ViewModel параметризована локальным FeatureEvent и нельзя отправить глобальный AppEvent.

Но для приложений на 20 экранов с 3 кнопками на каждом – более чем достаточно и просто в реализации.
More from @foundout
  1. Sep 28, 2026Post #463
  2. Sep 9, 2026Истории про айфон Первый айфончик у меня появился в 24 года. К этим годам одни успевают пе…
  3. Sep 2, 2026Как правильно жить в Республике Бангладеш Жить в прекрасной стране Бангладеш – что может б…
  4. Sep 1, 2026Новые открытия Помню, как зимой, лежа на диване, ругался на концепт зимней арки. Как на оч…
  5. Aug 13, 2026Турецкий скам Я третий раз в Турции. За 4 года моего отсутствия покупательная способность…
  6. Aug 9, 2026Что делать в Черногории Шароебиться по горам. Всё, чем известна Черногория – сюда 20 лет н…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →