Неизменным в JavaScript

Неизменным в JavaScript

451
ПОДЕЛИТЬСЯ

В данной статье я расскажу для вас о том, что непосредственно является краеугольным камнем неизменности, как применять эту концепцию в JavaScript и почему это полезно. Неизменяемость является одним из главных принципов многофункционального программирования, которая также имеет много, чтоб предложить объектно-нацеленных программ.
Инвариант с точностью до напротив, это никогда не будет изменяться опосля сотворения. Текст книжки определение изменчивости последующим образом: «склонность субъекта к изменениям либо превращениям». В программировании мы используем это слово, когда вы имеете в виду объекты, состояние которых может изменяться с течением времени. Что же такое сопротивление?
Причина в том, что строчки являются постоянными — они не могут быть преобразованы, мы можем лишь создавать новейшие полосы. Раз это кажется странноватым, напомню, что большая часть из тех значений, которые мы используем все время, по сущности, постоянным:
оператор var = «Я есмь непреложная ценность»;
вар otherStr = заявление.ломтик(8, 17);

Я думаю, что никто не удивится, раз он знал, что 2-ая линия никак не измените строковое значение заявлении. На самом деле, нет строковые способы, которые изменяют строчку, по которой они выполняют действие, все они возвращают новейшую строчку.
Это звучит абсурдно, хотя мы делаем это все время с нашими объектами и массивами. Числа также являются неизменяемыми. Строчка-это не лишь постоянные ценности, которые интегрированы в JavaScript. Вы вообщем сможете представить для себя среду, в которой выражение 2 + 3 изменяет значение числа 2?
Но, это различается. Раз массивы ведут себя как строчки и числа, то в v2 будет содержать новейший массив с одним элементом снутри — 2. Заместо этого, была изменена ссылка на округ для того, чтоб содержать число, и v2 и содержит новейшую длину обр. В JavaScript, изменчивость в изобилии
В JavaScript, числа и строчки предусмотрены, чтоб быть постоянными. Тем не наименее, разглядим последующий пример с внедрением массивов:
вар модуль arr = [];
Варе v2 и = обр.толчок(2);

Каково значение версии v2?
Представьте для себя Тип ImmutableArray. Его поведение, заимствования на числа, и строчки будет смотреться последующим образом:
вар САР = новейший ImmutableArray([1, 2, 3, 4]);
Варе v2 и = обр.жмем(5);

обр.способом toarray(); // [1, 2, 3, 4]
версии v2.способом toarray(); // [1, 2, 3, 4, 5]

Аналогичным образом неизменяемого ассоциативного массива, который может употребляться заместо большинства объектов есть способы «набор» параметров, которые не сделаны на самом деле, и возвращает новейший объект с необходимыми переменами:
вар человек = новейшие ImmutableMap({имя: «Крис», Возраст: 32});
вар olderPerson = человек.набор(«Возраст», 33);

человек.toObject(); // {имя: «Крис», Возраст: 32}
olderPerson.toObject(); // {имя: «Крис», Возраст: 33}

Просто как 2 + 3 не изменяет значения ни 2, ни 3, празднование собственного дня рождения идти, не отменяет ту истину, что мужчина ранее был 32 лет.
Сопротивление на практике в JavaScript
JavaScript не (пока) есть неизменяемые списки и ассоциативные массивы, потому на данный момент нам необходимы посторонние библиотеки. В данной демонстрации я буду применять immutable.js по той обычный причине, что его API-это наиболее обычно для программистов на JavaScript. Есть 2 чрезвычайно отличные библиотеки доступны. 2-ой immutable.js написано разрабами Facebook. 1-ый-Мори, что дозволяет применять персистентные структуры данных из Кложурскриптом, и поддержки API в JavaScript.
В нашем примере мы разглядим принцип работы с неизменяемыми данными в Сапер. переулок)- личный плитка на доске. Потому, в нашем Инструментарии есть метод для данной цели:
функция revealTile(игры, плитки) {
ответный матч.сетин([‘плитка’, плитка ‘isRevealed’], истина);
}

Сейчас функция revealTile возвращает новейший постоянном экземпляре, в котором одна из плитки различается от предшествующей версии. е., доц. массы. сетин нуль-устойчивым и будет заполнен пустыми объектами раз какая-или часть ключа не существует. Когда вы называете это знаменует собой плитку, как открыть, чтоб открыть его. — прим. В случае Сапер доски не лучше, поэтому что недостающие плитки значит, что мы пытаемся открыть плитки с доски. Отчасти эту делему можно решить с помощью вмашину для поиска плитки перед выполнением деяния на нем:
функция revealTile(игры, плитки) {
ответный матч.вмашину([‘плитка’, плитка])? игры.сетин([‘плитка’, плитка ‘isRevealed’], правда) :
игры;
}

Раз плитки не существует, то мы просто возвращаем имеющейся игре. К счастью, такие вещи не в диковину. Доска представлены неизменяемого ассоциативного массива, в котором плитки являются более увлекательной частью данных. С переменной структурой данных, он будет чрезвычайно обычный:
функция revealTile(игры, плитки) {
игры.плитки[черепица].isRevealed = истина;
}

Но с неизменяемыми структурами, подобные предложенной выше, она становится наиболее сложной:
функция revealTile(игры, плитки) {
вар updatedTile = игра.получить(‘снимки’).получить(плитка).установить(‘isRevealed’, истина);
вар updatedTiles = игра.получить(‘снимки’).набор(плитка, updatedTile);
ответный матч.установить(‘плиток’, updatedTiles);
}

Фе! Это постоянный перечень неизменяемых ассоциативных массивов, где любая из крайних (т. Вся структура инициализируется, используя объекты и массивы в JavaScript, а потом становится «бессмертным» с fromJS от immutable.js:
createGame функции(характеристики) {
возвращение постоянными.fromJS({
столбцов: характеристик.простудные,
строк: варианты.строк,
плитка: initTiles вариантов.строк, варианты.простудные, варианты.мин)
});
}

Остальная основная игровая логика реализована в виде функций, принимающих этот постоянный структура в качестве собственного первого аргумента и возвращает новейший экземпляр. Это было короткое знакомство с неизменяемости на практике, раз вы желаете осознать наиболее детально, зайдите в этот codepen, он содержит полную реализацию правила игры Сапер. Более принципиальной функцией является revealTile.
Это наверное приведет к большей загруженности памяти, а также огромных вычислительных издержек, чем потребовалось бы для мутации 1-го объекта. Каждый раз, когда вы добавляете что-то какая-то застывшая форма, нам необходимо сделать новейший экземпляр методом копирования имеющихся значений и добавление новейших значений. А что насчет производительности? Вы сможете поразмыслить, что это может воздействовать на существенное понижение производительности и в неком смысле вы были бы правы.
На практике, во почти всех вариантах, внедрение неизменяемых данных прирастит общую производительность приложения, даже раз некие операции станут дороже по отдельности. Так как неизменяемые объекты не изменяются, они могут быть реализованы, используя стратегию под заглавием «общих структур» (структурный обмен), который генерирует еще наиболее низкой стоимости в стоимости памяти, чем вы могли бы ждать. В сопоставлении со встроенными массивами и объектами издержек будет по-прежнему существовать, но она будет иметь фиксированное значение и, как правило, может компенсироваться иными преимуществами, доступными благодаря неизменяемости.
Хотя некие люди как этот API, чтоб остальные люди это не ответ на этот вопросец. */ });

плитки[0].ИД = 2;

Мутация объекта плитки[0] не дает эффекта, чтоб наш проводник мутации, таковым образом, предлагаемый механизм отслеживания мутаций не годится даже для очевидного приложения. Это так отлично узнаваемый тест, что ecmascript 7 обеспечивает отдельный API для того, чтоб посодействовать выслеживать мутации объекта с наилучшими показателями: объект.следить(). В любом случае это не решает делему отслеживания мутаций верно:
вар плитки = [{идентификатор: 0, isRevealed: ложь}, {ИД: 1, isRevealed: «истина»}];
Объект.следить(плитки, функция() { /* … Представим, что состояние приложения ии потенциально новейшие состояния приложения б:
раз (А === Б) {
// данные не поменялись, остановка
}

Раз статус заявки не поменялся, он таковой же экземпляр как и ранее и нам не необходимо делать. Как неизменность может посодействовать в данной ситуации? Это наверное просит, чтоб мы выслеживали содержит правительство на ссылку, но неувязка на данный момент заключается в том, что мы должны управлять одной ссылки. Усовершенствовано отслеживание конфигураций
В любом Платформа пользовательского интерфейса, одной из более сложных задач является поиск мутаций.
Неизменность набирает все огромную популярность и это не крайняя статья на эту тему, что вы будете читать в этом году. Выводы
Надеюсь в данной статье вы узнали некие познания о том, как неизменность поможет для вас сделать лучше ваш код, и что продолжение пример может пролить свет на практические нюансы работы в этом направлении. habrahabr.ru Попытайтесь, и я обещаю, что ты быстро полюбишь его так же сильно, как я обожал и меня.