redux には良い middleware が必須

redux で reducer を分割すると reducer の範囲外の情報が欲しくなることがある。 middleware なしの redux だとそれに対応できないので reducer の分割はできないのでは、という疑問からはじまる一連のツイートのまとめ。 View で state 全体から Action を生成する案 ↓ View に不要だが Action に必要な情報を、 View に処理させる構造はおかしい 続きを読む
2
bouzuya @bouzuya

pure な redux におけるほとんど唯一の機能と言っていい reducer の分割だけど、あの思想が全然有効なものだと思えないのは、ぼくだけかな。必要ならその場で簡単に実装できるものだし、基本的に有用ではなくて害ばかりと認識している。

2016-05-24 11:11:38
bouzuya @bouzuya

redux の reducer の単位は DDD の aggregate の単位によく似ていると思うのだけど、参照も含めて完全に禁止するあの構造が適切なのか疑問だ。ドメインサービスのようなものを置けないので、容易にアプリケーションサービス相当のミドルウェアに処理が漏れる。

2016-05-24 11:19:51
bouzuya @bouzuya

reducer の単位が誤っているのだと言われるかもしれないが、stateの1プロパティではどうしても情報が足りなくてstateの全体から必要な情報をとってactionつくってdispatchするようなことが平気で起こる気がする。ぼくの redux の API の知識不足なのか?

2016-05-24 11:24:36
bouzuya @bouzuya

それってミドルウェア前提になるけど、どうなんだって感じだ。あと reducer を分割しないと気にしなくていいものまで気にしないといけなくて、それはそれでおかしい。

2016-05-24 11:26:53
Yuki Kodama @kuy

reducerをどんな単位で分けようと、connectするときに必要な情報をstate全体から持ってこれるから、それを使ってどんなactionでも作れるよ。 twitter.com/bouzuya/status…

2016-05-24 11:27:30
bouzuya @bouzuya

@kuy むしろ、そのほうがヤバそう。ビューコンポーネントが意識する情報なのか怪しいケースないですか?それ。

2016-05-24 11:28:25
Yuki Kodama @kuy

@bouzuya いや、Viewには意識させない。あくまでRedux側のセレクタ関数がstate全体から何を持ってくるか決めていて、Viewコンポーネントは結果をpropsとして受け取って、それを使ってaction作ってdispatchする。

2016-05-24 11:31:00
bokuweb @bokuweb17

@bouzuya @kuy バカ正直にループに乗っかるとactionのために必要で、ビューに必要のない情報が降りていく状態が発生するケースありますね。それを避けようとすると結局thunkやmidlewareでgetStateしたりsagaでselectしたりになる気がする。

2016-05-24 11:32:43
bouzuya @bouzuya

@kuy いや、意識してませんか、それ。なぜその action をつくるのに、その(意識しないと言われている)情報をがいるのか分からないわけですよね。操作のタイミングを伝えるだけで十分なのに、情報を受け渡す役割を負わされませんか?

2016-05-24 11:33:38
Yuki Kodama @kuy

@bokuweb17 @bouzuya それだ!たしかにそれはaction投げるためにprops渡しちゃってるから良いとはいえないな。

2016-05-24 11:34:31
bouzuya @bouzuya

@kuy twitter.com/bokuweb17/stat… これの "actionのために必要で、ビューに必要のない情報が降りていく状態が発生するケース" ←これ

2016-05-24 11:34:56
Yuki Kodama @kuy

@bouzuya いや、そのとおりですm(__)m @bokuweb17 さんも言ってますが、あまりそういうことをView内でやることはないです。避けるために他に逃がしてますね。

2016-05-24 11:35:39
bouzuya @bouzuya

@kuy @bokuweb17 そうそう、それって感じです。

2016-05-24 11:35:50
bokuweb @bokuweb17

@kuy @bouzuya その辺の解決がまだわかってないです。正直にするとviewに不要な情報がviewを経由するケースがあるんだけど。getSateするのも、折角redux使っているのに、これやっていいの?感があって、ベストプラクティス分かってない・・

2016-05-24 11:36:29
bokuweb @bokuweb17

@bouzuya @kuy これっていい方法あるんですかね?個人的にはsagaに集約してselectを節度をもって使うくらいしか思いつかないんですが・・。

2016-05-24 11:37:49
Yuki Kodama @kuy

@bokuweb17 @bouzuya 極力Viewからはイベントを最低限必要な情報と一緒にactionとして投げてもらって、middlewareなりsagaなりで情報を補完して実際の処理を行うって感じにしてます。

2016-05-24 11:38:32
bouzuya @bouzuya

@bokuweb17 @kuy ぼくは middleware 前提にするのが正しいと思っています。そのために reducer 分割をやめるというのはありえないので。で、それって redux は必要十分になってんの?ってのがぼくの不満です。

2016-05-24 11:38:48
bouzuya @bouzuya

@kuy さんの情報を持ちまわる案もありますね。

2016-05-24 11:39:25
bokuweb @bokuweb17

@kuy @bouzuya やはりそうですよね。わかる。

2016-05-24 11:40:40
bouzuya @bouzuya

@bokuweb17 @kuy 変更に必要な情報はすべて action から与えられる←正しい。じゃあ aciton をつくるのに必要な情報を常に持ちまわるべき←正しくない……たぶん。でも、pure な redux だとできなくない←おかしくね? ↑ぼくの意見。

2016-05-24 11:40:53
bouzuya @bouzuya

良い middleware 必須ってことで。

2016-05-24 11:41:43
bokuweb @bokuweb17

@bouzuya @kuy わかる。「aciton をつくるのに必要な情報を常に持ちまわるべき」正しくないんだけど、いい方法が明示されていなくて、結果規模が大きくなるとデカイデータがループをぐるぐるブン回るという事象が発生する

2016-05-24 11:43:08
Yuki Kodama @kuy

@bokuweb17 @bouzuya たしかに正攻法がわかりにくいのはある。middleware含めてreduxって感じなので、Viewには描画に必要な情報以外は持たない、というのを基本として作っていくと不幸にはならない気がする。

2016-05-24 11:45:56