[Разработка под Android] История про «боль» и как мы ее исправляем
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Представлюсь, Малюгин Платон Android Lead в Dejavoo Systems. Эта история про нашу "боль" с которой мы боремся уже год и эволюцию нашей архитектуры. Основной профиль — кассовые терминалы для ритейлеров и ресторанов, поэтому многое завязано на особенности индустрии.
В любом случаи изменения архитектуры для приложения, не только усложняет его, но увеличивает количество документации и требует поддержки. Поэтому стоит подумать, а нужно ли на это делать сейчас? Достаточно накопленного опыта и количество блокирующих задач?
Почему сейчас? Можно же дальше страдать и как можно меньше трогать этот экран, раз работает, зачем ломать то, что работает сейчас? Все просто, накопилось большое количество блокирующих задач, для которых требуется переделать текущую структуру заказа, на более сложную, но гибкую. Без переделок не обойтись.
Описание проблемы
Используем одну Activity для заказа, которая поддерживает версию для планшета и для телефона. Нам проще работать с диалогами (у нас диалоги это Activity), а их очень много на этом экране и дублировать не хотелось бы.
Вот так выглядит версия для планшета:
Версию для телефонов собираем из тех же элементов, но с другим навигатором.
Опишу из чего состоит состоит экран:
- Items — фрагмент
- Departments — фрагмент
- Line Items и Amount — фрагмент
- Order Parameters — это отдельная вьюшка
Количество управляемых параметров больше 50, под каждое у нас отдельный метод который дергается на одном из фрагментов, вьюшек и активностей, наш OrderPresenter все растет и растет.
Текущая архитектура
Изначально допустил ошибку и поместил заказ в презентер, только сохранение или изменение вызывает Use case, который обновляет кэш и БД. Нам важно чтобы операции выполнялись последовательно. Например, у заказа есть депозит, при превышении его нужно показать пользователю, что сумма превышена и предложить увеличить депозит.
Выполнение в главном потоке гарантируют, что операции выполняется последовательно, конечно все выполняет довольно быстро, больше всего времени занимает уведомление всех остальных фрагментов, так как главный поток, проседает общая производительность. Пришлось добавлять костыли, например сумма заказа пересчитывается в отдельном потоке (через Use case).
Подытожим:
- В презентере много логики, которой не должно быть
- Много выполняется в главном потоке, хотя стоит вынести в отдельный поток
- Уведомляем только об изменении заказа и каждом объекту, нужно самому обработать что изменилось, так что логика может дублироваться
- В презентере, не получится просто добавить дополнительный запроса к кэше и к БД
- Презентер отвечающий на заказ, на экране заказа, становится "массивным" презентром
- Работаем напрямую с явными структурами, а не через абстракции
Обновление архитектуры
"Все переделать" — пугающие слово, особенно когда нужно больше 2-х месяцев. Но это катастрофа:
- Не делаем новые бизнес задачи
- Можно "перегореть" (чистая психология)
- Сделаем такое, что потребуется переделать
- Поддерживать обе версии, пока окончательно не перейдем
В любом случаи нужно понимать, что бизнес важнее разработки, по сути разработка помогает их заработать, но всегда потребности, которые нужно решить как можно быстрее.
Поэтому можно увеличивать длительность разработки, но не блокировать текущий процесс и вносить правки частями, но которые будут реально работать. После обсуждения договорились поделить на этапы:
- Спроектировать архитектуру и добавить абстракции для полноценной работы
- Адаптировать новую архитектуру под структуру старого заказа
- Добавить поддержку структуру нового заказа
После обсуждений появились общие требования
- Все можно поделить на небольшие куски и поделить в команде
- Каждый новый релиз (у нас цикл релиза 2 недели) получал новые изменения, которые используются
- Должны быть написаны тесты
- Все вычисления должны производится отдельном потоке
- Получение уведомлений в главном потоке
- Желательно не менять UI
- Убрать зависимость от Rx и скрыть под абстракциями
- Упростить работу с зависимостями
Что придумали
Каждая операция добавляет команду в последовательную очередь, команда "дергает" репозиторий, репозиторий дергает диспетчеры, диспетчер может сформировать и отправить уведомление (диспетчеры так же могут работать с данными и тд), либо проигнорировать. Каждый объект подписываются только на свои уведомления и тем самым мы можем ограничить их количество и работать уже с готовыми данными.
Теперь, если пользователь будет "долбить" по экрану очень быстро. то мы сможем все операции обработать, хоть с небольшой задержкой (хотя для глаза это будет менее заметно, чем "зависание" экрана)
Краткая UML схема репозитория:
Итог
Возможно мы придумали велосипед, но архитектура, на мой взгляд, упрощает работу и позволят поддерживать более сложные кейсы. Продолжаем над ней работать.
===========
Источник:
habr.com
===========
Похожие новости:
- [Анализ и проектирование систем] Документирование архитектуры: введение (remastered)
- [Разработка под Android] Android Fragment Result Listener
- [Анализ и проектирование систем, Проектирование и рефакторинг, Управление продуктом] Смешение уровней абстракции закладывает бомбу в основание вашего проекта
- [Информационная безопасность, Гаджеты] В чипе Qualcomm Snapdragon нашли более 400 уязвимостей
- [Смартфоны, Будущее здесь, IT-компании] Google утверждает, что создала самую большую сеть обнаружения землетрясений
- [Смартфоны, Социальные сети и сообщества, IT-компании] WSJ: TikTok собирал MAC-адреса смартфонов пользователей на Android
- [Разработка под Android, Браузеры] Vivaldi 3.2 для Android — Ещё ближе к идеалу
- [Разработка под Android] Hilt еще один DI?
- [Разработка под Android, Обработка изображений, Машинное обучение, DIY или Сделай сам] Как с помощью HUAWEI ML Kit самостоятельно создать апплет для фото на документы
- [Разработка игр, Разработка под Android, Хакатоны] Делаем игру с управлением улыбкой
Теги для поиска: #_razrabotka_pod_android (Разработка под Android), #_arhitektura (архитектура), #_arhitektura_androidprilozhenij (архитектура android-приложений), #_android, #_razrabotka_pod_android (
Разработка под Android
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 14:55
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Представлюсь, Малюгин Платон Android Lead в Dejavoo Systems. Эта история про нашу "боль" с которой мы боремся уже год и эволюцию нашей архитектуры. Основной профиль — кассовые терминалы для ритейлеров и ресторанов, поэтому многое завязано на особенности индустрии. В любом случаи изменения архитектуры для приложения, не только усложняет его, но увеличивает количество документации и требует поддержки. Поэтому стоит подумать, а нужно ли на это делать сейчас? Достаточно накопленного опыта и количество блокирующих задач? Почему сейчас? Можно же дальше страдать и как можно меньше трогать этот экран, раз работает, зачем ломать то, что работает сейчас? Все просто, накопилось большое количество блокирующих задач, для которых требуется переделать текущую структуру заказа, на более сложную, но гибкую. Без переделок не обойтись. Описание проблемы Используем одну Activity для заказа, которая поддерживает версию для планшета и для телефона. Нам проще работать с диалогами (у нас диалоги это Activity), а их очень много на этом экране и дублировать не хотелось бы. Вот так выглядит версия для планшета: Версию для телефонов собираем из тех же элементов, но с другим навигатором. Опишу из чего состоит состоит экран:
Количество управляемых параметров больше 50, под каждое у нас отдельный метод который дергается на одном из фрагментов, вьюшек и активностей, наш OrderPresenter все растет и растет. Текущая архитектура Изначально допустил ошибку и поместил заказ в презентер, только сохранение или изменение вызывает Use case, который обновляет кэш и БД. Нам важно чтобы операции выполнялись последовательно. Например, у заказа есть депозит, при превышении его нужно показать пользователю, что сумма превышена и предложить увеличить депозит. Выполнение в главном потоке гарантируют, что операции выполняется последовательно, конечно все выполняет довольно быстро, больше всего времени занимает уведомление всех остальных фрагментов, так как главный поток, проседает общая производительность. Пришлось добавлять костыли, например сумма заказа пересчитывается в отдельном потоке (через Use case). Подытожим:
Обновление архитектуры "Все переделать" — пугающие слово, особенно когда нужно больше 2-х месяцев. Но это катастрофа:
В любом случаи нужно понимать, что бизнес важнее разработки, по сути разработка помогает их заработать, но всегда потребности, которые нужно решить как можно быстрее. Поэтому можно увеличивать длительность разработки, но не блокировать текущий процесс и вносить правки частями, но которые будут реально работать. После обсуждения договорились поделить на этапы:
После обсуждений появились общие требования
Что придумали Каждая операция добавляет команду в последовательную очередь, команда "дергает" репозиторий, репозиторий дергает диспетчеры, диспетчер может сформировать и отправить уведомление (диспетчеры так же могут работать с данными и тд), либо проигнорировать. Каждый объект подписываются только на свои уведомления и тем самым мы можем ограничить их количество и работать уже с готовыми данными. Теперь, если пользователь будет "долбить" по экрану очень быстро. то мы сможем все операции обработать, хоть с небольшой задержкой (хотя для глаза это будет менее заметно, чем "зависание" экрана) Краткая UML схема репозитория: Итог Возможно мы придумали велосипед, но архитектура, на мой взгляд, упрощает работу и позволят поддерживать более сложные кейсы. Продолжаем над ней работать. =========== Источник: habr.com =========== Похожие новости:
Разработка под Android ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 14:55
Часовой пояс: UTC + 5