immutable data structures become more prevalent among JavaScript devel

6yrop


As immutable data structures become more prevalent among JavaScript developers, the need to watch the mutation of objects becomes moot. Minar echoed this sentiment, saying the "rise in popularity of immutable data structures, functional programming, and unidirectional data flow, rendered O.o() less impactful that what was initially thought."
http://www.infoq.com/news/2015/11/object-observe-withdrawn

Ну наконец то школота понимает, что датабайдинг не нужен.

Dasar

immutable вполне дружит с databinding-ом. Биндиться будет чуть по другому, а паттерны все те же самые.

6yrop

В статье под байндингом понимается классическое понятие — есть ссылки на два объекта o1 и o2, когда меняется свойство o1.PropertyA, то внезапным образом меняется o2.PropertyB. Это противоречит неизменности объектов.

Dasar

В immutable databinding-е используются символические ссылки. Соответственно, там тоже возможна ситуация "когда меняется свойство link("o1").PropertyA, то внезапным образом меняется link("o2").PropertyB".
Плюс immutable окружения, что если держишь прямую ссылку, то данные по ней не меняются.

6yrop

В immutable databinding-е используются символические ссылки. Соответственно, там тоже возможна ситуация "когда меняется свойство link("o1").PropertyA, то внезапным образом меняется link("o2").PropertyB".
link("o1") — это же мутабельность. Сама ссылка является мутабельной.

Dasar

link("o1") — это же мутабельность. Сама ссылка является мутабельной.
1. не чувствую, что корректно такую ссылку называть мутабельной
2. такие ссылки удобный способ для записи dataflow в immutable-окружении. Другие способы - хуже.

6yrop

1. не чувствую, что корректно такую ссылку называть мутабельной
По определению — значение ссылки меняется со временем, значит ссылка изменяемая, т.е. мутабельная.
2. такие ссылки удобный способ для записи dataflow в immutable-окружении. Другие способы - хуже.

90% полей в Model не нужны. Не надо их вводить, и ненужные потоки данных уходят.

Dasar

90% полей в Model не нужны. Не надо их вводить, и ненужные потоки данных уходят.
Часть полей нужна, как и часть потоков данных. И необходим способ записи этих потоков.
ps
Потоки данных: "БД => UI", "нажатие кнопки => изменение БД" в любом случае остаются. И необходим способ их записи.

6yrop

"нажатие кнопки => изменение БД"
Собрал значение полей с контролов и записал в базу — чистый имутабельный сценарий.
Если нужна ссылка на паттерн, то это близко к Flow Synchronization.

Dasar

Собрал значение полей с контролов и записал в базу — чистый имутабельный сценарий.
Это не вся программа. Это однократное действие.
Вся программа выглядит так:
(link("контрол"), link("бд")) => link("бд").update(link("контрол").get_data());

Dasar

БД используется mutable или immutable?

6yrop

Это не вся программа. Это однократное действие.
Вся программа выглядит так:
(link("контрол"), link("бд")) => link("бд").update(link("контрол").get_data());
Сейчас обсуждаем как писать код, который между контролами и бд.
Выполнил sql select, залил значения в контролы.
Прописал обработчики евентов от контролов.
Считал поля из контролов, сгенерировал sql команды insert/update/delete.
Всё это можно просто написать имутабельно.
Т.е. код между контролами и БД проще писать имутабельным, и жизнь станет легче.

Dasar

Выполнил sql select, залил значения в контролы.
Контролы - что такое? Они immutable или mutable?
Как взимодействует между собой обработчики с разной длительностью жизни?
Как записывается dataflow: поменялись данные в БД => перестроить вывод в контролах?

6yrop

Контролы - что такое? Они immutable или mutable?
Mutable, потому что пользователь работает с ними как с мутабельными вещами. То, что в реальной жизни наблюдается как мутабельная вещь, то и в программе это мутабельное. А вот из пальца высасывать мутабельность — это плохо.
 
Как взимодействует между собой обработчики с разной длительностью жизни?

Не совсем понимаю, что такое "длительность жизни обработчика"? Обработчик это фрагмент кода. Если имеется ввиду долгие операции, то они выполняются в отдельном потоке, а результат приходит в общую очередь обработки эвентов.
 
Как записывается dataflow: поменялись данные в БД => перестроить вывод в контролах?

Опять такие, это один из видов эвентов, которые поступают в очередь.

Dasar

Опять такие, это один из видов эвентов, которые поступают в очередь.
Фу какая гадость. Event-ы хороши для выполнения, но не для описания устройства программы.

6yrop

Фу какая гадость. Event-ы хороши для выполнения, но не для описания устройства программы.
Я имел ввиду колбеки, а не C# евенты.

Dasar

Я имел ввиду колбеки, а не C# евенты.
Колбеки - зло. Превращают код в спагетти.
Current continuation и его реализация в C# (yield; async/await) намного приятнее для описания кода.

6yrop

Колбеки - зло. Превращают код в спагетти.
Current continuation и его реализация в C# (yield; async/await) намного приятнее для описания кода.
В рамках данного треда совершенно не важно чистые это колбеки или async/await. Код между контролами и генерацией sql команд проще писать, читать и сопровождать если не использовать лишнего изменяемого состояния.

Dasar

Код между контролами и генерацией sql команд проще писать, читать и сопровождать если не использовать лишнего изменяемого состояния.
Имхо, будущее за следующим "бутербродом".
Код записывается, используя mutable-синтаксис.

point.X = point.Y + 3;

Семантика исполнения immutable:

var point_new = point.With(x:point.Y + 3)

Оптимизированное исполнение - mutable, по возможности:

point.X = point.Y + 3

6yrop

point.X = point.Y + 3;
point = point.With(x:point.Y + 3)
Переприсвоение это и есть изменяемое состояние, это и есть зло. В этом случае нет контроля со стороны компилятора, переставил строки и никто тебе не сказал, что предыдущий автор запретил такое изменение.

Dasar

Переприсвоение это и есть изменяемое состояние, это и есть зло.
согласен, поправил

var point_new = point.With(x:point.Y + 3)

В этом случае нет контроля со стороны компилятора, переставил строки и никто тебе не сказал, что предыдущий автор запретил такое изменение.
immutable не спасает автоматически от такой ошибки
mutable:

point.X = point.Y + 3;
point.Y = point.X + 3;//ошибка: Y увеличилось на 6, вместо по ТЗ на 3

immutable:

var new_point = point.With(x: point.Y + 3);
var new2_point = new_point.With(y: new_point.X + 3); //ошибка: Y увеличилось на 6, вместо по ТЗ на 3

6yrop

//ошибка: Y увеличилось на 6, вместо по ТЗ на 3
Соответствие кода и ТЗ проверяется однократным тестированием — это недорого. Дорого — перетестировать всю систему при внесении каждого небольшого изменения. Поэтому важен стиль программирования, при котором можно вносить изменения без перетестирования всей системы.

Dasar

Соответствие кода и ТЗ проверяется однократным тестированием — это недорого.
В реальном приложении эта ошибка будет завернута в for-ы, if-ы, настройки окружения, отдельные операции, треды и т.д. И однократным тестированием не проверишь соответствие ТЗ.

luna89

Mutable, потому что пользователь работает с ними как с мутабельными вещами. То, что в реальной жизни наблюдается как мутабельная вещь, то и в программе это мутабельное. А вот из пальца высасывать мутабельность — это плохо.
У тебя свое понимание иммутабельности, которое не вполне совпадает с общепринятым. В документе, который ты цитируешь, говорится именно о настоящей жесткой иммутабельности. Речь идет об использовании библиотек Immutable.js, mori, которые имплементируют персистентные структуры данных, а также о библиотеках, которые дружат с реакт с персистентными структурами данных, описание идеи тут, список библиотек:

  • http://github.com/reagent-project/reagent
  • http://github.com/omcljs/om
  • http://github.com/reagent-project/reagent
  • http://github.com/levand/quiescent
  • http://github.com/Yomguithereal/baobab
  • http://github.com/mquan/cortex
  • http://github.com/dustingetz/react-cursor

Вот содержательный пример иммутабельного приложения (есть единственная мутабельная переменная): демо , код

luna89

То, что в реальной жизни наблюдается как мутабельная вещь, то и в программе это мутабельное. А вот из пальца высасывать мутабельность — это плохо.
В программировании мы имеем дело с абстракциями, никакого "реального мира" нет, есть его модель. Моделировать реальный мир можно как мутабельным языком, так и иммутабельным. Ты демонстрируешь правоту гипотезы Сепира-Уорфа в применении к C# - на основе того что в C# невозможно иммутабельное программирование, ты делаешь вывод что мутабельность присуща реальному миру.
Имхо, если мы не рассматриваем вопросы производительности, а просто пишем прикладное приложение, то мутабельность не нужна, все то же самое можно не менее удобно запрограммировать на иммутабельном языке. Можно рассмотреть контрпримеры к этому тезису.

Dasar

В программировании мы имеем дело с абстракциями, никакого "реального мира" нет, есть его модель.
Окружение программы мутабельно: время, сервисы, ОС, пользователи и т.д.

luna89

залил значения в контролы.
Прописал обработчики евентов от контролов.
Считал поля из контролов
По сравнению с этим эксель кажется футуристической средой программирования из будущего.

6yrop

По сравнению с этим эксель кажется футуристической средой программирования из будущего.
Ты поклонник Visual Basic for Application?

luna89

Ты поклонник Visual Basic for Application?
По крайней мере там не надо добавлять обработчики событий от ячеек чтобы посчитать что-то по формуле
Оставить комментарий
Имя или ник:
Комментарий: