
Sergey
14.10.2018
21:23:02
оно и в джаве норм делается. и в чем хочешь. Просто в скалах всяких можно много всяких других интересных вещей делать

Aleh
14.10.2018
21:51:36
или вот
так а в чем проблема, чето аля
return Promise.all([
firstOp(request),
secondOp(request),
thirdOp(request, smthElse)
]).then(() => response.ok(), e => response.error(e))

Google

First
14.10.2018
21:51:57
У меня в рубях это зовется Result
и я до сих пор путаю (пишу Either) ?

Aleh
14.10.2018
21:54:09
ну не самая большая проблема)

First
14.10.2018
21:54:28
По сравнению с руби - да, не большая :)

Dmitry
14.10.2018
23:18:41
для джавы ведь есть vavr, там чего-то для описанной выше валидации не хватает разве?

Yury
15.10.2018
16:15:19
http://gorodinski.com/blog/2012/05/19/validation-in-domain-driven-design-ddd/
В этой статье есть такой вывод:
It is easier to duplicate validation logic than to keep it consistent across application layers.
Согласны ли вы, на практике у вас так и есть или все наоборот?

Adel
15.10.2018
16:16:27
не читая - согласен. дублировать реально проще.

First
15.10.2018
16:16:51

Aleh
15.10.2018
16:27:43
И другие приключения в языках без статической типизации :|
IO всегда надо покрыть валидацией, а дальше уже нет "валидации", дальше уже бизнес-логика

First
15.10.2018
16:30:47
Ты еще either верни
Валидировать данные он собрался, ля
Юзерам нужно доверять!

Google

Aleh
15.10.2018
16:32:11
Лучше вообще прям зашмвать в проекте шелл где-нибудь
Чтобы мало ли че, зашел - поправил

First
15.10.2018
16:32:25

Артур Евгеньевич
15.10.2018
16:40:22
Более подробно выскажусь после прочтения)

Yury
15.10.2018
16:50:14
Если кратко:
Он валидирует на UI (он может быть как в браузере, так и на бекенде, так и на desktop). А потом "валидация" происходит еще раз, при создании доменного объекта. Хотя скорее это инвариант а не валидация, но тут есть разногласия что это.

Konstantin
16.10.2018
06:38:49

Bohdan
16.10.2018
07:05:59
https://habr.com/company/avito/blog/426101/

Maksim
16.10.2018
07:25:22
отгадай по названию о чём будет идти речь)
я только так и не понял, почему они саги юзают именно в контексте транзакций уровня базы данных. Оно, конечно, может эмулировать одну из буковок, но это больше побочный эффект, как по мне

Aleh
16.10.2018
08:55:09
https://guides.hexlet.io/check-list-of-engineering-practices/

F01134H
16.10.2018
09:15:23

Andrew
17.10.2018
21:00:57
Насколько упоротая идея загнаться идемподентностью, в скажем рест сервисе. Убираем полностью POST запросы, создание и модификация ресурса через PUT. Генерируется id для нового ресурса (uuid например) на строне клиента. Далее, при запросе, если нет объекта создаем его, если есть - апдейтим.

Sergey
17.10.2018
21:02:03
например можно было сделать 1 запрос а приходится делать 4 хитрых но зато ретраи можно делать сколько хочешь

Andrew
17.10.2018
21:02:53
Вот хочу прОщупать эти кейсы. Со связями ресурса например.

Sergey
17.10.2018
21:02:56
но ничего плохого в таких вещах нет, наоборот, если есть возможность

Дмитрий
17.10.2018
21:03:16
> Далее, при запросе, если нет объекта создаем его, если есть - апдейтим
это называется upsert

Aleh
17.10.2018
21:05:42
генеришь id ?

Ruslan
18.10.2018
00:21:15
https://yt3.ggpht.com/a-/AN66SAxOlIM2f48DSFSeQZ-SuhYa8e6eKoX0SoVwow=s900-mo-c-c0xffffffff-rj-k-no
#распределенный_монолит

Google

Ruslan
18.10.2018
00:21:15
Насколько упоротая идея загнаться идемподентностью, в скажем рест сервисе. Убираем полностью POST запросы, создание и модификация ресурса через PUT. Генерируется id для нового ресурса (uuid например) на строне клиента. Далее, при запросе, если нет объекта создаем его, если есть - апдейтим.

Sergey
18.10.2018
01:07:59

Denis
18.10.2018
02:10:28
самый простой пример идемпотентности это
q.state() // {postId: 123, likes: 0}
const ev1 = {
type: “like”,
payload: {user: user, postId: 123}
}
const ev2 = {
type: “like”,
payload: {user: user, postId: 123}
}
q.processEvents(ev1).processEvents(ev2) // {postId: 123, likes: 1}
x * x = x короче
если ты что-то обновляешь, то это уже нарушает саму суть что ты можешь что-то несколько раз применить и получить один и тот же результат

Дмитрий
18.10.2018
03:56:03
Точное определение описывает скорее иную форму
f(x) === f(f(x))
И она уже не конфликтует с обновлением

Denis
18.10.2018
04:01:26
и структура данных определяет равенство как ей захочется?

Дмитрий
18.10.2018
04:24:40

Denis
18.10.2018
04:38:27
с чего бы это
вот есть у тебя например операция multiplyOneByX(x), операция будет идемпотентой только в том случае если туда передавать единицу т.е сама операция обладает таким свойством только на одном значении из всех возможных
Если у тебя есть массив, то операция конкатенации идемпотентна только на пустых массивах и это же операция полагается на свойство структуры данных(в данном случае наличия нейтрального элемента)
Мне сейчас сложно представить где в энтерпрайз практике ты бы реально захотел просто делать f(x) === f(f(x)) везде где только можно, это же имеет смысл только в некоторых случаях для удобства
хотя щяс сообразил что первый пример не верный, но энивей