
Sergey
14.10.2018
11:04:09
p.p.s. а еще есть очень занятная штука - conflict free replicated data types. для совсем уж сложных кейсов с синхронизацией стэйта. И в теории можно даже без js такое замутить, просто тупо и сложно

Дмитрий
14.10.2018
11:07:54
Например система бронирования мест. В форме юзер выбирает место и может ввести скидочный купон. Соответственно если место уже занято, а купон уже просрочен, ему надо вывести 2 ошибки

Sergey
14.10.2018
11:08:30

Дмитрий
14.10.2018
11:08:53
Все одним кликом

Google

Дмитрий
14.10.2018
11:09:03
По кнопке забронировать

Sergey
14.10.2018
11:09:31
еще раз - скидочные купоны - это про оплату. Сначала забронируй
ты не должен где-то кникнуть?)

Дмитрий
14.10.2018
11:09:56
Кликаешь на место

Sergey
14.10.2018
11:10:06
ну вот - кликнул - забронировал. Оплата - другая операция

Дмитрий
14.10.2018
11:10:18
Но заказчик не хочет его блокировать до полного конфирма
Ну короче условие заказчика что все в одно действик

Sergey
14.10.2018
11:10:59
1. вероятность того что чел ввел неправильно промокод сильно меньше вероятности что кто-то, пока он вводил промокод, увел у него удобные ему места
2. заказчику нет дела сколько запросов на сервер у тебя уйдет

Дмитрий
14.10.2018
11:11:36
Тут вопрос конверсии
Типа так она выше

Sergey
14.10.2018
11:12:00
ну то что ты описал будет работать оч херово. Ибо тебе важно уменьшить период времени когда два человека могут хотеть одни и те же места

Google

Sergey
14.10.2018
11:12:23
и с точки зрения конверсии сервис который мне постоянно показывает ошибки а не делает что я хочу - хуевый сервис и благо есть и другие
короч, то что ты описал - это херово продуманный UX
который ведет к объединению совсем разных операций + увеличивает вероятность конфликтов на ровтом месте

Дмитрий
14.10.2018
11:13:30
Мы же ре должны от этого зависеть, предметные области могут самыми разными и хотеть много всего
Наше дело придумать как это реализовать
А не доказывать что придуманный интерфейс херовый

Sergey
14.10.2018
11:14:44
не так. твоя задача - проблему решить. Если с решением проблемы тебе приходит бизнес - а ты только формочку сделаешь - это так себе идея поскольку бизнес обычно херовые решения предлагает.

Дмитрий
14.10.2018
11:18:16
Твой подход понятен, интересно еще услышать другие мнения
Я считаю что система должна быть гибкой, если сказали тебе показывать все ошибки сразу, то это не должно вызывать трудностей и противоречить твоей парадигме разработки

Sergey
14.10.2018
11:20:46
бизнесу нет дела как это работает если итоговый результат одинаков.
p.s. с точки зрения конверсии пользователь не должен ждать отрицательного результата)

Дмитрий
14.10.2018
11:22:04
Получается что в твоей модели есть некоторая скованность, которую можно решить при помощи ui
Если один чел выбрал место, но потом не стал оплачивать. За это время другой юзер мог это сделать. И потеряли обоих

Sergey
14.10.2018
11:25:42

Дмитрий
14.10.2018
11:31:56
Правила игры, инварианты ты берешь у бизнеса. Вот бизнес тебе сказал инвариант, что место нельзя забронировать, а потом указать купон. Вполне себе разовая операция, бронирование с указанием купона. Но эта операция требует 2 проверок для сохранения корректности инварианта.
Одна операция не всегда означает одну проверку

Maksim
14.10.2018
11:35:53
билет на самолёт купить проще, чем на вашем замечательном сервисе что-либо) вот те и минусы российского бизнеса: постоянно вылезет обезьяна, которая знает как испортить жизнь клиентам ещё сильнее, чем есть)

Sergey
14.10.2018
11:41:13

Google

Sergey
14.10.2018
11:41:27
точнее даже не так - в случае с промокодами это даже не инвариант. Это прекондишен

Дмитрий
14.10.2018
11:43:36
Вот и как результаты проверок этих прекондишенов показать юзеру?

knopkod4v
14.10.2018
11:45:36

Sergei
14.10.2018
11:46:29

Sergey
14.10.2018
11:46:43

Maksim
14.10.2018
11:46:51

Sergey
14.10.2018
11:47:31
да нет никакой проблемы с тем что бы делать это дело одной операцией. есть проблема в том, что промокот вылазит и увеличивает период времени когда все может пойти пиздой

Sergei
14.10.2018
11:47:39

Sergey
14.10.2018
11:47:55
и @Justmozg не может мне объяснить почему я не могу проверить валидность промокода заранее
просто кто-то пойдет лесом
и как по мне это очень неудобно и вообще попахивает нежеланием разработчиков подумать

Sergei
14.10.2018
11:50:10
не, решение есть - называется блокировки.
Ну так я это решение и озвучил. Даже не всуе будь он упомянут Вордпресс - и тот не даст двум разным юзерам редактировать одновременно одну и ту же статью: одного из них выкинут.

Sergey
14.10.2018
11:50:32
ну это я называю плохим UX
и допускаю такое только в ситуациях когда конкуренции по данным не предвидится. Что не правда в случае букинга мест в кино каком
сделать же синк стэйта между клиентами в целом задача тривиальная
в какой последовательности система должна работать

Maksim
14.10.2018
11:53:50
после того, как спустя 10 минут сбер тебе прислал смску с кодом, ты возвращаешься на сайт и видешь, что билет уже куплен кем-то более быстрым)

Sergey
14.10.2018
11:53:56
- сначала забронировать место
- проверить промокод
- потом перекинуть на оплату
- если любой пункт зафэйлился - отменить бронь
- оплата считается "зафэйленной" если подтверждения оплаты не поступило в течении 15 минут (и лимит на платежку тоже стоит)

Google

Sergey
14.10.2018
11:54:05
то есть от этого правила - бронь в течении N минут всеравно не уйти
единственный вариант - привязывать карточку или покупать каккую-то внутреннюю валюту - но с точки зрения конверсии я бы нахуй такой сервис послал

Maksim
14.10.2018
11:55:23
ну меня, как пользователя, устраивает разумные минут 15 для чекаута. если там гонки на время, то нахуй идут

Sergey
14.10.2018
11:55:57
гибкий как говно сервис

Дмитрий
14.10.2018
11:56:00
Это все так. Речь не о времени оплаты, а о принципиальном условии делать все проверки одновременно после совершения клика по кнопке и выдаче результатов проверок в понятном виде пользователю

Sergey
14.10.2018
11:56:35
сначала тебе всеравно надо проверить бронь. И только потом промокоды
особенно если у промокодов есть лимит на количество применений (скажем первые 1000 человек по промокоду "пидр" получают скидку 20%)

Дмитрий
14.10.2018
11:57:54
Верно, но как выполнить эти проверки без ексепшенов чтоб они обе выполнились
Изначально нас об этом спросили, делать отдельный метод или как то хитро ловить эксепшены

Sergey
14.10.2018
12:01:07
если у тебя зафэйлился первый этап - нет смысла проверять на второй потому что ты не можешь воспользоваться промокодом
как следствие - будет только одна ошибка
возьмем мой кейс с многоразовыми промокодами:
прекондишены:
- промокод должен существовать
- промокод можно применить еще один раз
инварианты
- количество применений промокода не должно привышать N раз

Дмитрий
14.10.2018
12:03:10
Но проверить то все равно можно, независимо от выбора места. Почему бы сразу и не сказать об ошибке.

Sergey
14.10.2018
12:03:43
ну так скажи сразу - до того как пользователь нажал "забронировать"
ему даже кликать не надо - ввел в поле - проверил на прекондишены. Более того, если на момент брони нельзя воспользоваться промокодом - скажи об этом чуваку на чекауте
но не отменяй бронь
(большинство будут продолжать заказ - увеличим конверсию. Отменим- они не будут продолжать с большей долей вероятности)

Дмитрий
14.10.2018
12:06:32
То есть должен быть метод типа isValidCoupon, возвращающий тру или фолс, и клиент должен вызвать этот метод, и этот же метод должен вызываться в методе чекаута

Google

Sergey
14.10.2018
12:06:51
это ж типичные трюки маркетологов. Например ситуация в которую я попал пару месяцев назад когда была акция местной авиокомпании со скидками. Они сделали скидки так что скидка в популярные даты была только либо на "туда" либо на "обратно". И я выбрав интересующие меня даты увидел скидку не в 50% а в 25% по итогу. И я был близок к тому что бы плюнуть и купить как есть. Просто потом подумал что "бля, вообще не выгодно"
с блокировками и всем таким
не вышло - хер с ним. Идем дальше

Дмитрий
14.10.2018
12:07:49
Эта попытка не должна проверять валидность?

Sergey
14.10.2018
12:07:49
запоминаем просто что не вышло что бы предупредить пользователя
Эта попытка не должна проверять валидность?
"проверять валидность" - что ты под этим подразумеваешь? просто я часто вижу людей которые сначала стэйт меняют а потом проверяют. У меня же стэйт не может впринципе стать невалидным.
типа....
apply() {
if (!this.atLeastOneRemain()) {
throw new UnableToApplyPromocode(this.id)
}
this.remember(Promocode.applied(this.id))
}
сам промокод ничего не знает о других операциях - он обработал свою исключитетльную ситуацию. Дальше ты можешь ловить исключение, собирать их в список, делать другие операции - это промокодам не интересно
можешь юзать ивенты (что бы отменить бронь, или не отменять)

Дмитрий
14.10.2018
12:13:37
А если надо проверить возможность применения купона без применения купона?

Sergey
14.10.2018
12:19:17
и вообще можно другую модель для этого юзать
полная свобода
такие проверки никогда не спасут тебя от пограничных сценариев (когда два чувака одновременно пытаются потратить последний промокод)


Aleh
14.10.2018
12:24:03
Я считаю что система должна быть гибкой, если сказали тебе показывать все ошибки сразу, то это не должно вызывать трудностей и противоречить твоей парадигме разработки
Сказали сверху идея так себе для так себе систем. В этой ситуации можно просто забить на качество, все решения приходят сверху же,, они уже продуманя(нет). Все операции должны быть для конкретных юзкейсов и юзкейс это не бронировать только после оплаты, а бронировать. Заказчику не нравится, что место висит заброненное после, так может поменять скрины местами, вначале блокировка денег, а потом выбор места или отмена блокировки? Для таких решений надо иметь аналитику/статистику, иначе гадание на кофейной гуще


Дмитрий
14.10.2018
12:29:02
Место нужно бронить только после ввода всех данных и перехода на внешнюю систему оплаты. Сначала блочить деньги не вариант.

Sergey
14.10.2018
12:30:08

Дмитрий
14.10.2018
12:30:09
Технически проблем с этим нет. Вопрос как грамотно выразить в коде все проверки

Sergey
14.10.2018
12:30:30
как будто бы у тебя это нормальная ситуация - когда что-то идет не так в количестве больше одного косяка на операцию