Reduxの力ずは䜕ですか

画像







これは、蚘事「 Reduxの玠晎らしいずころ 」 ゞャスティンファルコヌネ著の翻蚳です。







Reduxは、Reactコンポヌネントの状態を䜿甚しお䌝えるのが難しい耇雑な状態の盞互䜜甚を巧みに凊理したす。 実際、これはオブゞェクト指向プログラミングにも芋られるメッセヌゞングシステムですが、蚀語に盎接組み蟌たれおいるのではなく、ラむブラリずしお実装されおいたす。 OOPず同様に、Reduxは制埡を呌び出し偎から受信偎に転送したす。むンタヌフェヌスは状態を盎接制埡したせんが、凊理のためにメッセヌゞを枡したす。







この点で、Reduxのストレヌゞはオブゞェクトであり、レデュヌサヌはメ゜ッドハンドラヌであり、アクションはメッセヌゞです。 store.dispatch({ type:"foo", payload:"bar" })



をstore.send(:foo, "bar")



store.dispatch({ type:"foo", payload:"bar" })



、Rubyのstore.send(:foo, "bar")



store.dispatch({ type:"foo", payload:"bar" })



同等です。 ミドルりェアはアスペクト指向プログラミングたずえばRailsのbefore_action



ずほが同じ方法で䜿甚され、 before_action



の助けを借りお、react-reduxに䟝存性泚入が実装されたす。







このアプロヌチの利点は䜕ですか









しかし、これらのケヌスはすべお特別です。 より単玔なシナリオはどうですか



ここで問題が発生したす。









ただし、䞻な問題は、単玔なケヌスの定型文のこのような長い䜜業の埌、䞀般的に耇雑なケヌスではより良い解決策があるこずを忘れるこずです。 最終的に状態の巧劙な移行に盎面しお、あなたは単に新しい倀を蚭定する倚くの異なるアクションを送りたす。 あるレデュヌサヌから別のレデュヌサヌにスむッチオプションをコピヌアンドペヌストし、どこからでも䜿甚できる関数の圢匏で抜象化したせん。







これらすべおを人的芁因に垰するのは簡単です。ドキュメンテヌションをマスタヌしなかった、たたは「マスタヌは愚かです-ナむフは愚かです」 -しかし、そのような問題はしばしば疑わしく芋぀かりたす。 それがほずんどのマスタヌのために愚かであるならば、ナむフに問題がありたすか







だから、通垞のケヌスではReduxから離れお、特別なケヌスのためにそれを保存する方が良いでしょうか







Reduxチヌムからそのようなアドバむスが䞎えられたす。同僚にも同じこずを蚀いたすsetState



が完党に制埡できなくなるたで、それを取り䞊げないでください。 しかし、Reduxを䜿甚する理由はい぀でも芋぀かるので、私自身も自分のルヌルには埓いたせん。 set_$foo



ような倚くのアクションがあり、倀が割り圓おられるたびに、URLが曎新されるか、他の䞭間倀がリセットされたす。 状態ずナヌザヌむンタヌフェむスの間に明確で明確な察応があるかもしれたせんが、ログむンするか、アクションをキャンセルする必芁がありたす。







実際、私はReduxで正しく曞く方法、特にそれを教える方法を知りたせん。 私が取り組んだ各アプリケヌションには、このようなReduxのアンチパタヌンがたくさんありたす。より良い解決策が芋぀からないか、同僚に䜕かを倉えるように説埗できたせんでした。 Reduxの専門家が平凡なコヌドを曞いおいるず蚀えば、新人に぀いおは䜕ず蚀えたすか。 Reduxを䞀列に䞊べお䜿甚するずいう䞀般的なアプロヌチのバランスをずろうずしおいるだけです。







この堎合の察凊方法







幞いなこずに、Reduxは、Jumpstart https://github.com/jumpsuit/jumpstate などの単玔なものを操䜜するためのサヌドパヌティラむブラリを含めるのに十分な柔軟性を備えおいたす 。 説明させおくださいReduxは䜎レベルのタスクに䜿甚できないずは思いたせん。 それらの䜜業がサヌドパヌティのラむブラリに䞎えられた堎合、これは理解を耇雑にし、自明の法則によれば、些现なこずに時間が無駄になりたす。各ナヌザヌは最終的には独自のフレヌムワヌクを郚分的に構築する必芁があるためです。







奜きな人もいたす。







そしお私は圌らの䞭にいたす しかし、これはすべおの人に圓おはたるわけではありたせん。 私はReduxの倧ファンであり、ほがすべおのプロゞェクトで䜿甚しおいたすが、新しいwebpack構成も詊しおみたいです。 私は兞型的なナヌザヌの䟋ではありたせん。 Reduxに基づいお独自の抜象化を䜜成するず、新しい機䌚が埗られたすが、半幎前にドキュメントを残さずに終了したシニア゚ンゞニアが曞いた抜象化は䜕をもたらしたすか







Reduxが解決する耇雑な問題に出くわす可胜性はありたせん。特に、䞊玚の同僚がそのようなタスクに関䞎しおいるチヌムのゞュニアである堎合はそうです。 次に、Reduxがすべおが3回曞き換えられるような奇劙なラむブラリであるず想像したす。 Reduxは、深く理解するこずなく、機械的に機胜するのに十分なほど単玔ですが、これにはほずんど喜びず利益がありたせん。







だから私は以前に尋ねた質問に戻りたすほずんどがツヌルを誀っお䜿甚する堎合、それは党䜓の問題ですか 高品質のツヌルは有甚で耐久性があるだけでなく、それを䜿っお䜜業するのも快適です。 正しく䜿甚するのが最も䟿利です。 このようなツヌルは、仕事のためだけでなく、人のためにも䜜られおいたす。 楜噚の品質は、それを䜿甚するマスタヌに関する䜜成者の泚意を反映しおいたす。







そしお、私たちはどのようにマスタヌを気にしたすか ツヌルの利䟿性に取り組むのではなく、すべおが間違っおいるず䞻匵するのはなぜですか







関数型プログラミングにも同様の珟象がありたす。これは、私が「モナドの教蚓」ず呌ぶものです。モナドがどのように機胜するかを説明するのは簡単ですが、その利点を䌝えるのは驚くほど困難です。







投皿の途䞭でモナドを説明するこずに真剣ですか







モナドはHaskellで䞀般的な抜象化であり、リストの操䜜や゚ラヌ、状態、時間、I / Oの凊理など、さたざたな蚈算に䜿甚されたす。 do-notationの圢匏の構文糖は、呜什コヌドに䌌た圢匏でモナドの操䜜のシヌケンスを衚すこずができたす。これは、非同期コヌドを同期のように芋えるJavaScriptのゞェネレヌタヌにほが䌌おいたす。







最初の問題は、アプリケヌションの芳点からモナドを蚘述するこずは完党に正しいずは限らないこずです。 修道士は、副䜜甚ず逐次蚈算を扱うためにHaskellに登堎したしたが、抜象的な意味では、それらはそれずは䜕の関係もありたせん圌らは単に2぀の関数の盞互䜜甚に関する䞀連のルヌルであり、特別な意味はありたせん。 結合性は、算術挔算、集合の挔算、リストの結合、およびヌル䌝播にも同様に適甚できたすが、それらずは独立しお存圚したす。







2番目の問題は冗長性です。これは、少なくずも、呜什型アプロヌチず比范したモナドの芖芚的な耇雑さを意味したす。 Maybe



ような明確に定矩されたオプション型は、萜ずし穎をnull



ずしお芋぀けるよりも安党ですが、それらのコヌドは長くお扱いにくいです。 Either



タむプを䜿甚した゚ラヌ凊理は、䟋倖をどこにでもスロヌできるコヌドよりも理解しやすいように芋えたすが、同意するように、䟋倖を含むコヌドは、 Either



で倀を定数で返すよりも簡朔です。 状態、入力/出力などの副䜜甚に぀いおは、呜什型蚀語ではたったく些现なこずです。 関数型プログラミングのファン私を含むは、関数型蚀語の副䜜甚を扱うのは非垞に簡単だず䞻匵するでしょうが、どんな皮類のプログラミングも簡単だず玍埗できる人はいないでしょう。







これらの䟋を広く芋おみるず、その利点は本圓に顕著です。モナドの法則に埓うだけでなく、同じ法則です。 1぀のケヌスで機胜する䞀連の操䜜が、他のケヌスで機胜する堎合がありたす。 リストのペアをペアのリストに倉えるこずは、条件でPromise



オブゞェクトのペアを組み合わせお、結果を含むタプルを返すものず同じです。







なぜこれすべおなのか







実際、Reduxにも同じ問題がありたす。圌が耇雑だからではなく、単玔だからずいっお、トレヌニングするのは難しいです。 理解はむしろ知識ではなく、基本原理を信頌するこずです。そのおかげで、垰玍によっお䌑息するこずができたす。







この理解は共有するのが簡単ではありたせん。なぜなら、基本原則は平凡な公理に(prevState, action) => nextState



する「副䜜甚を回避する」か、意味がほずんどなくなるほど抜象的であるためです (prevState, action) => nextState



。 特定の䟋は圹に立たないReduxの冗長性を瀺すだけで、その衚珟力は瀺さない。







悟りに達した私たちの倚くは、私たちがどのように圌に来たかをすぐに忘れおしたいたす。 私たちの「啓発」は、繰り返される間違いや誀りの結果であるこずをもはや芚えおいたせん。







そしお、あなたは䜕を提案したすか







私たちに問題があるこずを認識しおほしい。 Reduxはシンプルですが、簡単ではありたせん。 これは開発者による合理的な決定ですが、同時に劥協です。 䜿いやすさを優先しおメカニズムの単玔さを郚分的に犠牲にするツヌルは、倚くの人々にずっお有甚です。 しかし、コミュニティは、ある皮の劥協が行われたこずを認識しおいたせん。







私の意芋では、ReactずReduxを比范するのは興味深いです。ReactはReduxよりもはるかに耇雑で、APIははるかに広く、奇劙なこずに、孊習ず䜿甚が簡単です。 React APIで本圓に必芁なのは、 React.createElement



およびReactDOM.render



であり、状態、コンポヌネントのラむフサむクル、さらにはDOMむベントさえも異なる方法で凊理できたす。 これらすべおの機胜をReactに含めるず、難しくなりたしたが、改善されたした。







「原子状態」は抜象的な抂念であり、実際に利益をもたらすのは、それを理解した埌です。 䞀方、Reactでは、どのように動䜜するのか理解しおいなくおも、 setState



コンポヌネントsetState



がアトミック状態を制埡したす。 このような解決策は理想的ではありたせん。䞀般的に状態を攟棄するか、倉曎ごずに必ず曎新する方が効率的です。 このメ゜ッドは、非同期に呌び出すず䞍快な驚きをもたらす可胜性がありたすが、それでもsetStateは理論的な抂念ではなく、䜜業メ゜ッドずしおのReactにずっおはるかに䟿利です。







Redux開発チヌムずそのナヌザヌコミュニティはどちらもAPI拡匵に積極的に反察しおいたすが、珟圚行われおいるように、倚数の小さなラむブラリをたずめるこずは、初心者にずっおも厄介な䜜業であり、退屈な䜜業です。 Reduxが単玔なケヌスの組み蟌みサポヌトのレベルたで成長できない堎合、このニッチを占める「救䞖䞻」フレヌムワヌクが必芁になりたす。 ゞャンプスヌツは良い候補になる可胜性がありたす。倚察倚の関係の性質を維持しながら、特定の機胜の圢でアクションず条件のアむデアを具䜓化したす。 しかし、救い䞻の遞択は救いの事実ほど重芁ではありたせん。







皮肉なこずに、Reduxの意味は「開発者゚クスペリ゚ンス」です。ダンは、Elmのようなタむムトラベルデバッガヌを孊習および再生するようReduxを蚭蚈したした。 しかし、アむデアが独自の圢を取り、実際にReact゚コシステムのオブゞェクト指向環境に倉わったため、「DX」の利䟿性が背景に消え、構成の柔軟性が倱われたした。 これによりRedux゚コシステムが繁栄したしたが、アクティブなサポヌトを備えた䟿利なフレヌムワヌクが必芁な堎合はどこでも、ギャップは空です。 Reduxコミュニティはそれを満たす準備ができおいたすか







オルガ・むサコワ蚳








All Articles