SlideShare a Scribd company logo
メディア・マーケティングソリューションズグループ
マーケティングソリューションズカンパニー
プロモーション広告開発本部 マーケッターPF開発部
UIエンジニアリング
岡本 和昭
ReactとImmutable.jsで
関数型を体験して思ったこと
2016/09/14 SCRIPTY#6
ヤフー株式会社
ちょっと自己紹介
岡本 和昭
 主に広告管理ツールのフロントエンドを開発
 現在の業務はほぼ「React + Redux」
 Immutable.jsはまだ業務で導入していない
所属:ヤフー株式会社
職種:フロントエンドエンジニア
今回の目的
1. JavaScriptにおける関数型のポイントを知る
2. 関数型を後押しするImmutable.jsの概要を知る
3. ReactにImmutable.jsを導入した場合の
メリットを知る
こんなメリットもあるよ!とかのご意見を
ハッシュタグにどんどん投稿してください!
今日やらないこと
 関数型への深い知識、JS以外の関数型言語
( Lisp, Scala, Clojure ... )
 高階関数・カリー化・クロージャなどの
ワードについて
※JavaScriptで関数型が学べる本もあります
https://www.oreilly.co.jp/books/9784873116600/
JavaScriptにおける
関数型のポイントを知る
 関数 → データ → 関数 → データと処理する設計
 副作用がない(外の状態への依存や変更がない)
 呼び出し元に依存しない
 必ず新しい値を返す(重要)
JSを普通に書いてて、これらを守るのは困難
本日のための関数型のポイント
(関数型詳しい方、本当ざっくりですみません。)
簡単な例
 Good
 Bad
• 外部の変数に依存し、変更している
• 値を返却していない
参照透過性 (が保たれている) 状態とは
 先ほどの性質がが保証された関数のこと
 このような関数は、引数が同じであれば
結果は必ず同じになる
 関数の役割・責任・影響範囲が明確であり、
テストもしやすい
オブジェクト指向との比較
 オブジェクト指向はデータとそれに対する
操作をひとつにまとめ、クラスとして定義
 クラスのメソッドの責務や依存も様々
 JavaScriptはES6やTypeScriptにより、
オブジェクト志向色が強まった印象...
「オブジェクト指向 vs 関数型」戦争の勃発
JavaScriptでの関数型所感
 関数型用に設計された言語と比べると、
関数型を実装するのは難しそう
 関数型言語としての機能は備わっているが、
一方で破壊的変更も簡単に出来てしまう
関数型を後押ししてくれるライブラリの登場
関数型を後押しするライブラリ
 underscore(Backboneが依存)
 lodash(豊富なメソッド)
 Immutable(Facebook製・Reactが推奨)
関数型を後押しする
Immutable.jsの概要を知る
Immutable.js 概要
 Immutable = 不変
 関数型の考えに強くインスパイアされている
 コレクションへの変更は必ず新しいものを
返却し、元のコレクションは変更されない
 遅延評価をサポート( Seq )
(出力タイミングなど結果が必要な時に評価)
Immutable.js 入門
 List (配列に相当)
Immutable.js 入門
 Map(オブジェクトに相当)
Immutable.js 入門
 プレーンなJavaScriptだと、本来は同じ結果
 Immutableで作成したオブジェクトは
不変であり、更新時は必ず新しいものを返す
 オブジェクトや配列に必要な
操作はひととおり揃っている
 fromJS(), toJS()を利用すればプレーンな
JSオブジェクトとの切り替えも可能
ReactにImmutable.jsを
導入した場合のメリットを知る
パフォーマンス改善での活用
パフォーマンス改善での活用
 Reactでのパフォーマンス改善と言えば、
shouldComponentUpdate
 propsとstateの変更の際に、
再描画判定の実行可否を決定
 下記のような単純な構造の比較は容易
参考) https://facebook.github.io/react/docs/advanced-performance-ja-JP.html
ネストした場合の対処法
 先ほどのvalueの構造がネストすると、
中身の値を含めたディープな比較が出来ない
 キーを指定すれば良いが、変更時の修正など
メンテが必要になり、バグの温床になる
Immutable.jsを活用した解決法
 ネストしたデータはプレーンな
オブジェクトでなく、Map()やList()で定義
 これで正しい判定が可能 ( is()を使って比較 )
注意点
 MapやList内で更にネストした場合、
それらもMapやListにしないとshallow(浅い)
な比較になってしまい正しく判定できない
 APIから階層の深いJSONをまるごともらって
Storeなどに突っ込む場合はfromJS()を
使った方が楽そう
参考)
https://github.com/facebook/immutable-js/wiki/
Converting-from-JS-objects#converting-nested-data
ネストされたデータの
安全な操作
ネストされたデータの操作が便利
 Reactとは直接関係ないが、jsで存在しない
キーの中身を参照しようとするとエラーになる
 ImmutableのsetIn(), getIn()は深い階層の
データ変更や参照を安全に行える
 変更後は必ず新しいデータを返却する
ネストされたデータへの操作例
こんな時に便利
 キーの存在チェックをするコードが不要
 Stateなどのオブジェクトの部分変更時に
Object.assignなどを利用したマージが不要
→ この後詳しく
StateやStoreオブジェクトの
操作が便利
Stateの操作が便利
 stateはsetStateでキーを指定して更新する
 stateの中身がネストした場合、更新時には
マージする冗長なコードが増えがちになる
 下記のようなStateの場合を考えてみる
従来のStateの操作
 キーを指定し、新しいStateを設定するので
下記のような現状維持部分とマージする
コードが必要になる
Immutable.jsを利用した場合
参考) https://github.com/facebook/immutable-js/wiki/Immutable-as-React-state
 Immutableは操作の結果が必ず新しい状態を
返すので、直感的なコードになる
(階層が深い場合は先ほどのsetIn()でもOK)
 ReduxなどのStoreオブジェクトの操作も
同様にシンプルになる
Reduxでの
Record()を利用した
モデルの導入
Reduxでのモデルの導入
 Reduxを導入した際に、ロジックが
Action, Store, Component のどこかに入り
肥大化するのを解決できる
 Immutable.Record() でデータのモデル、
それを継承したクラスでデータを操作する
メソッドを定義するとロジックを押しこむ
事が可能になり、肥大化が防げそう
モデルを利用しない場合
todoリスト
Store操作
の例
(Reducer)
編集開始
変更保存
モデルを利用しない場合
 データのインデックスを参照し、
対象データを変更する冗長なコードが増える
 このようなコードをReducer、Actionなど
どこかが必ず持つ運命になっていた
モデルを利用する場合 (モデル本体)
 todo自身の状態を
変更する操作は
モデル側で定義
 右のedit() と save()
の操作の変更の
結果をそのまま同じ
actionに渡せる(後述)
編集開始
変更保存
モデルを利用する場合 (アクション)
 下記の2つのアクションは、変更操作を
前ページのモデル側の別々のメソッドで行い、
その結果を同じアクションに渡している
※実際にはイベントハンドラ経由でこれらのコードが呼ばれる
編集開始
変更保存
モデルを利用する場合 (Reducer)
 モデル側にロジックを移動したので、
アクションが統合されReducerの記述が簡潔に
 削除など配列本体への操作も、Immutableの
おかげで簡潔に(下記の操作はクラス側では行えない)
※前ページのchangeTodoアクションを受け取るReducerのコード例
モデルの利用
 モデルの利用については下記の記事が
参考になりました
React使い必見! Immutable.jsでReactはもっと良くなる
https://www.wantedly.com/companies/wantedly/post_articles/28935
How to use Immutable.js Records with React and Redux
https://medium.com/azendoo-team/immutable-record-react-redux-99f389ed676
React + Immutableの所感
 関数型のメリットをうまく活かして、
コードの量や見通しを改善できそう
 途中から全て書き換えるのはコストが
大きそうなので、早いうちに導入すべき
 部分的にImmutableにしてしまうと
プレーンなjsとの区別がつきにくそう
(混在する場合は何か工夫が必要そう)
Thank You !
ご静聴ありがとうございました
こんな他、こんなメリットもあるよ!
などありましたら是非共有お願いします!

More Related Content

PDF
テスト文字列に「うんこ」と入れるな
PDF
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
PDF
開発速度が速い #とは(LayerX社内資料)
PDF
ドメイン駆動設計 ( DDD ) をやってみよう
ODP
Guide To AGPL
PDF
信頼性とアジリティを同時に上げろ!モノタロウのカナリアリリース導入.pdf
PPT
メタプログラミングって何だろう
PDF
グラフモデルとSoEとGraphQL データ指向アプリケーションデザインから見るGraphQL
テスト文字列に「うんこ」と入れるな
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
開発速度が速い #とは(LayerX社内資料)
ドメイン駆動設計 ( DDD ) をやってみよう
Guide To AGPL
信頼性とアジリティを同時に上げろ!モノタロウのカナリアリリース導入.pdf
メタプログラミングって何だろう
グラフモデルとSoEとGraphQL データ指向アプリケーションデザインから見るGraphQL

What's hot (20)

PDF
ドメイン駆動設計 失敗したことと成功したこと
PDF
Unityでオニオンアーキテクチャ
PPTX
世界一わかりやすいClean Architecture
PPT
ドメインロジックの実装方法とドメイン駆動設計
PDF
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
PDF
MagicOnion入門
PDF
【Unity道場】物理シミュレーション完全マスター
PDF
ソーシャルゲームのためのデータベース設計
PDF
例外設計における大罪
PDF
ドメイン駆動設計の捉え方 20150718
PDF
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
PDF
「UXデザインとは」からはじめる「本流」のUXデザインはじめの一歩 | UXデザイン基礎セミナー 第1回
PDF
解説!30分で分かるLEAN ANALYTICS
PDF
オンラインゲームの仕組みと工夫
PDF
実践イカパケット解析α
PPTX
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
PDF
ネットワーク ゲームにおけるTCPとUDPの使い分け
PPTX
WayOfNoTrouble.pptx
PDF
オブジェクト指向できていますか?
PDF
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計 失敗したことと成功したこと
Unityでオニオンアーキテクチャ
世界一わかりやすいClean Architecture
ドメインロジックの実装方法とドメイン駆動設計
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
MagicOnion入門
【Unity道場】物理シミュレーション完全マスター
ソーシャルゲームのためのデータベース設計
例外設計における大罪
ドメイン駆動設計の捉え方 20150718
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
「UXデザインとは」からはじめる「本流」のUXデザインはじめの一歩 | UXデザイン基礎セミナー 第1回
解説!30分で分かるLEAN ANALYTICS
オンラインゲームの仕組みと工夫
実践イカパケット解析α
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
ネットワーク ゲームにおけるTCPとUDPの使い分け
WayOfNoTrouble.pptx
オブジェクト指向できていますか?
ドメイン駆動設計のための Spring の上手な使い方
Ad

More from Yahoo!デベロッパーネットワーク (20)

PDF
ゼロから始める転移学習
PDF
継続的なモデルモニタリングを実現するKubernetes Operator
PDF
ヤフーでは開発迅速性と品質のバランスをどう取ってるか
PDF
オンプレML基盤on Kubernetes パネルディスカッション
PDF
オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜
PDF
Persistent-memory-native Database High-availability Feature
PDF
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
PDF
eコマースと実店舗の相互利益を目指したデザイン #yjtc
PDF
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
PDF
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
PDF
ビッグデータから人々のムードを捉える #yjtc
PDF
サイエンス領域におけるMLOpsの取り組み #yjtc
PDF
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
PDF
Yahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtc
PDF
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
PDF
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
PDF
モブデザインによる多職種チームのコミュニケーション改善 #yjtc
PDF
「新しいおうち探し」のためのAIアシスト検索 #yjtc
PDF
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc
ゼロから始める転移学習
継続的なモデルモニタリングを実現するKubernetes Operator
ヤフーでは開発迅速性と品質のバランスをどう取ってるか
オンプレML基盤on Kubernetes パネルディスカッション
オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜
Persistent-memory-native Database High-availability Feature
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
eコマースと実店舗の相互利益を目指したデザイン #yjtc
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
ビッグデータから人々のムードを捉える #yjtc
サイエンス領域におけるMLOpsの取り組み #yjtc
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
Yahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtc
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
モブデザインによる多職種チームのコミュニケーション改善 #yjtc
「新しいおうち探し」のためのAIアシスト検索 #yjtc
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc
Ad

ReactとImmutable.jsで関数型を体験してみて思ったこと #scripty06