Skip to content

Repository files navigation

Приложение "Блокнот"

и "Архитектура построенная на запросах"

Привет :)

Я обратил внимание что все операции которые делает приложение - это по сути запросы данных от разных источников.

Будь то машина или человек.

Приложение принимает данные от какого-то источника, преобразует их и выдает преобразованные данные какому-то источнику.

Решил сделать экспериментальное приложение и вот что из этого получилось :)

Вся бизнес-логика сводится к такому дерево-графу запросов (к которому можно прикрутить любую платфоменную и UI реализацию)
interfaceIChoiceclassBack : IChoiceclassCancel : IChoiceinterfaceIMenuItem : IChoice {
val text:String
}
enumclassMainMenu(overridevaltext:String) : IMenuItem {
AddNote("Написать заметку"),
ReadNotes("Читать заметки"),
SearchNotes("Искать заметки"),
Trash("Корзина"),
}
enumclassTrashMenu(overridevaltext:String) : IMenuItem {
ReadNotes("Читать заметки"),
SearchNotes("Искать заметки"),
EmptyTrash("Очистить корзину"),
}
sealedclassNotesChoice() : IChoice {
data classRemove(valnote:Note) : NotesChoice()
data classSelect(valnote:Note) : NotesChoice()
}
funmain() {
ToUser.GetChoice(
title ="Блокнот",
items =MainMenu.entries,
canBack =false
).request { choice ->when (choice) {
MainMenu.AddNote-> {
editNote()
}
MainMenu.ReadNotes-> {
ToPlatform.GetNotes().request { notes ->
readNotes(notes)
}
}
MainMenu.SearchNotes-> {
searchNotes()
}
MainMenu.Trash-> {
ToPlatform.GetNotes(removed =true).request { removedNotes ->
openTrash(removedNotes)
}
}
}
}
}
funopenTrash(removedNotes:List<Note>) {
// ...
}
funsearchNotes(removed:Boolean = false) {
ToUser.GetString(
title ="Поиск заметок",
label ="Искать строку",
actionName ="Найти",
).request { response ->when (response) {
isBack-> {
User.requestPrevious()
}
isString-> {
ToPlatform.GetNotes(query = response, removed = removed).request { notes ->
readNotes(notes, "Заметки по запросу \n\n\"$response\"")
}
}
}
}
}
funeditNote(initial:Note? = null) {
// ...
}
funreadNotes(notes:List<Note>, title:String = "Заметки") {
ToUser.GetChoice(
title = title,
items = notes.toMutableStateList(),
).request { response ->
debug {
println("choice: $response")
}
when (response) {
isBack->User.requestPrevious()
isNotesChoice.Remove-> {
response.note.removed =trueToPlatform.UpdateNote(response.note)
.request {
User.request.pop()
ToPlatform.GetNotes().request { notes ->
readNotes(notes, title)
}
}
}
isNotesChoice.Select-> editNote(response.note)
}
}
}

✅ Стек:

Android, Kotlin, Compose, Coroutines, Room

✅ Цели:

  • Сделать приложение на Compose
  • Попрактиковаться в создании приложений на Compose
  • Написать приложение в стиле запрос-ответов
  • Написать приложение максимально просто
  • Это должно быть полноценное, функциональное приложение
  • Использовать код в качестве демонстрации, как домашнее тестовое задание

✅ Дополнительно удалось:

  • отказаться от использования suspend функций (они используются только там где действительно нужны)
  • использовать минимум фреймворков (без фреймворков DI, Flow, навигации, вьюмоделей)

✅ Вводные для читателя кода:

Точка входа: main()

  • handleRequestsToPlatform() - обработка запросов к платформе

  • handleRequestsToUser() - обработка запросов к пользователю

  • Клиенты - делаем к ним запросы и получаем от них ответы

    • User - пользователь как клиент
    • Platform - платформа/OS как клиент
    • Backend - бэк как клиент
  • ToUser - запросы к пользователю

    • PostMessage - передать сообщение пользователю
    • GetChoice - получить выбор из вариантов
    • GetString - получить текст
  • ToPlatform - запросы к платформе/OS

    • ...

Вся работа корутин производится в едином скоупе приложения.

Данные сохраняются в БД с помощью Room.


🏁 Если есть вопросы и предложения то напиши мне в телеграм 🏁

About

Приложение "Блокнот" и Request Based Arhitecture

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages