Comments 12
Использование рефлексии совершенно избыточно, почему нельзя использовать обычный ООП?
interface Collector {
fun track(event: Event)
}
class CollectorImpl : Collector {
override fun track(event: Event) {
when(event) {
is AppStartEvent -> trackAppStart(event)
}
}
private fun trackAppStart(event: AppStartEvent) {
}
}
Есть несколько моментов:
1) Человеческий фактор, написав новый ивент легко забыть добавить его в when
2) Когда ивентов становится много, этот when начинает очень сильно разрастаться
По сути обход классов рефлексией — это замена этого when и сокращение рисков при добавлении новых или рефакторинге старых ивентов.
Ну и не стоит бояться рефлексии, если она помогает решить задачу и сократить время разработки. В андроиде и так рефлексия повсюду, причем гораздо более тяжелая по перфомансу.
1) Человеческий фактор, написав новый ивент легко забыть добавить его в when
2) Когда ивентов становится много, этот when начинает очень сильно разрастаться
По сути обход классов рефлексией — это замена этого when и сокращение рисков при добавлении новых или рефакторинге старых ивентов.
Ну и не стоит бояться рефлексии, если она помогает решить задачу и сократить время разработки. В андроиде и так рефлексия повсюду, причем гораздо более тяжелая по перфомансу.
написав новый ивент легко забыть добавить его в when
А вот если бы Event был sealed class'ом, то не забыли бы. Но вот разрастание when'a никак остановить не получилось бы. Как вариант размазать этот when по куче маленьких классов-обработчиков конкретного типа события.
1) Достаточно перед
2) Ничего страшного в разрастании нет, а вот использование рефлексии вносит не очевидное поведение в программу.
when(event)
написать val result = when(...
и kotlin сам начнет ругаться если вы не обработали какой-то кейс2) Ничего страшного в разрастании нет, а вот использование рефлексии вносит не очевидное поведение в программу.
В сторону AOP не смотрели? Аналитика — это как раз одна из немногих задач, которые хорошо ложатся на эту парадигму: https://habr.com/ru/company/yandex/blog/280117/
Расскажите подробнее про LStat.
Он используется исключительно для мобильных приложений, или для веб-трекина тоже?
Он используется исключительно для мобильных приложений, или для веб-трекина тоже?
По сути ведь все аналитические системы так или иначе принимают нечто вроде
Почему не остановится на единственном методе
Всякие переменные, которые хочется тянуть с собой через 100500 экранов — вынести на уровень параметров пользователя или сессии.
Т.е. например количество товаров в корзине, примененный промокод и хз что еще — все признак пользователя. Отправлять лишь те параметры вместе с событием, которые релевантны в рамках контекста, а значит уже известны.
Какой кейс у вас, или какие проблемы видите, которые не позволяют упростить аналитику до уровня строки, а не целого объекта?
(eventName: String, eventParams: Map<String, String>)
, верно?Почему не остановится на единственном методе
track(eventName: String, eventParams: Map<String, String>? = null)
, который логирует пачку параметров вместе с ивентом. Именя ивентов — в константы.Всякие переменные, которые хочется тянуть с собой через 100500 экранов — вынести на уровень параметров пользователя или сессии.
Т.е. например количество товаров в корзине, примененный промокод и хз что еще — все признак пользователя. Отправлять лишь те параметры вместе с событием, которые релевантны в рамках контекста, а значит уже известны.
Какой кейс у вас, или какие проблемы видите, которые не позволяют упростить аналитику до уровня строки, а не целого объекта?
Sign up to leave a comment.
Как внедрить аналитику и не сломать приложение?