Reduxを曞いたずき

画像



たたはクラヌケンハント 。 前のメモ ここずここ で、さたざたなアヌキテクチャスタむル、特にModel-View-ControllerずFluxに぀いおBraindumpを共有したした。



私は、Fluxに盎面しお䜕の革呜も芋なかったこずに泚意したした。このテンプレヌトは新しいものではありたせん。 1979 Reenskaug-MVCに䌌おいるこずがわかりたした 。 たた、コヌドからReduxFlux実装の1぀を削陀するこずを決めたず述べたした。 これらの点をより詳现に説明する必芁があるように思えたす。 私の目暙は、読者にFluxをMVCず呌ぶべきであるず玍埗させるこずでも、reduxモゞュヌルが䞍良であり、完党に攟棄されるべきだず蚀うこずでもありたせん。



では、Fluxはどうですか



たず、Fluxずは䜕かを刀断する必芁がありたす。 たず、それは間違いなくアヌキテクチャスタむルであり、珟時点では、Webクラむアントアプリケヌションだけのものではありたせん。 次に、明確に定矩されたコンポヌネントず甚語のセットです。



この抂念の実装はすでに倚数ありたすが、最も人気のあるものはFacebook / Flux 、 Redux 、 Fluxxor 、 Reflux 、 Vuejs / Vuex 、 Mobxのみです。 SAM.js State-Action-Modelの圢匏で゚キゟチックなものがありたす。



しかし、重芁なこずは、 Dispatcher 、 Action 、 Store、およびStateずいう甚語が、珟代のクラむアントアプリケヌションアヌキテクチャで厳しい䜍眮を占めおいるこずです。 新しいシステムに来た開発者がコントロヌラヌレむダヌを探すのず同じように、今ではストレヌゞたたはディスパッチャヌを探しおいたす。



それでこれにどう関係するのでしょうか 治療は間違いなく良いです。 私にずっお、Fluxは第2レベルのSoC懞念の分離であり、特定のMVCコンポヌネント内の責任の区分です。 これは新しいアむデアではなく、 Taligent-MVPがコントロヌラヌレむダヌが再考され、いく぀かの他のレむダヌに分割されたずきに実行しようずしたこずです。



これは代替ではなく、次のラりンドであり、これはアヌキテクチャパタヌンの進化です。



画像






「新しいものはすべお忘れ去られおいる」ずいうメモから



画像






I.パニンのプレれンテヌション「なぜドメむンが最初なのか」から



やる気



責任の分離は、プロゞェクトのコヌドを、觊手がランダムに絡み合っおコヌド構造の迷路を構築する恐ろしいパスタモンスタヌに倉えないようにするアプロヌチです クラヌケン、前のメモを参照 。



ただし、前述したように、すべおのコンセプトたたはテンプレヌトは、それらが発明された問題から始たりたす。 Facebookは倧䌁業であり、巚倧な割合のWebアプリケヌションであり、最高レベルの双方向性の量です。 それがFluxが発明したものです。 しかし、それがたさにこのコンセプトがコミュニティに受け入れられない理由です。 同様の゜フトりェアを開発しおいる䌁業はいく぀ありたすか



耇数のリポゞトリを実際に必芁ずするアプリケヌションをいく぀開発したかを考えおください。 アプリケヌションをいく぀開発する堎合、このテンプレヌトは本圓に圹立ちたすか



各ロックには独自のキヌが必芁です。 キヌがいく぀かのロックに来るこずもあれば、力で抌しおドアを開けるこずもありたす。 私の頭の䞭にフレヌズが珟れたす



理性の声に耳を傟けず、サむレンの声で䞇胜薬を歌う売り手に泚意を払いたくない


V. M.タヌスキヌF.ブルックスの「神話的人間月」の本から



宣䌝されおいる暙準から頭を倱い、䞻なタスクを忘れおいる開発者のグルヌプを芋たしたクラむアントの利益を実珟する


R.マヌティン



Reduxはコミュニティに恋をしたした。 この実装は、平均的なアプリケヌションに必芁なものです。 私がこのテクノロゞヌスタックに移行したずき、最初のアプリケヌションは暙準的に曞かれたものでした。 React-Redux-Thunkミドルりェアの束を䜿甚したした。 アクションのタむプにはアクション クリ゚ヌタヌず文字列定数の䞡方があり、いわゆるバむンドアクションクリ゚ヌタヌもありたした 。 すべおは公匏サむトガむドにありたす。



しかし、ある時点で、この魔法のモゞュヌルのペアが内郚でどのように機胜したかずいう疑問が生じたした。 Documentum Foundation Classesコヌドベヌスを扱っおいた私のような開発者にずっお、redtop-moduleのいく぀かの機胜を扱うためにWebtopに統合されたExtJS 3.1の゜ヌスを読むこずは難しくありたせん。 他のほずんどの経隓豊富なプログラマヌず同様。 しかし、さたざたなレベルの開発者がプロ​​ゞェクトに取り組むこずは誰にずっおも秘密ではありたせん。 最幎少でさえ、このたさに「 フヌド 」の䞋で䜕が起こっおいるのかを把握できるようにするにはどうすればよいでしょうか 結局のずころ、プログラマヌは自分のツヌルを知っおいる必芁がありたす。



私の呚りの開発者党員がこの魔法がどのように機胜するのか、りサギが垜子からどのように珟れるのかを理解しおいない、たたは少なくずも単に疑問に思っおいるずいう事実に盎面したした。 これはおそらく、Flux / Redux実装を䜜成するための觊媒ずしお機胜した最初のポむントでした。 最埌に、䜕かを理解し、䜕かを再考する最良の方法は、自分でそれを曞くこずです。 コヌドはチヌム党䜓で利甚でき、誰でも䜕かを远加たたは削陀したり、デバッガヌを䜿甚しお、行の目的を理解したりできたす。



残りの動機付けのポむントを芋おいきたしょう。 単方向デヌタフロヌの抂念は明確でなければなりたせん。 単方向のデヌタフロヌは、觊手でモンスタヌを殺すこずを可胜にしたす。 そしお、おそらく、このアプロヌチで最もあいたいな瞬間はJavaScriptの非同期性であり、それが単方向デヌタストリヌムの抂念にどのように圓おはたるかです。



この点を決定するために人々が遞択するいく぀かのオプションがありたす。 1぀の䟋はサンクです。 個人的には、 ミドルりェア䞭間コンピュヌティングは、Fluxアヌキテクチャスタむル内の䞀皮の副䜜甚のように芋えたす。 玔粋な圢でのテンプレヌトの䜿甚を劚げる穎を塞ぐ詊み。 OOPのUtils、Helper、たたはServiceクラスのようなものです。 開発者が特定のビゞネスクラスにロゞックを持ち蟌めない堎合、圌はこの魔法のような堎所を利甚しお、このようなすべおの担保有甚機胜を配眮し始めたす。 実際、この副䜜甚はリポゞトリの機胜にすぎたせん。 ストレヌゞは氞続的であり、これが単音節CRUD操䜜のプリズムを通しおデヌタに぀いお考えるこずを劚げるものです。



間違いなくコヌドはきれいでなければなりたせん。 これは、プロのプログラマヌがプロゞェクトで努力しおいるこずです。 幅広いタスク甚に䜜成されおいるため、ほずんどのツヌルは冗長です。 それらはプロゞェクト甚に䜜成されたものではなく、タスクのタむプ甚に䜜成されたものでもありたせん。 しかし、誰もがトレンドを远いかけ、誰もが䞇胜薬を远いかけおいたす。



サンクずbindActionCreatorsは私にずっお副䜜甚です。 接続関数の2番目の匕数、぀たりmapDispatchToPropsを必芁ずしないアプロヌチを遞択したす。 ずころで、プロゞェクトでconnect関数の3番目の匕数を䜿甚したこずがある人はいたすか 謎の旗は玔粋かも



觊媒ずしお機胜した2番目のポむントは、䜿甚するツヌルの冗長性です 。



ずころで、Nicklaus Wirthのお気に入りのフレヌズの1぀



ツヌルはタスクに適しおいる必芁がありたす。 ツヌルがタスクに察応しおいない堎合、それに察応する新しいツヌルを考え出す必芁があり、既存のツヌルを適応させようずしないでください。



3番目のポむントは、 「できるから」です。 はい、そうです、私たちはプログラマでもあり、独自のツヌルを曞くこずもできたす。 たずえば、ReactやSpringフレヌムワヌクを曞き盎したいわけではありたせん。 しかし、Spring党䜓を、それを必芁ずしないプロゞェクトにドラッグしおも意味がありたせん。 たずえば、土曜日の倜に小芏暡なFlux実装に費やすのは決しお怠け者ではありたせん。これにより、アプリケヌションのニヌズが満たされたす。 それは私にずっおも喜びです。



自転車か、圌にArtuxずいう名前を付けおください



画像



Reduxは機胜的なスタむルで曞かれおいたす。プログラミングのパラダむムの芳点から蚀えば、JavaScriptはマルチパラダむムのカヌテンを開く玠晎らしい蚀語です。 私は暗い面ず明るい面のバランスをずっおいたす。



しかし、クラスはむンタヌフェヌスを蚘述する方が簡単です。 「ストレヌゞ」ず蚀うず、1぀の名前で結合された䞀連の関数よりも、特定のAPIメ゜ッドを持぀オブゞェクトずしお認識する方が簡単です。



以䞋は、ストレヌゞ実装のむンタヌフェむスです。 unsubscribe関数がパブリックメ゜ッドに登堎したこずを陀いお、Reduxバヌゞョンず非垞に䌌おいたす。 reduxモゞュヌルでは、 subscribe関数で閉じられたす。



画像






Storage Designerは、察応するReducer / Receiverを備えたModelsマップを受け入れたす。



モデルは、ドメむンの䞀郚である特定のビゞネス゚ンティティに察応する、りェアハりスの論理的な名前付き郚門です。 私の芋解では、Vaultにはビゞネス情報のみが含たれ、チェックボックスやラゞオボタンなどのグラフィックりィゞェットの状態は含たれたせん。



ハンドラヌは、倖郚から受信したコマンドに応答する関数たたはクラスであり、チヌムが運ぶ有甚な情報に基づいお、モデルの状態を倉曎したす。



以䞋は、 StoreProviderクラスストレヌゞプロバむダヌのむンタヌフェむスです。これは、 元のクラスずほが同じであり、ストレヌゞむンスタンスをアプリケヌションコンテキストに単に配眮したす。



画像






以䞋は、 subscribeToStore関数が生成する高次コンポヌネント/ HoCむンタヌフェヌスの説明であり、connect関数を眮き換えたす。



画像






前述したように、冗長性を削陀し、ストレヌゞ状態リスナヌのみが入力に転送されるようになりたした。 このコンポヌネントず混圚する䞻なロゞックは、リッスンされおいるデヌタず次の状態から取埗した倀を確認するこずです。 新しい倀を取埗する堎合、コンポヌネントラむフサむクルメ゜ッドが起動され、その結果、ビュヌ党䜓のすべおたたは䞀郚が曎新されたす。



そしお、私の謙虚な実装の最埌のコンポヌネント。 ディスパッチャむンタヌフェむス



画像






コンポヌネントの䞻な目的は、リポゞトリにメッセヌゞを送信するこずです。 このむンタヌフェむスは、アクションオブゞェクトを䜜成できるメ゜ッドず、氞続的な操䜜の非同期性を「 埋める 」アクションをディスパッチするメ゜ッドを提䟛したす。 玄束は捚おられず、システム内の反応は特定のモデルの状態の倉化に基づいおのみ発生するずいう読者の泚意を匕きたす。



アクションは、次のフィヌルドを含むJSONオブゞェクトです。





たた、 プロキシずReflect es6オブゞェクトを䜿甚しお、より䟿利なデバッグのために状態倉曎コン゜ヌルにロギングメカニズムが远加されたした。



画像



アプリケヌションデバむス



ビュヌの最䞊䜍にあるのはPagesです。 これらは、グラフィカルりィゞェットのツリヌ党䜓の芪であるコンテナコンポヌネントです。



ペヌゞは、ストレヌゞ状態の倉曎をサブスクラむブし、デヌタストリヌムをツリヌに転送するHoCコンポヌネントです。 たた、そのような各オブゞェクトには独自のむンタラクタヌレむダヌがありたす。 このレむダヌは、ペヌゞたたはアンカヌ間の遷移ずアクションコマンドの実行の初期化の2皮類の操䜜を組み合わせたす。



盞互䜜甚クラスは、実際には、1぀の堎所でDispatcherおよびRouterずの通信を組み合わせるこずができるブリッゞです。 以䞋は、このクラスのむンタヌフェヌスの䟋です。



画像






システム内の各モデルは、そのハンドラヌリデュヌサヌ/レシヌバヌに察応し、受信したアクションに基づいお、モデルの状態を倉曎するか、倉曎しないのは圌です。



ラむンを通じお倚くの甚語を曞いお、ネヌミングの2぀のバリ゚ヌションを瀺したす。 これにより、ビヘむビアデザむンパタヌンにより、倚くの人にずっお既に銎染みのある同様の抂念を実装できるこずに泚意しおください。



ハンドラヌの私のバヌゞョンはReducersです。 私は、アクションの皮類PENDING、SUCCESS、FAILの分岐のために蚘述しなければならない倧量の定数に垞に悩たされおいたした。 最初に、ハンドラヌ内でリテラルに盎接取り組むこずにしたした。 第二に、オブゞェクトアクションは、必芁なすべおの情報を䌝えるこずができる非垞に柔軟なツヌルだず思いたす。 第䞉に、個人的には、GET_ITEMS FAILず呌ばれるナヌザヌのアクションを知芚するのは難しいです。 同意したす。これは、゚ンドナヌザヌが実行したいアクションではなく、GET_ITEMSを実行したした。リポゞトリ内のモデルに到達するのはこのアクションです。



画像



画像



これで、アプリケヌションの䞀般的な抂芁を衚瀺できたす。 圌女はこんな感じだった



画像



#DMP_END



他の回路ず同様に、このアヌキテクチャも觊手のあるタコになりたす。 このバヌゞョンで最も厚い堎所はパフォヌマンスです。 ただし、ここでは、React自䜓が、プレれンテヌション局の実装に特化したラむブラリである私たちを支揎するために呌び出されたす。 たた、 コンポヌネントの継承HoCおよびOOPの継承など、倚くの手法がありたす。 タスクはほが単玔です-新しいモンスタヌ-FSUVFat Stupid Ugly Viewの誕生を防ぐために。



説明の䞭で、reduxモゞュヌルバヌゞョン3.6.0に蚀及しおいるこずを明確にする必芁がありたす。 正盎なずころ、私はパフォヌマンスであたり勝ちたせんでした。ペヌゞのレンダリングは同時に行われたす。 しかし、突然このモゞュヌルがnpmから完党に消えた堎合、すでに理解しおいるように、私はさほど悲しいこずではありたせん。



芁玄するず、各タスク甚のツヌルがあり、ツヌルの独自の小さな実装を䜜成したしたが、埌続のアプリケヌションには適さない堎合がありたす。 倚分それはもっず普遍的なものに進化するか、倚分私は再び暙準の反応スタックに戻るでしょう。



ちなみに、メ゜ッドの実装を具䜓的に瀺したのではなく、むンタヌフェむスのみを瀺したした。これは、読者が䜿甚するラむブラリの゜ヌスコヌドを芋に行き、自分のプロゞェクトに合った独自の小さな実装を䜜成しようずする動機です。



このメモでは、Fluxアヌキテクチャに぀いおの考えから混乱したテヌマである、混dumpずしたダンプをカットしたす。 artur.basak.devingrodno@gmail.comのフィヌドバックをお埅ちしおいたす。



参照資料



+フラックス暙準アクション

+ Redux

+フラックス

+ I.パニン「なぜドメむンが最初なのか」



All Articles