Daniel Earwicker Chief Software Architect
FISCAL Technologies Ltd

What's good about Redux


JAVASCRIPT IMMUTABILITY FUNCTIONAL REACT 2016-07-24

Redux is based on series of really simple what-if questions:

  1. What if all the data in your app was immutable?
  2. Okay, now it's stuck. But what if there was only a single solitary mutable variable holding the complete state for your entire app? To change any bit of state, you just assign a slightly different immutable tree to that variable.
  3. And what if the only way to mutate the state was to create a POJO describing a high-level action, and dispatch it through a single giant processing system, describing the change to make?

A number of interesting advantages follow from sticking to this discipline. It's ideal for ReactJS. You can log everything your users do and replay it, stuff like that. You can store the state snapshots, or just the actions, or both. You can recover your app by loading in an old snapshot and then playing the recent actions to bring it up to date. If you want to know the complete story of how your application ended up in the state it's in now, you've got it. And aside from these nice capabilities, it's worth remembering a lot of bugs arise from fiddling with mutable state at the wrong time. Who needs that?

But just how easy is it to make each bit of your application capable of finding and update the bit of data relevant to itself within the entire state? What about modularity, composability, loose coupling, minimal dependency? It seems that, when I want to change the title of a book, I need to know that the book is in a shelf and the shelf is in a shop, so I can create an action that tells the single global store how to update. The "leaf nodes" of my app seemingly need to know far too much about where they sit in the world. Famously, in purist functional programming, every time I change something I've created a new version of the universe.

Redux as a pattern doesn't rule out interesting solutions to these problems, but nor does it mandate (or provide) them. A common approach in functional programming is the cursor. The originator of Redux, Dan Abramov, points out that classical cursors allow you to directly manipulate data, which then bypasses the idea of high-level actions, so something a little different is needed. I'm thinking of an abstraction that could be called a cursor but which accepts actions.

Redux has also presented a challenge for TypeScript users because of the apparently disconnected nature of the pieces involved. Actions can be independently created, and thrown into the One Giant Store, which then has to figure out what to do. So it seems the store accepts any kind of action across your entire application, and that doesn't sound very static type applicable. Of course this is not a problem that can be solved by saying "Oh, let's not bother with static typing"; more a sign that, because it is difficult to declare the static type relationships, it will be difficult for human beings to manually keep everything straight without any help.

These challenges will be overcome however. The core idea is so simple and enticing, it has to be made to work.

json-mobx - Like React, but for Data (Part 2) 2017-02-15
Redux in Pieces 2017-01-28
Box 'em! - Property references for TypeScript 2017-01-11
TypeScript - What's up with this? 2017-01-01
MobX - Like React, but for Data 2016-12-28
Eventless - XAML Flavoured 2016-12-24
Immuto - Epilogue 2016-12-20
Immuto - Radical Unification 2016-09-22
Immuto - Working with React (An Example) 2016-09-16
TypeScript - What is a class? 2016-09-11
Immuto - Strongly Typed Redux Composition 2016-09-11
TypeScript and runtime typing - EPISODE II 2016-09-10
TypeScript and runtime typing 2016-09-04
What's good about Redux 2016-07-24
TypeScript multicast functions 2016-03-13
Introducing doop 2016-03-08
TypeScript is not really a superset of JavaScript and that is a Good Thing 2015-07-11
A new kind of managed lvalue pointer 2014-04-27
Using pointer syntax as a shorthand for IEnumerable 2014-04-26
Adding crazily powerful operator overloading to C# 6 2014-04-23
Introducing Carota 2013-11-04
Want to comment on anything? Create an issue!