Slide 1

Slide 1 text

Reduxに依存しない 副作用の合成  

Slide 2

Slide 2 text

背景

Slide 3

Slide 3 text

背景 ● Mobx、Recoilなどの、Reduxに代わりうる状態管理ライブラリが普及してきた ● 一方で、Redux-Sagaのような複雑な副作用合成システムを使いたければ、 Reduxしか選択することが (実質)できない ● Redux-Sagaとは違う、「状態管理システムとは独立した副作用合成システム 」が必要

Slide 4

Slide 4 text

関数合成による 副作用の合成 https://github.com/neutron63zf/weakref-function-composer-sample

Slide 5

Slide 5 text

シンプルな合成 APIはinject/wrappedの2つのみ 副作用を合成したい関数と同じ型の値を返す関数を 受け取り、副作用を実行する関数 (g1, g2) injectは第一引数の関数に副作用を結びつける wrappedは副作用が結びついた関数を返す

Slide 6

Slide 6 text

多段合成 wrappedは実行された時点での合成された関数を返 すので、 右のように記述すれば副作用の関数の中でさらに 別の副作用を呼び出す事もできる。

Slide 7

Slide 7 text

特徴と課題

Slide 8

Slide 8 text

特徴(Pros) ● 小さい(40行程度) ● 関数に副作用となる関数をラップしていくだけの直感的な動作(シンプル) ● 型フレンドリーである ● 使う側が「副作用を発生させるかどうか」を制御可能 ● 副作用をRedux-Sagaのように仮想的な別プロセスで回すのではなく、関数の合成をしているだけなの で、「次の行に移ったときには副作用の実行は終わっている 」(実行タイミングがわかりやすい)

Slide 9

Slide 9 text

課題(Cons) ● Redux-Sagaほど表現力は高くない(yieldによるチャンネルの合成など) ○ 書けない事もないが結局 Redux-Sagaの再実装になってしまう ● コールスタックを消費するので、無限ループができない ○ trampolineなどのテクニックを使う事で回避可能

Slide 10

Slide 10 text

まとめ

Slide 11

Slide 11 text

まとめ ● Reduxに依存しない副作用の合成の仕方が求められている ● シンプルな関数合成で副作用を合成するというやり方がある ● 一定の課題はあるものの、特定の局面では力を発揮するかもしれない