@oop_ru

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

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

Дмитрий
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
Я считаю что система должна быть гибкой, если сказали тебе показывать все ошибки сразу, то это не должно вызывать трудностей и противоречить твоей парадигме разработки
на UI я могу сделать все что захочу. Бизнес не должен накладывать ограничений один это у меня будет http запрос или два

бизнесу нет дела как это работает если итоговый результат одинаков.

p.s. с точки зрения конверсии пользователь не должен ждать отрицательного результата)

Дмитрий
14.10.2018
11:22:04
Получается что в твоей модели есть некоторая скованность, которую можно решить при помощи ui

Если один чел выбрал место, но потом не стал оплачивать. За это время другой юзер мог это сделать. И потеряли обоих

Sergey
14.10.2018
11:25:42
Получается что в твоей модели есть некоторая скованность, которую можно решить при помощи ui
нет, сковонность я вижу в твоей модели. У меня же руки развязаны за счет того что разные операции остаются разными

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

Одна операция не всегда означает одну проверку

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

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
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

и допускаю такое только в ситуациях когда конкуренции по данным не предвидится. Что не правда в случае букинга мест в кино каком

сделать же синк стэйта между клиентами в целом задача тривиальная

Вот и как результаты проверок этих прекондишенов показать юзеру?
вот тебе другой кейс. - пользователь выбрал место - пользователь ввел промокод - пользователь ввел "оплатить картой" - пользователь кликнул "забронировать" - пользователя кинуло на систему оплаты (внешняя система) где он может провести до 15 минут

в какой последовательности система должна работать

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
Место нужно бронить только после ввода всех данных и перехода на внешнюю систему оплаты. Сначала блочить деньги не вариант.

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

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

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

Страница 777 из 785