Контраріанський погляд на непорушність
TL / DR: Незмінюваність - це більше модна тенденція, ніж необхідність у JavaScript. Якщо ви використовуєте React, це забезпечує акуратну обробку деяких заплутаних варіантів дизайну в управлінні державою. Однак у більшості інших ситуацій він не додасть достатньої вартості через складність, яку він вводить, слугуючи більше, щоб підбити резюме, ніж задовольнити фактичну потребу клієнта.
Довга відповідь: читайте нижче.
Чому незмінність так важлива (або потрібна) у JavaScript?
Ну, я радий, що ти запитав!
Деякий час тому дуже талановитий хлопець на ім’я Дан Абрамов написав бібліотеку управління державним JavaScript під назвою Redux, яка використовує чисті функції та незмінність. Він також зробив кілька справді цікавих відео, які зробили ідею дуже зрозумілою (і продати).
Терміни були ідеальними. Новинка Angular затухала, і JavaScript у світі був готовий докласти найновішу річ, яка мала ступінь класу, і ця бібліотека була не лише новаторською, але і чудово поєднаною з React, який був проданий іншою електростанцією Silicon Valley .
Як це не сумно, у світі JavaScript владають модами. Зараз Абрамова називають напівбогом, і всі ми, просто смертні, повинні піддаватися Дао непорушності ... Це має сенс чи ні.
Що не так у мутуванні предметів?
Нічого!
Насправді програмісти мутували об’єкти для ер ... до тих пір, поки існували об'єкти для мутації. 50+ років розробки додатків, іншими словами.
І навіщо ускладнювати речі? Коли у вас є об'єкт, cat
і він гине, чи вам справді потрібна секунда, cat
щоб відстежувати зміни? Більшість людей просто сказали cat.isDead = true
б і з цим все зробили.
Чи не (мутують об’єкти) речі не прості?
ТАК! .. Звичайно, так!
Особливо в JavaScript, який на практиці найкорисніше використовується для надання уявлення про стан, який підтримується в іншому місці (наприклад, у базі даних).
Що робити, якщо у мене новий об’єкт Новини, який потрібно оновити? ... Як я досягти в цьому випадку? Видалити магазин і відтворити його? Чи не додавання об’єкта до масиву є менш дорогою операцією?
Ну, ви можете піти на традиційний підхід і оновити News
об’єкт, так що ваше уявлення в пам'яті цього об’єкта змінюється (і представлення, відображене користувачеві, або так можна сподіватися) ...
Або в якості альтернативи ...
Ви можете спробувати сексуальний підхід FP / Immutability і додати свої зміни до News
об'єкта до масиву, який відстежує кожну історичну зміну, щоб потім ви могли перебирати масив і з'ясувати, яким має бути правильне представлення стану (феу!).
Я намагаюся дізнатися, що саме тут. Будь ласка, просвіти мене :)
Моди приходять і йдуть приятелю. Існує багато способів шкіряти кота.
Мені шкода, що вам доведеться нести плутанину постійно змінюється набору парадигм програмування. Але ей, ВІТАЙТЕ ДО КЛУБУ !!
Тепер ще кілька важливих моментів, які слід пам’ятати, що стосується непорушності, і ви натрапляєте на вас з гарячковою інтенсивністю, яку може сприйняти лише наївність.
1) Незмінність є приголомшливою для того, щоб уникнути перегонів у багатопотокових середовищах .
Багатопотокові середовища (наприклад, C ++, Java та C #) винні в практиці блокування об'єктів, коли більше одного потоку хоче їх змінити. Це погано для продуктивності, але краще, ніж альтернатива корупції даних. І все ж не так добре, як зробити все непорушним (Господь хвалить Хаскелла!).
АЛЕ АЛАС! У JavaScript ви завжди працюєте на одному потоці . Навіть веб-працівників (кожен працює в окремому контексті ). Отже, оскільки у вашому контексті виконання (у всіх цих чудових глобальних змінних та закриттів) у вас не може бути умови перегонів, пов’язаних з потоком , головний момент на користь Immutability виходить у вікно.
(Сказавши це, є перевага в застосуванні чистих функцій у веб-службовців. Це те, що ви не будете сподіватися на те, що ви зможете познайомитися з об'єктами на головній темі.)
2) Незмінюваність може (якимось чином) уникнути перегонів у стані вашої програми.
І ось справжня суть справи, більшість розробників (React) скажуть вам, що Immutability та FP можуть якось працювати над цією магією, що дозволяє стану вашої програми стати передбачуваним.
Звичайно, це не означає, що ви можете уникнути перегонових умов у базі даних , щоб витягнути це, вам доведеться координувати всіх користувачів у всіх браузерах , і для цього вам знадобиться зворотна технологія push як WebSockets ( докладніше про це нижче), що транслюватиме зміни для всіх, хто працює з додатком.
Також це не означає, що в JavaScript існує якась притаманна проблема, коли стан вашої програми потребує незмінності, щоб стати передбачуваним, будь-який розробник, який кодував додаткові програми перед React, сказав би вам це.
Ця досить заплутана заява просто означає, що з React ваш додаток стане більш схильним до перегонів , але ця незмінність дозволяє зняти цей біль. Чому? Оскільки React є особливим .. він був розроблений як високооптимізована бібліотека візуалізації, когерентне управління державою займає друге місце, і таким чином стан компонентів управляється за допомогою асинхронного ланцюга подій (він же "одностороння прив'язка даних"), що у вас немає контролю і покладатися на вас, пам'ятаючи, що не мутувати стан безпосередньо ...
З огляду на цей контекст, легко зрозуміти, як потреба в незміненості мало спільного з JavaScript і багато спільного з перегоновими умовами в React: якщо у вашій програмі є маса взаємозалежних змін і немає простого способу зрозуміти, що зараз у вашому стані, ви заплутаєтесь , і, таким чином, має сенс використовувати незмінність для відстеження всіх історичних змін .
3) Умови гонки категорично погані.
Ну, вони можуть бути, якщо ви використовуєте React. Але вони рідкісні, якщо ви підбираєте іншу рамку.
Крім того, у вас зазвичай виникають набагато більші проблеми з вирішенням ... Такі проблеми, як пекло залежності. Наче роздута база коду. Наче ваш CSS не завантажується. Як і повільний процес збирання або застряг у монолітній задній частині, що робить ітерацію майже неможливою. Як і недосвідчені дияволи, які не розуміють, що відбувається, і роблять безлад.
Ти знаєш. Реальність. Але ей, кого це хвилює?
4) Незмінність використовує еталонні типи, щоб зменшити ефективність відстеження кожної зміни стану.
Тому що серйозно, якщо ви збираєтесь копіювати матеріали щоразу, коли ваш стан змінюється, краще переконайтеся, що ви розумні в цьому.
5) Незмінюваність дозволяє знімати матеріали UNDO .
Тому що е .. це функція номер один, яку запросить ваш менеджер проектів, правда?
6) Стан, що змінюється, має багато цікавого потенціалу в поєднанні з WebSockets
І останнє, але не менш важливе, накопичення дельти штатів робить досить переконливим випадком у поєднанні з WebSockets, що дозволяє легко спожити стан як потік незмінних подій ...
Як тільки копійка падає на цю концепцію (держава є потоком подій, а не сирим набором рекордів, що представляють останню думку), незмінний світ стає магічним місцем для проживання. Країна дивовижних подій і можливостей, що виходить за рамки самого часу . І коли все зроблено правильно , це може виразно зробити в режимі реального часу додаток Easi ер для виконання, ви просто транслювати потік подій для всіх бажаючих , щоб вони могли побудувати своє власне уявлення про сьогодення і записати назад свої зміни в комунальний потік.
Але в якийсь момент ти прокидається і розумієш, що все це диво і магія не приходять безкоштовно. На відміну від ваших колег, які прагнуть, ваші зацікавлені сторони (так, люди, які платять вам) мало дбають про філософію чи моду та багато грошей, які вони платять, щоб створити продукт, який вони можуть продати. І суть полягає в тому, що важче написати незмінний код і простіше його зламати, плюс мало сенсу мати непорушний фронт-енд, якщо у вас немає бек-енду для його підтримки. Коли (і якщо!) Ви нарешті переконуєте своїх зацікавлених сторін у тому, що ви повинні публікувати та споживати події за допомогою поштовхової технології, як WebSockets, ви дізнаєтесь, який біль викликає масштаб у виробництві .
Тепер для поради, якщо ви вирішите її прийняти.
Вибір написання JavaScript за допомогою FP / Immutability також є вибором для того, щоб зробити базу коду додатків більш масштабною, більш складною та важкою для управління. Я настійно заперечую за обмеження такого підходу до ваших редукторів Redux, якщо ви не знаєте, що ви робите ... І якщо ви збираєтеся йти вперед і використовувати незмінність незалежно, то застосуйте непорушний стан до всього свого пакета програм , а не лише на стороні клієнта, оскільки у вас відсутня реальна цінність.
Тепер, якщо вам пощастило, щоб можна було робити вибір у своїй роботі, то спробуйте використати свою мудрість (чи ні) і робіть те, що належить вам, хто платить вам . Ви можете це базувати на своєму досвіді, на вашій кишці або на тому, що відбувається навколо вас (правда, якщо всі користуються React / Redux, тоді є вагомий аргумент, що буде легше знайти ресурс для продовження вашої роботи). Або ж, ви можете спробувати або відновити розроблену розробку, або підхід під керуванням Hype . Вони можуть бути більше вашою справою.
Коротше кажучи, річ , щоб сказати про незмінність, що це буде зробити вас модним з вашими колегами, принаймні до наступного повальне захоплення відбувається навколо, з допомогою чого ви будете раді , що рухатися далі.
Тепер після цього сеансу самолікування хотілося б зазначити, що я додав це як статтю у своєму блозі => Незмінюваність у JavaScript: Контррианський погляд . Не соромтесь відповісти там, якщо у вас є сильні почуття, ви хотіли б також зійти з грудей;).