Противоположный взгляд на неизменность
TL / DR: неизменность - это скорее модная тенденция, чем необходимость в JavaScript. Если вы используете React, он обеспечивает удобный обход некоторых запутанных вариантов дизайна в управлении состоянием. Тем не менее, в большинстве других ситуаций он не принесет достаточной пользы по сравнению со сложностью, которую он представляет, и служит скорее для подбора резюме, чем для удовлетворения фактической потребности клиента.
Длинный ответ: читайте ниже.
Почему неизменяемость так важна (или необходима) в JavaScript?
Ну, я рад, что ты спросил!
Некоторое время назад очень талантливый парень по имени Дэн Абрамов написал библиотеку управления состоянием javascript под названием Redux, которая использует чистые функции и неизменность. Он также сделал несколько действительно классных видео, которые сделали идею очень простой для понимания (и продажи).
Время было идеальным. Новинка Angular постепенно исчезала, и мир JavaScript был готов зацикливаться на последних новинках, обладающих должной степенью крутизны, и эта библиотека была не только инновационной, но и идеально подходящей для React, которую торгует другая электростанция в Силиконовой долине .
Как ни печально, мода правит миром JavaScript. Теперь Абрамова провозглашают полубогом, и все мы, простые смертные, вынуждены подчиняться Дао Неизменности ... имеет ли это смысл или нет.
Что не так в мутирующих объектах?
Ничего!
На самом деле программисты мутировали объекты вечно ... до тех пор, пока существуют объекты, которые должны мутировать. Другими словами, более 50 лет разработки приложений.
И зачем все усложнять? Когда у вас есть объект, cat
и он умирает, вам действительно нужна секунда, cat
чтобы отследить изменение? Большинство людей просто скажут cat.isDead = true
и покончат с этим.
Разве (мутирующие объекты) не делают вещи простыми?
ДА! .. Конечно, это так!
Особенно в JavaScript, который на практике наиболее полезен для отображения некоторого состояния, которое поддерживается в другом месте (например, в базе данных).
Что если у меня есть новый объект новостей, который необходимо обновить? ... Как мне добиться в этом случае? Удалить магазин и воссоздать его? Не является ли добавление объекта в массив менее дорогой операцией?
Ну, вы можете пойти по традиционному подходу и обновить News
объект, так что ваше представление этого объекта в памяти изменится (и представление, отображаемое пользователю, или так можно надеяться) ...
Или в качестве альтернативы ...
Вы можете попробовать подход «FP / Immutability» и добавить свои изменения в News
объект в массив, отслеживающий каждое историческое изменение, чтобы затем можно было перебрать массив и выяснить, каким должно быть правильное представление состояния (фу!).
Я пытаюсь узнать, что здесь. Пожалуйста, просветите меня :)
Мода приходит и уходит, приятель. Есть много способов снять кожу с кошки.
Я сожалею о том, что вам приходится мириться с путаницей постоянно меняющегося набора парадигм программирования. Но привет, добро пожаловать в клуб!
Теперь несколько важных моментов, которые следует помнить в отношении Неизменности, и вы получите эти броски на вас с лихорадочной интенсивностью, которую может проявить только наивность.
1) Неизменность исключительна, поскольку позволяет избежать условий гонки в многопоточных средах .
Многопоточные среды (такие как C ++, Java и C #) виновны в практике блокировки объектов, когда более чем один поток хочет изменить их. Это плохо сказывается на производительности, но лучше, чем альтернатива повреждения данных. И все же не так хорошо, как сделать все неизменным (хвала Господу Хаскеллу!).
НО УВЫ! В JavaScript вы всегда работаете с одним потоком . Даже веб-работники (каждый работает в отдельном контексте ). Так как вы не можете иметь связанное с потоками состояние гонки внутри контекста выполнения (все эти прекрасные глобальные переменные и замыкания), главное в пользу неизменности выходит за рамки.
(Сказав это, есть это преимущество для использования чистых функций в веб - рабочих, которые является то , что у вас не будет никаких ожиданий по поводу махинаций с объектами на главном потоке.)
2) Неизменность может (каким-то образом) избежать состояния гонки в состоянии вашего приложения.
И в этом-то и вся суть вопроса, большинство разработчиков (React) скажут вам, что неизменность и FP могут каким-то образом использовать эту магию, которая позволяет состоянию вашего приложения стать предсказуемым.
Конечно, это не означает, что вы можете избежать состязаний в базе данных , чтобы справиться с этим, вам нужно будет координировать действия всех пользователей во всех браузерах , и для этого вам понадобится внутренняя технология push, такая как WebSockets ( подробнее об этом ниже), который будет транслировать изменения для всех, кто запускает приложение.
Это также не означает, что в JavaScript есть какая-то внутренняя проблема, когда вашему приложению требуется неизменяемость, чтобы стать предсказуемым, - любой разработчик, который программировал внешние приложения до того, как React скажет вам об этом.
Это довольно запутанное утверждение просто означает, что с React ваше состояние приложения станет более подверженным гонкам , но эта неизменность позволяет вам избавиться от этой боли. Зачем? Поскольку React является особенным ... он был спроектирован как высокооптимизированная библиотека рендеринга, в которой согласованное управление состоянием занимает второе место, и, таким образом, состояние компонента управляется через асинхронную цепочку событий (так называемое "одностороннее связывание данных"), которую вы не можете контролировать и полагаться на то, что вы помните, чтобы не изменять состояние напрямую ...
Учитывая этот контекст, легко увидеть, что потребность в неизменяемости имеет мало общего с JavaScript и имеет много общего с условиями гонки в React: если в вашем приложении есть куча взаимозависимых изменений и нет простого способа выяснить, что ваше состояние в настоящее время находится в состоянии, вы будете сбиты с толку , и поэтому имеет смысл использовать неизменность для отслеживания всех исторических изменений .
3) Гоночные условия категорически плохие.
Ну, они могут быть, если вы используете React. Но они редки, если вы берете другие рамки.
Кроме того, у вас обычно есть гораздо большие проблемы, с которыми нужно иметь дело ... Проблемы, такие как ад зависимости. Как раздутая кодовая база. Как ваш CSS не загружается. Как медленный процесс сборки или привязка к монолитному бэкэнду, что делает итерацию практически невозможной. Как неопытные разработчики, которые не понимают, что происходит, и делают беспорядок.
Знаешь. Реальность. Но эй, кого это волнует?
4) Неизменяемость использует эталонные типы, чтобы уменьшить влияние на производительность отслеживания каждого изменения состояния.
Потому что, если серьезно, если вы собираетесь копировать вещи каждый раз, когда меняется ваше состояние, вам лучше убедиться, что вы умны в этом.
5) Неизменность позволяет вам отменить вещи .
Потому что ... это особенность номер один, которую попросит менеджер проекта, верно?
6) Неизменное состояние имеет много интересных возможностей в сочетании с WebSockets
И последнее, но не менее важное: накопление дельт состояний приводит к убедительным аргументам в сочетании с WebSockets, что позволяет легко использовать состояние как поток неизменяемых событий ...
Как только копейка опускается на эту концепцию (состояние - это поток событий, а не грубый набор записей, представляющих последние взгляды), неизменный мир становится волшебным местом для обитания. Земля из событийных источников удивления и возможности того, что выходит за пределы самого времени . И когда все сделано правильно , это может определенно сделать в режиме реального времени приложения Easi эр для выполнения, вы просто транслировать поток событий для всех желающих , чтобы они могли строить свое собственное представление о настоящем и записать обратно свои изменения в коммунальный поток.
Но в какой-то момент вы просыпаетесь и понимаете, что все это чудо и магия приходят не бесплатно. В отличие от ваших нетерпеливых коллег, ваши заинтересованные стороны (да, люди, которые вам платят) мало заботятся о философии или моде и много о деньгах, которые они платят за создание продукта, который они могут продать. И суть в том, что труднее написать неизменяемый код и легче его взломать, плюс мало смысла иметь неизменный внешний интерфейс, если у вас нет внутреннего интерфейса для его поддержки. Когда (и если!) Вы, наконец, убеждаете своих заинтересованных лиц в том, что вы должны публиковать и использовать события с помощью технологии push, такой как WebSockets, вы обнаруживаете, насколько сложно масштабировать в производстве .
Теперь для некоторых советов, если вы решите принять его.
Выбор для написания JavaScript с использованием FP / Immutability - это также выбор, чтобы сделать кодовую базу вашего приложения больше, сложнее и сложнее в управлении. Я бы настоятельно посоветовал ограничить этот подход вашими редукторами Redux, если вы не знаете, что делаете ... И если вы собираетесь продолжить и использовать неизменяемость независимо, затем примените неизменяемое состояние ко всему вашему стеку приложений. , а не только к на стороне клиента, так как в противном случае вы упускаете реальную ценность.
Теперь, если вам достаточно повезло, что вы можете делать выбор в своей работе, тогда попытайтесь использовать свою мудрость (или нет) и делайте то, что правильно с человеком, который платит вам . Вы можете основывать это на своем опыте, своей интуиции или на том, что происходит вокруг вас (по общему признанию, если все используют React / Redux, тогда есть веский аргумент, что будет легче найти ресурс для продолжения вашей работы). В качестве альтернативы, Вы можете попробовать подходы Resume Driven Development или Hype Driven Development . Они могут быть больше в твоем роде.
Короче говоря, вещь , чтобы сказать о неизменности, что это будет сделать вас модным с вашими коллегами, по крайней мере до следующего повальное увлечение происходит вокруг, с помощью чего вы будете рады , что двигаться дальше.
Теперь, после этого сеанса самолечения, я хотел бы отметить, что я добавил это в качестве статьи в своем блоге => Неизменность в JavaScript: противоположный взгляд . Не стесняйтесь отвечать там, если у вас есть сильные чувства, которые вы хотели бы тоже покинуть свою грудь;).