Request-Based архитектура на примере Блокнота с открытым исходным кодом
Привет, меня зовут Саша и я Android-разработчик :)
Разрабатывая мобильные приложения я обратил внимание что все операции которые делает приложение - это по сути запросы данных от разных источников.
Часто источниками данных являются: человек, сервер и устройство (User, Server, Platform).
Приложение принимает данные от какого-то источника, преобразует их и выдает преобразованные данные другому источнику и так пока не дойдет до корня дерева запросов.
Подобно тому как вызовы функций вкладываются друг в друга:
Можно написать вот такой код запросов:
Я решил сделать экспериментальное приложение по моей задумке и смотри что из этого получилось :)
Для начала я определился со стеком и целями:
✅ Стек:
Android, Kotlin, Compose, Coroutines, Room
✅ Цели:
- Сделать приложение на Compose
- Попрактиковаться в создании приложений на Compose
- Написать приложение в стиле запрос-ответов
- Написать приложение максимально просто
- Это должно быть полноценное, функциональное приложение
- Использовать код в качестве демонстрации, как домашнее тестовое задание
Затем написал реализацию:
Это варианты действий главного экрана, корзины и списка заметок:
Вся бизнес-логика сводится к такому дерево-графу запросов (и к нему можно прикрутить любую UI реализацию):
Точка входа: main()
Чтобы было понятнее добавил вводные:
✅ Вводные для читателя кода:
- handleRequestsToPlatform() - обработка запросов к платформе
- handleRequestsToUser() - обработка запросов к пользователю
Клиенты - делаем к ним запросы и получаем от них ответы:
- User - пользователь как клиент
- Platform - платформа/OS как клиент
- Backend - бэк как клиент
ToUser - запросы к пользователю:
- PostMessage - передать сообщение пользователю
- GetChoice - получить выбор из вариантов
- GetString - получить текст
Вся работа корутин производится в едином скоупе приложения.
✅ Дополнительно мне удалось:
- отказаться от использования suspend функций (они используются только там где действительно нужны, а в бизнес-логике их нет)
- использовать минимум фреймворков (без фреймворков DI, Flow, доп. навигации, вьюмоделей)
В результате получился легковесный и полнофункциональный Блокнот с простой и наглядной бизнес-логикой.
Залил код проекта на GitHub
Если чего-то не достает для ясности, задавайте мне вопросы и я с удовольствием на них отвечу :)
Ну и "велкам ту зе клаб", подписывайтесь, ставьте звезды проекту, и пишите в комментариях свои мысли.
Спасибо, принимаю!