Pull to refresh

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 и сокращение рисков при добавлении новых или рефакторинге старых ивентов.
Ну и не стоит бояться рефлексии, если она помогает решить задачу и сократить время разработки. В андроиде и так рефлексия повсюду, причем гораздо более тяжелая по перфомансу.
написав новый ивент легко забыть добавить его в when

А вот если бы Event был sealed class'ом, то не забыли бы. Но вот разрастание when'a никак остановить не получилось бы. Как вариант размазать этот when по куче маленьких классов-обработчиков конкретного типа события.

1) Достаточно перед when(event) написать val result = when(... и kotlin сам начнет ругаться если вы не обработали какой-то кейс
2) Ничего страшного в разрастании нет, а вот использование рефлексии вносит не очевидное поведение в программу.
У нас есть довольно много параметров, которые собираются по ходу дела. И откуда их нужно брать зависит от контекста. Что затрудняет применение этого подхода. Кроме того, затаскивать АОР ради аналитики не очень целесообразно.
Расскажите подробнее про LStat.
Он используется исключительно для мобильных приложений, или для веб-трекина тоже?
LStat (Lamoda Statistics) — это внутренняя система аналитики ламоды. Она используется в Андроид, iOS, мобильный сайт и десктоп.
Это собственная разработка, или вы используете сторонее решение? SnowPlow?
Это собственная разработка
По сути ведь все аналитические системы так или иначе принимают нечто вроде
(eventName: String, eventParams: Map<String, String>)
, верно?

Почему не остановится на единственном методе
track(eventName: String, eventParams: Map<String, String>? = null)
, который логирует пачку параметров вместе с ивентом. Именя ивентов — в константы.

Всякие переменные, которые хочется тянуть с собой через 100500 экранов — вынести на уровень параметров пользователя или сессии.

Т.е. например количество товаров в корзине, примененный промокод и хз что еще — все признак пользователя. Отправлять лишь те параметры вместе с событием, которые релевантны в рамках контекста, а значит уже известны.

Какой кейс у вас, или какие проблемы видите, которые не позволяют упростить аналитику до уровня строки, а не целого объекта?
какие проблемы видите, которые не позволяют упростить аналитику до уровня строки, а не целого объекта

Классические проблемы динамики. Кто то может забыть в мапу нужные параметры закинуть.
Sign up to leave a comment.