2024.10.10
将来は卵1パックの価格が2倍に? 多くの日本人が知らない世界の新潮流、「動物福祉」とは
React/ReduxにSelectorを導入したら幸せになった話(全1記事)
リンクをコピー
記事をブックマーク
松井真子氏:ヤフーの松井です。よろしくお願いします。まず簡単に自己紹介させてください。松井真子です。ヤフーに2018年に新卒入社しまして、ショッピングに配属されてからReactとReduxを使ってキャンペーンページ向けの入稿ツールとフロントの開発をしていました。
去年の9月くらいからはPayPayモールのAndroidアプリの開発をしています。UXに興味があり、サービスデザインの勉強をしており、今PayPayモールのAndroidアプリとかを通して新規機能の提案でサービス、デザインのチャレンジをしています。
趣味は釣りですが、外出自粛ということで今年に入ってから一切釣りに行っていないので、あつまれどうぶつの森で毎日釣りをいっぱいしています。
今日はReactとその仲間たちということで、入稿ツールのときのお話をしようかなと思っています。まず入稿ツールってどんなものなのかっていう簡単なイメージをお話しすると、WordPressをイメージしていただいたらよいかなと思っています。簡単に言うと入力されたデータをもとにHTMLを自動で生成するシステムの入力部分になります。
具体的な例としては画像モジュールで説明するんですけど、入稿ツール側でaltタグであったりとか、画像のURLを入力していただいて、フロント部分のシステムで入力されたデータをもとにイメージタグのHTMLを生成します。指定のURLをユーザーがアクセスしてきたときにはこのような画像のイメージが見えるかたちになっています。
今日お話しするのは入稿ツールを開発するときに困ったことです。そもそも自分が1年目で配属されてすぐだったということと、エンジニアの先輩であるチームメンバーもあまり開発経験がない方で、2人で開発経験が乏しい中、周りに相談しながらがんばっていました。
その中で困ったこととして、コンポーネント間の依存関係がすごく複雑になってしまっていたということと、バリデーションの実装が複雑になっていたこと。あとデータ構造が複雑でネストが深くなっていました。
このデータ構造が複雑かつネストが深いっていうのが、入力フォームのバリデーションの実装のところが原因に関係していました。入力フォームだったりモジュールのバリデーション結果だったり、エラーメッセージを持たせていたので、データベースの中に保存するべきではないデータも持っていたっていうのが原因になります。
今日お話しするのは簡単なLTということで、バリデーションの実装のお話をします。コンポーネント間の依存関係が複雑になってしまったことは、一から作り直しまして、Atomic Designを導入したことによって依存関係が一方向になることによって解消されました。
ということでバリデーションの実装のお話をしていきます。
そもそもバリデーションが複雑になってしまった原因として大きく2つあって。1つ目がバリデーションのタイミングが難しかったということがありました。
タイミングとしてフォームが入力されるたびにバリデーションをかけたいということと、入稿ツールなのでデータベースからAPIで引っ張ってきていたデータも念のためバリデーションをかけたいということで、propsが変更されるタイミングでバリデーションをかけたいというのがありました。
実装方針としてActionやReducerの中ではロジックを持たせずにコンテナコンポーネントの中にロジックを閉じ込めるというような方針にしていたので、ライフサイクルメソッド、ComponentDidUpdateの中で実装をする必要がありました。
ComponentDidUpdateが外部メソッドを呼んでpropsに影響を与えるというようなことを許可していないので、バリデーションを切り出せず、同じようなバリデーションであってもひとつひとつのモジュールすべてで実装しないといけないかたちになってしまっていました。
もう1つの原因としてそもそもバリデーションが多いということがありました。入力フォーム単体であったり、複数の入力フォームを統括したり、複数のモジュールを統括してページ全体のバリデーションを持ったりという、バリデーションの種類が多いということ。
入稿ツールなのでどのモジュールが何個あるのかっていうのが固定ではなく、ビジネス要件も絡んでくるところなのですごく複雑です。バリデーションなのでしっかりしないといけないのですが、ひとつひとつに対してするってなるととても大変なことになっていました。
そんなときに助けてくれたのがselectorで、Reduxのreselectというライブラリを使いました。これを使うとどうなるかと言うと、stateからpropsに渡すときに間にメソッドを挟んで関心のある値を返せるようになります。
なので、ComponentDidUpdateの中に書いていたバリデーションを切り出して、そのメソッドの返り値をpropsとして渡せるようになります。それまでは各フォームのバリデーション結果をStoreの中にひとつひとつ持たせていましたが、それを持たせずに値を直接propsに渡せるようになりました。
これによってバリデーションをComponentDidUpdatから切り出せたので、関心のあるバリデーションごとにしっかり切り出せるようになりコードがすっきりしました。責務分けをしっかりできたことによってテストが書きやすく、品質が担保されるようになりました。
バリデーションをComponentDidUpdateに書いていたときは値の変更箇所っていうのが複数存在してしまっていたのですが、selectorを挟んだことによってしっかりとどこでどの値が変化したかっていうのが追いやすくなりました。
今日のまとめです。selectorの機能を使うと、余計なデータを保持しなくてよくなりました。バリデーションを切り出せたのでコードもすっきりしましたし、テストもしやすくなりました。
今回自分がこれを実装したときがHooksの採用前っていうのと、関数コンポーネントではなくクラスコンポーネントを実装する必要があるライブラリがあったのでreselectを使ったんですけど。Redux Hooksのほうにも同じような機能が存在していました。
ただReduxの公式でもUseselectorとreselectを両方使う例もあったので、用途に合わせて使い分けをしていただいたらよいかなと思っています。発表は以上になります。ありがとうございました。
関連タグ:
2024.11.13
週3日働いて年収2,000万稼ぐ元印刷屋のおじさん 好きなことだけして楽に稼ぐ3つのパターン
2024.11.11
自分の「本質的な才能」が見つかる一番簡単な質問 他者から「すごい」と思われても意外と気づかないのが才能
2024.11.13
“退職者が出た時の会社の対応”を従業員は見ている 離職防止策の前に見つめ直したい、部下との向き合い方
2024.11.12
自分の人生にプラスに働く「イライラ」は才能 自分の強みや才能につながる“良いイライラ”を見分けるポイント
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
2024.11.11
気づいたら借金、倒産して身ぐるみを剥がされる経営者 起業に「立派な動機」を求められる恐ろしさ
2024.11.11
「退職代行」を使われた管理職の本音と葛藤 メディアで話題、利用者が右肩上がり…企業が置かれている現状とは
2024.11.18
20名の会社でGoogleの採用を真似するのはもったいない 人手不足の時代における「脱能力主義」のヒント
2024.11.12
先週まで元気だったのに、突然辞める「びっくり退職」 退職代行サービスの影響も?上司と部下の“すれ違い”が起きる原因
2024.11.14
よってたかってハイリスクのビジネスモデルに仕立て上げるステークホルダー 「社会的理由」が求められる時代の起業戦略
2024.11.13
週3日働いて年収2,000万稼ぐ元印刷屋のおじさん 好きなことだけして楽に稼ぐ3つのパターン
2024.11.11
自分の「本質的な才能」が見つかる一番簡単な質問 他者から「すごい」と思われても意外と気づかないのが才能
2024.11.13
“退職者が出た時の会社の対応”を従業員は見ている 離職防止策の前に見つめ直したい、部下との向き合い方
2024.11.12
自分の人生にプラスに働く「イライラ」は才能 自分の強みや才能につながる“良いイライラ”を見分けるポイント
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
2024.11.11
気づいたら借金、倒産して身ぐるみを剥がされる経営者 起業に「立派な動機」を求められる恐ろしさ
2024.11.11
「退職代行」を使われた管理職の本音と葛藤 メディアで話題、利用者が右肩上がり…企業が置かれている現状とは
2024.11.18
20名の会社でGoogleの採用を真似するのはもったいない 人手不足の時代における「脱能力主義」のヒント
2024.11.12
先週まで元気だったのに、突然辞める「びっくり退職」 退職代行サービスの影響も?上司と部下の“すれ違い”が起きる原因
2024.11.14
よってたかってハイリスクのビジネスモデルに仕立て上げるステークホルダー 「社会的理由」が求められる時代の起業戦略