@react_js

Страница 1540 из 5115
? ethorz
23.06.2017
17:53:23
что быстрее, мутабельность или иммутабельность?

Andrey
23.06.2017
17:54:06
Мутабельность.

? ethorz
23.06.2017
17:55:44
Мутабельность.
мне тут нашептали, что мутабельные операции затратнее

Andrey
23.06.2017
17:56:28
мне тут нашептали, что мутабельные операции затратнее
Изменить объект всегда дешевле, чем создать новый. Минус в том, что управлять всем этим очень сложно, поэтому проще создавать новый.

Google
Default
23.06.2017
17:56:29
Так и есть

Nikolay
23.06.2017
18:25:04
есть кто mobx-state-tree щупал?

Дмитрий
23.06.2017
18:26:17
мне тут нашептали, что мутабельные операции затратнее
Зависит от подхода, разные ситуации бывают

Чем проще и предсказуемее конструктор объекта и стабильнее его тип — тем быстрее иммутабельные операции

Yumi
23.06.2017
18:28:29
Чем проще и предсказуемее конструктор объекта и стабильнее его тип — тем быстрее иммутабельные операции
Вот тоже сейчас смотрю про это, удивился, что иммутабельные данные бывает быстрее.

Дмитрий
23.06.2017
18:33:39
function Point(label, x, y) { this.label = label this.x = +x || 0 this.y = +y || 0 } const point = new Point('text','10')

не смотря на то, что этот код работает нормально, из-за того, что мы один раз передали строку и undefined, в другой раз два числа передадим и т.д. V8 не сможет эффективно конвертировать такую функцию в низкоуровневый типизированный код и заинлайнить её

Илья
23.06.2017
18:35:42
Привет! А подскажите, пожалуйста, как подружить eslint-airbnb-config и VSCode?

Дмитрий
23.06.2017
18:35:57
Но это уже из области таких экономий на спичках, что редко кто доходит до такого уровня оптимизации — чтобы уже аж под движок затачиваться

Yumi
23.06.2017
18:42:37
Но это уже из области таких экономий на спичках, что редко кто доходит до такого уровня оптимизации — чтобы уже аж под движок затачиваться
Как-то читал, что оптимизация - это изучение документации компилятора, но это не про жс вроде было.

Google
Yumi
23.06.2017
18:49:02
Иммутабельные данные дают предсказуемость, а следовательно легче можно тестировать. Какие ещё можно вещи использовать, как аргумент в сторону использования иммутабельных данных вообще в JS? В React необходимость понятна, по причиине shouldComponentUpdate.

Дмитрий
23.06.2017
18:57:20
Иммутабельные данные дают предсказуемость, а следовательно легче можно тестировать. Какие ещё можно вещи использовать, как аргумент в сторону использования иммутабельных данных вообще в JS? В React необходимость понятна, по причиине shouldComponentUpdate.
Да собственно как и везде, можно делать дешёвые проверки на наличие изменений. Плюс, есть алгоритмы изначально больше подходящие для иммутабельности: в парсере/лексере компилятора можно перебирать ветки вариантов, откатываясь назад в случае неудачи. С мутабельными данными потребуется обновление текущего объекта, что может быть затратно

Yumi
23.06.2017
19:04:51
Спасибо за пояснения.

Alex
23.06.2017
19:06:32
Приветы) У меня вопрос околохоливарный. Не кажется ли вам, что использование es6 classes - это шаг назад по сравнению с createClass? )

мне тут нашептали, что мутабельные операции затратнее
смотря какие. Если тебе надо хранить историю изменений объекта, то иммутабельные выигрывают и по памяти и в алгоритмической предсказуемости

Alex
23.06.2017
19:08:49
.bind ?)

Дмитрий
23.06.2017
19:09:04
Так не нужен же

Alex
23.06.2017
19:09:06
руками. в 2к17 ))

М? Выпилили?

Дмитрий
23.06.2017
19:09:44
Ну class properties значения в бинде не нуждаются

Nikita
23.06.2017
19:10:24
такой вопрос можно ли вручную вызывать лайфсайкл методы в реакт?

Nikita
23.06.2017
19:15:09
да, можно
стоит?

Дмитрий
23.06.2017
19:15:31
а, речь об этом: class MyClass { a: (args) => {..} } ?
Ну так ты сейчас просто тип описал, но вообще да class MyClass { a = (args) => {..} }

Alex
23.06.2017
19:15:49
стоит?
В среднем нет, но ты же зачем-то спросил?)

Ну так ты сейчас просто тип описал, но вообще да class MyClass { a = (args) => {..} }
а, ну да. а если очень надо в this достучаться, то без вариантов?

Google
Дмитрий
23.06.2017
19:17:00
а, ну да. а если очень надо в this достучаться, то без вариантов?
Так у тебя сразу метод с биндом получается. Можешь свободно вызывать в нём this

Nikita
23.06.2017
19:17:07
В среднем нет, но ты же зачем-то спросил?)
да интересно стало использует ли кто нить это и возможно ли так делать

Alex
23.06.2017
19:18:25
Дмитрий
23.06.2017
19:19:59
Да, это просто синтаксический сахар. Важно понимать, что у стрелочных функций нет своего контекста (this), поэтому при объявлении они сразу "биндятся" к контексту родителя, это фича

Можно посмотреть во что компилит это всё бабель

Alex
23.06.2017
19:21:31
Да, это просто синтаксический сахар. Важно понимать, что у стрелочных функций нет своего контекста (this), поэтому при объявлении они сразу "биндятся" к контексту родителя, это фича
да это понятно. а вот про контекст родителя-класса сразу не понятно. Ну это ладно, я дальше погуглю. Ох, ироды, со всеми этими ES6)))

Дмитрий
23.06.2017
19:21:32
class MyClass { a = (args) => this.props } class MyClass { constructor() { this.a = args => this.props; } }

Alex
23.06.2017
19:22:29
Ну, вообще мой пойнт в копилку createClass заключался в том, что всё это там не нужно))

Nikolay
23.06.2017
19:22:39
вот видос где чувак рассказывает что createClass говно

https://www.youtube.com/watch?v=PnpfGy7q96U&feature=youtu.be

Дмитрий
23.06.2017
19:23:03
да это понятно. а вот про контекст родителя-класса сразу не понятно. Ну это ладно, я дальше погуглю. Ох, ироды, со всеми этими ES6)))
Ну кстати наоборот наконец то нормальный воркфлоу делается) Нужно объявление полей в теле класса — пишешь в теле, типы там же и т.д., как у нормальных людей короч

Дмитрий
23.06.2017
19:23:20
Ну, вообще мой пойнт в копилку createClass заключался в том, что всё это там не нужно))
Можно вообще обойтись только компонентами-функциями)

Alex
23.06.2017
19:24:03
Можно вообще обойтись только компонентами-функциями)
а для них уже мемоизация работает искоропки?)

Дмитрий
23.06.2017
19:25:51
В плане? ? Компилируются в обычные реакт-компоненты, ну как будто из всего класса оставили только метод render и пропсы

Есть recompose для всяких shouldComponentUpdate, lazy и более специфичных оптимизаций

Alex
23.06.2017
19:29:25
В плане? ? Компилируются в обычные реакт-компоненты, ну как будто из всего класса оставили только метод render и пропсы
ну, насколько я понимаю, основная идея functional components заключается в том, что компонент становится функцией своих аргументов. Если договориться о том, что он действительно функция своих аргументов, и не использует сторонние вызовы, создающий побочные эффекты (мы же не можем в JS никак гарантировать истинную чистоту функции), то результаты его работы вполне себе можно мемоизировать. Ну и жить дальше по табличке.

Ну а там уже в свою очередь, доступна вся магия ускоренных сравнений поддеревьев, например. Например путём сравнения предвычисленного хэша или еще чего подобного, сводящегося к одной операции сравнения.

Google
Max
23.06.2017
19:50:33
Почему?? Они создаются раньше любых методов потомка
Честно хер знает. Попробую воспроизвести. Но сталкивался - пофиксил переписыванием на bind в конструкторе

Admin
ERROR: S client not available

Дмитрий
23.06.2017
19:51:09
Ну это скорее всего баг какой-нибудь

https://babeljs.io/repl/#?babili=false&evaluate=true&lineWrap=false&presets=react%2Cstage-2&targets=&browsers=&builtIns=false&debug=false&experimental=true&loose=false&spec=false&playground=true&code_lz=MYGwhgzhAECyCeBhcVoG8BQ1oAcBOA9jjALzpbbQEDWAXNAAwUC-FY0ZAFGHgOYQBKDgD5oAFwAWASwgA6fEQgZWGUJBiJpIACbQApgA8xegHbaYCZOvLZlGVQRMQx0YFt1kTegO7RNUnXtgRwgCED1ZEAJeTjcA7VkwTgEBeyA&stage=0

Max
23.06.2017
19:57:46
С телефона)

Max
23.06.2017
20:25:14
Иммутабельные данные дают предсказуемость, а следовательно легче можно тестировать. Какие ещё можно вещи использовать, как аргумент в сторону использования иммутабельных данных вообще в JS? В React необходимость понятна, по причиине shouldComponentUpdate.
C иммутабельностью сложно разработать некоторую бизнес-логику. Вот придумал такой кейс - у объекта юзера есть массив папок у каждой папки массив проектов у каждого проекта массив тасков и у каждого таска массив комментариев. И теперь юзер отредактировал какой-то комментарий - с мутабельностью все просто - берем и меняем на новое значение comment.text = newValue. А как с иммутабельностью? Нужно создать новый объект комментария, создать новый массив комментариев, перекопировать отстальные комментарии, создать новый массив тасков, перекопировать остальные таски, создать новый массив проектов, перекопировть остальные проекты и наконец создать новый массив папок, перекопировать и создать новый объект юзера. Это же медленнее в тысячи раз.

andretshurotshka?❄️кде
23.06.2017
20:28:18
Max
23.06.2017
20:28:55
не хранить все внутри друг друга?
Только не нужно предлагать нормализацию - я уже пробовал - это такие неудобства когда вместо того чтобы простись по ссылкам - comment.task.project.folder вся бизнес логика увешана лапшой вытаскивания нужного объекта по его айдишнику из глобального стора

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

Alex
23.06.2017
20:32:14
C иммутабельностью сложно разработать некоторую бизнес-логику. Вот придумал такой кейс - у объекта юзера есть массив папок у каждой папки массив проектов у каждого проекта массив тасков и у каждого таска массив комментариев. И теперь юзер отредактировал какой-то комментарий - с мутабельностью все просто - берем и меняем на новое значение comment.text = newValue. А как с иммутабельностью? Нужно создать новый объект комментария, создать новый массив комментариев, перекопировать отстальные комментарии, создать новый массив тасков, перекопировать остальные таски, создать новый массив проектов, перекопировть остальные проекты и наконец создать новый массив папок, перекопировать и создать новый объект юзера. Это же медленнее в тысячи раз.
в таком случае у тебя: 1. заменится твой комментарий 2. заменится таск, если в нём была прямая ссылка на коммент 3. массив проектов пересоберётся со всеми старыми объектами, и одним новым 4. ну и так дальше вверх.

Т.е. в таком случае у тебя все сестринские ноды в твоем дереве будут переиспользованы

Да, они упадут в новые контейнеры, но это достаточно быстро

Google
Alex
23.06.2017
20:35:21
Потому что в правильной реализации иммутабельных данных [a, b, c] и [a, b1, c], где b1 - это обновлённая версия b второй массив обычно не просто тупо массив, а специальный объект, который содержит только дельту

Max
23.06.2017
20:36:07
в таком случае у тебя: 1. заменится твой комментарий 2. заменится таск, если в нём была прямая ссылка на коммент 3. массив проектов пересоберётся со всеми старыми объектами, и одним новым 4. ну и так дальше вверх.
я писал перекопировать остальные комментарии а не пересоздать, все равно это в тысячи раз медленнее потому что нужно грубо говоря простись по всем объектам в массиве и создать ссылку в новом массива и это для каждого уровня вложенности

Дмитрий
23.06.2017
20:36:20
Бред

Дмитрий
23.06.2017
20:37:37
Как раз для того, чтобы не мудохаться с вложенностью и требуют нормализацию

Дмитрий
23.06.2017
20:37:56
Не факт

Alex
23.06.2017
20:38:08
массив то нужно новый создать
Это будет не совсем массив.

Ну точнее, тут уже детали реализации, но это может быть не совсем массив

Alex
23.06.2017
20:40:50
Т.е const updArr = arr.withUpdatedByIndex(index=1, value=b1); где updArr это не Array[String], нифига, а PatchedArray, который, грубо говоря, содержит информацию о том, что это всё, то же самое, что и arr, только элемент с индексом 1 теперь равен b1

Не одна
одно присваивание, не?)

Vladimir
23.06.2017
20:42:06
В immutable массиве? Нет конечно

Alex
23.06.2017
20:44:17
В immutable массиве? Нет конечно
1. создал ссылку на оригинал 2. запомнил смещение и новое значение Два присваивания и почти бесплатная ссылка

Страница 1540 из 5115