
Дмитрий
10.10.2017
01:34:34

Котяй Негодяй
10.10.2017
01:35:37

Ҫѐҏӗѫӑ
10.10.2017
01:35:57
mst оооочень медленный

Котяй Негодяй
10.10.2017
01:36:11
"Настраивал вебпак". Лол.

Google

Ҫѐҏӗѫӑ
10.10.2017
01:36:14
для моих кейсов

Дмитрий
10.10.2017
01:36:22
Вдвойне фигово(

Ҫѐҏӗѫӑ
10.10.2017
01:37:06
ну у меня риалтайм и модели жирные
2 Гб и 133% цпу ест

Дмитрий
10.10.2017
01:37:53
?
Сурово
Опять короче велосипедить по ходу

Ҫѐҏӗѫӑ
10.10.2017
01:39:58
вообще такое ощущение, что проверки не все в прод билде отключаются

Дмитрий
10.10.2017
01:49:52
Ох щи
// TODO: this test still needed?
...
Object.freeze(this.properties) // make sure nobody messes with it
Конструктор модели

kana
10.10.2017
01:51:32


Юра
10.10.2017
01:55:06
Нормальной внятной мысли почему maybe это плохо. Мне может реально интересно, почему
Но из всего диалога я вынес только то, что ты попрбовал и тебе не понра
Теперь мне придётся с этим как-то жить
Ну, смотри, во-первых, я не утверждаю, что Maybe — это плохо.
Я утверждаю, что если ты будешь писать коммерческий код с использованием maybe, то это приведет либо к а) чрезмерно запутанному коду, либо к б) продалбыванию сроков проекта.
Ну, банальный пример.
С сервера нам приходит модель:
setState({
name: 'John Doe'
});
Пишем обработчик формы с Maybe:
<input type="text" defaultValue={this.state.name} onChange={(event) => {
const value = Maybe(event.target.value);
this.setState({name: value}); // WTF? this.state.name будет иметь два типа: String из JSON-а, и Maybe, потому что мы его туда положили.
}} />
Придется доработать форму:
<input type="text" defaultValue={isMaybe(this.state.name) ? this.state.name.value() : this.state.name} onChange={(event) => {
const value = Maybe(event.target.value);
this.setState({name: value});
}} />
Спрашивается, нафига так делать, если и без этого все прекрасно работает?

Google

Юра
10.10.2017
01:56:24


kana
10.10.2017
01:56:56
Полагаю, в жс тоже скоро может появиться .?
Это не то, но все же шажок
Ну, смотри, во-первых, я не утверждаю, что Maybe — это плохо.
Я утверждаю, что если ты будешь писать коммерческий код с использованием maybe, то это приведет либо к а) чрезмерно запутанному коду, либо к б) продалбыванию сроков проекта.
Ну, банальный пример.
С сервера нам приходит модель:
setState({
name: 'John Doe'
});
Пишем обработчик формы с Maybe:
<input type="text" defaultValue={this.state.name} onChange={(event) => {
const value = Maybe(event.target.value);
this.setState({name: value}); // WTF? this.state.name будет иметь два типа: String из JSON-а, и Maybe, потому что мы его туда положили.
}} />
Придется доработать форму:
<input type="text" defaultValue={isMaybe(this.state.name) ? this.state.name.value() : this.state.name} onChange={(event) => {
const value = Maybe(event.target.value);
this.setState({name: value});
}} />
Спрашивается, нафига так делать, если и без этого все прекрасно работает?
Э, работать с мейби намного проще.


Дмитрий
10.10.2017
01:58:40
Ну, смотри, во-первых, я не утверждаю, что Maybe — это плохо.
Я утверждаю, что если ты будешь писать коммерческий код с использованием maybe, то это приведет либо к а) чрезмерно запутанному коду, либо к б) продалбыванию сроков проекта.
Ну, банальный пример.
С сервера нам приходит модель:
setState({
name: 'John Doe'
});
Пишем обработчик формы с Maybe:
<input type="text" defaultValue={this.state.name} onChange={(event) => {
const value = Maybe(event.target.value);
this.setState({name: value}); // WTF? this.state.name будет иметь два типа: String из JSON-а, и Maybe, потому что мы его туда положили.
}} />
Придется доработать форму:
<input type="text" defaultValue={isMaybe(this.state.name) ? this.state.name.value() : this.state.name} onChange={(event) => {
const value = Maybe(event.target.value);
this.setState({name: value});
}} />
Спрашивается, нафига так делать, если и без этого все прекрасно работает?
Код с maybe вообще не нужно проверять на isMaybe
fromNullable(event.target.value)
.map(name => this.setState({ name }))


Юра
10.10.2017
01:58:56

Дмитрий
10.10.2017
02:00:08
Ты прав в том, что подключать maybe а потом всё обмазывать проверками на isMaybe — это шиза
В таком виде естественно ничего не нужно, что подводит нас к мысли о том, что видимо всё же ими пользуются как-то иначе

Юра
10.10.2017
02:01:10


kana
10.10.2017
02:01:32
Ну, смотри, во-первых, я не утверждаю, что Maybe — это плохо.
Я утверждаю, что если ты будешь писать коммерческий код с использованием maybe, то это приведет либо к а) чрезмерно запутанному коду, либо к б) продалбыванию сроков проекта.
Ну, банальный пример.
С сервера нам приходит модель:
setState({
name: 'John Doe'
});
Пишем обработчик формы с Maybe:
<input type="text" defaultValue={this.state.name} onChange={(event) => {
const value = Maybe(event.target.value);
this.setState({name: value}); // WTF? this.state.name будет иметь два типа: String из JSON-а, и Maybe, потому что мы его туда положили.
}} />
Придется доработать форму:
<input type="text" defaultValue={isMaybe(this.state.name) ? this.state.name.value() : this.state.name} onChange={(event) => {
const value = Maybe(event.target.value);
this.setState({name: value});
}} />
Спрашивается, нафига так делать, если и без этого все прекрасно работает?
Код, как у тебя - та же хрень, что проверка на null, функториальность и монадность мэйби позволяет работать со значением так, будто оно всегда есть, а все проблемы улетят куда-то в сторону, где мы их потом обработаем, если нужно. Иначе мэйби ничем от нала отличаться не будет


Юра
10.10.2017
02:01:33
Это я тебе как человек, который писал довольно много кода с Promise.join.
Типа, функция, которая в аргументах может принять промис, а может и не промис, но внутри функции нужно работать все равно с конкретным значением.

Дмитрий
10.10.2017
02:02:58
.map
.chain

Юра
10.10.2017
02:03:19
Код, как у тебя - та же хрень, что проверка на null, функториальность и монадность мэйби позволяет работать со значением так, будто оно всегда есть, а все проблемы улетят куда-то в сторону, где мы их потом обработаем, если нужно. Иначе мэйби ничем от нала отличаться не будет
Проблема как раз в том и заключается, что эти проблемы никуда не улетают, и тебе все равно придется о них заботиться. Просто на другом уровне, когда это уже сложнее сделать.

Дмитрий
10.10.2017
02:03:19
Ты пытаешься приделать новую концепцию к старым повадкам, это так не работает
Лол

Юра
10.10.2017
02:04:31

kana
10.10.2017
02:05:11
Я как вспоминаю старый свой гошный код с десятком if err на функцию, так седею. Го абсолютно точно нужен ейзер, можно и встроенный.
Вспомнил про него, когда начал писать пример на жс с мейби

Юра
10.10.2017
02:06:50
Кароч, долго объяснять, но функция должна оперировать только одним уровнем абстракции.

Google

Юра
10.10.2017
02:07:27
Читать дядюшку Боба.

kana
10.10.2017
02:07:34
Нет, там простая каждая функция вернуть ошибку, нужно все обработать

Дмитрий
10.10.2017
02:07:41
В этом коде 11 проверок на null

Юра
10.10.2017
02:08:25
Это elm?

Mikhail
10.10.2017
02:08:30

Дмитрий
10.10.2017
02:08:40
И это лишь небольшая часть гораздо более крупного алгоритма, целиком завязанного на такие проверки

Юра
10.10.2017
02:09:09
Вспоминается LiveScript.

Дмитрий
10.10.2017
02:09:24
У кого какие аналогии

kana
10.10.2017
02:09:36
Го

Юра
10.10.2017
02:09:41
Я вообще не понимаю смысла этого кода. Судя по всему, тут не в Maybe дело.

Дмитрий
10.10.2017
02:10:12
А теперь самый момент напомнить про тупых фронтендеров
Судя по всему тут не в Maybe дело, да ?
Но вообще это довольно тривиальная конструкция, я типа учусь и всё такое

Юра
10.10.2017
02:12:51
Ага. Совершенно точно диагноз поставил. Прям горжусь собой.
У тебя в одной функции и запрос к серверу, и разбор ответа, и маппминг в объект и маршаллинг.
Это все должны быть разные подсистемы: транспортная, доменная модель, бизнес-логика. Кароч, ну ты понел.


kana
10.10.2017
02:14:43
Есть некая f, которая может вернет, а может не вернет значение.
const a = f(1);
if (a !== null) {
const b = f(a);
if (b !== null) {
const c = f(b);
if (c !== null) {
doSmth(a, b, c);
}
}
}
Если мы заменим на Maybe вместо null и будем делать такие же проверки isMaybe, как ты предлагаешь, то ничего не измениться.
Но есть ду-нотация, она же async/await для промисов в жс (только не так).
const f = x =>
x === 5 ? just(5) : nothing();
//...
const a = yield f(1);
const b = yield f(a);
const c = yield f(b);
doSmth(a, b, c);
В результате все проблемы (nothing) улетают во время выполнения yield-ов

Google

Юра
10.10.2017
02:18:28
Есть некая f, которая может вернет, а может не вернет значение.
const a = f(1);
if (a !== null) {
const b = f(a);
if (b !== null) {
const c = f(b);
if (c !== null) {
doSmth(a, b, c);
}
}
}
Если мы заменим на Maybe вместо null и будем делать такие же проверки isMaybe, как ты предлагаешь, то ничего не измениться.
Но есть ду-нотация, она же async/await для промисов в жс (только не так).
const f = x =>
x === 5 ? just(5) : nothing();
//...
const a = yield f(1);
const b = yield f(a);
const c = yield f(b);
doSmth(a, b, c);
В результате все проблемы (nothing) улетают во время выполнения yield-ов
Ну, смотри. Если у тебя такой каскад if-ов, это значит, ты пытаешься получить значение «низкого» уровля вложенности, т.е. на другом уровне абстракции. Скорее всего ты это делаешь совершенно зря, нужно по-другому.
Maybe тут выступает в роли «дезодоранта», как выражается дядюшка Боб, но не решает проблему.


kana
10.10.2017
02:18:36
Scala:
for {
a <- f(1),
b <- f(a),
c <- f(b)
} yield doSmth(a, b, c);
Haskell (тут правда doSmth обязан мейби отдавать)
do
a <- f 1
b <- f a
c <- f b
doSmth a b c
.
Монады собственно и решают проблему вложенности в общем случае, они m(m(x)) к m(x) сводят, это и колбеки (фьючерсы, промисы), и ифы (мэйби, ейзер)

Юра
10.10.2017
02:19:52
Я просто довольно много писал кода с null-propagation-ом. И я вам могу сказать, что это лишь усугубляло ошибки.

kana
10.10.2017
02:21:26

Юра
10.10.2017
02:23:53
Кароч, если объяснишь что этот код делает, я, может быть и смогу сказать как его улучшить. Сейчас я даже конструкций языка не понимаю.

kana
10.10.2017
02:28:24

Дмитрий
10.10.2017
02:30:06
Точнее не валидация, а часть классификатора данных

Admin
ERROR: S client not available

Юра
10.10.2017
02:33:03

kana
10.10.2017
02:33:52
Да хотя бы дешевые исключения решили бы проблему
Что у тебя за pureJust, pure+join?

Дмитрий
10.10.2017
02:36:18
Вся фигня в том, что это самое начало, а дальше начнутся вложенные комбинации из-за которых я и решил написать на пурсе https://github.com/zerobias/telegram-mtproto/blob/feature/mtproto3/packages/mtproto-classify/src/Classify/Import.purs#L59

Юра
10.10.2017
02:36:40

Дмитрий
10.10.2017
02:37:06

kana
10.10.2017
02:37:55
можно было просто вернуть значение без pureJust)
pureJust $ f x
===
f x
)

Дмитрий
10.10.2017
02:38:50

Google

Юра
10.10.2017
02:39:15
Ну, я имею в виду, поднимаешься от листов к корню и на каждом шаге возвращаешь новый объект в зависимости от значений родителя.

Дмитрий
10.10.2017
02:41:58
А просто восходящим анализом проблему не решить?
Там даже расположение элементов не регламентировано, может быть один, может быть массив второго уровня, некоторые элементы могут быть ещё глубже, а чтобы было не оч скучно — некоторые объекты прилетают без тела, и это становится ещё одной категорией кейсов (х2)
То есть тебе эти листья ещё нужно найти

Юра
10.10.2017
02:46:37
Ну, типа, я тобой горжусь, что ты такие задачи умеешь решать и даже нашел где применить Maybe монаду.
https://github.com/zerobias/telegram-mtproto/blob/feature/mtproto3/packages/mtproto-classify/src/Classify/Import.purs
Вот сюда смотрю.

Дмитрий
10.10.2017
02:58:30


kana
10.10.2017
02:58:59
Монады можно не расценивать как обычные значения, их смысл намного больше.
У тебя есть какой-то обычный мир вычислений, 5 функций подряд, все как обычно, это Identity-мир.
Но мы можем писать код в Maybe-мире, это такой же мир, как и предыдущий, те же 5 функций, ты работаешь с данными как обычно, только каждая из 5 операций может выкинуть тебя из мира, то есть Maybe дает эффект прерывания выполнения кода в этом мире.
Есть either, который то же самое, только позволяет нашему коду вылететь из мира с каким-нибудь сообщением.
Есть promise, который позволяет нам писать обычный код, только каждая из функций может быть ассинхронной, хоть в нашем промис-мире мы этого не видим
Когда осознаешь, что монады - это такие отдельные миры поверх чистого мира с каким-то эффектом, то перестаешь писать x.isJust() ? X.valus : ...
Поэтому сложно не найти применение мэйби, а "не найти его")
Мэйби сама по себе неплохая идея для описания нуллабл значений в языках с типами, но монадность мэйби поднимает ее на уровень выше


Юра
10.10.2017
03:05:30
Я так понимаю, что на JS-е это можно переписать примерно так:
const smokeTest = (text) => JSON.parse(text, (key, obj) => {
const tlType = lookupTLType(obj);
let val, arr;
switch (tlType) {
case 'msg_container': {
if ((val = obj.messages) && (arr = toArray(val))) {
obj = messagesNormalize(arr)
return pureJust(obj);
}
}
case 'rpc_result': {
return messagesNormalize(obj);
}
}
});

kana
10.10.2017
03:07:10
Нет, lookup отдает Maybe
Там весь код работает в мире мейби, то есть если функция какая справа от <- вернет Nothing, то весь код прерывается и возвращается Nothing
У тебя же никакой проверки нет.
Хотя кейс просто ничего не сделает

Юра
10.10.2017
03:08:31
Я вижу в коде два раза используется messageNormalize.

Дмитрий
10.10.2017
03:13:40

David
10.10.2017
03:13:56
Только медленный ппц

Юра
10.10.2017
03:21:55
// toArray тоже считаем, что возвращает undefined если не удается привести к нужному типу.
const smokeTest = (text) => JSON.parse(text, (key, obj) => {
switch (obj._) {
case 'msg_container':
let arr;
if (obj.messages && (arr = toArray(obj.messages))) {
return arr.map(messageNormalize);
}
case 'rpc_result':
return messageNormalize(obj);
}
});
Даже так, наверное. Я исхожу из предположения, что obj.messages может быть либо массивом, либо пустым значением, не объектом. Если я не прав, то прошу поправить. Тода так получится:
const smokeTest = (text) => JSON.parse(text, (key, obj) => {
switch (obj._) {
case 'msg_container':
return Array.isArray(obj.messages) ? obj.messages.map(messageNormalize) : undefined;
case 'rpc_result':
return messageNormalize(obj);
}
});