関連サイト
本書の関連ページが用意されています。
内容紹介
JavaScript関数型へスキルアップ。
もう1つのパラダイムへ転換可能に!
関数型思考を新たに身につけるのは一筋縄ではいきません。本書では、この関数型思考の実践を第1の目標にしています。関数型のメリットに触れながら、ECMAScript 2015(ECMAScript 6)をベースに、再利用性を高める実践テクニックを網羅的かつ段階的に解説していきます。また、より現場指向のテクニックとして、テストや最適化の手法、非同期処理を扱う手法についても説明します。一般的なテクニックに飽き足らず、より上位レベルの技術の習得を目指すJavaScriptプログラマーに格好の一冊です。
――原著への読者の声
「関数型手法を考える人におすすめの本」
「良書。ただし、ビギナー向けではない」
「関数合成とモナドの章は愛すべき内容」
※ 本書は『Functional Programming in JavaScript』の翻訳書です。
■章構成
◆Part1 発想の転換とキーコンセプト
◇第1章 関数型で思考する
◇第2章 関数型言語としてのJavaScript
◆Part2 関数型のデザインとコーディング
◇第3章 データ構造の数を減らし、操作の数を増やす
◇第4章 モジュラー化によるコードの再利用
◇第5章 複雑性を抑えるデザインパターン
◆Part3 関数型のスキルを磨く
◇第6章 関数型コードのテスト
◇第7章 関数型コードの最適化
◇第8章 非同期イベント/データのための関数型
書誌情報
- 著者: Luis Atencio(著), 株式会社イディオマコムニカ 加藤 大雄(訳)
- 発行日: 2017-06-09 (紙書籍版発行日: 2017-06-09)
- 最終更新日: 2017-06-09
- バージョン: 1.0.0
- ページ数: 336ページ(PDF版換算)
- 対応フォーマット: EPUB
- 出版社: インプレス
対象読者
JavaScriptとオブジェクト指向について理解しているプログラマー
著者について
Luis Atencio
仮想化ソフトウェアベンダーのシトリックスシステムズに所属するソフトウェア開発エンジニア。コンピュータサイエンス分野で学士号と修士号を取得。現在はJavaScript、Java、PHPのアプリケーション開発/設計にフルタイムで従事。技術コミュニティに積極的に参加、ローカルのイベントではプレゼン発表も行う。ソフトウェアエンジニアリングについてのブログ(luisatencio.net)を公開。Twitterアカウントは@luijar。
株式会社イディオマコムニカ 加藤 大雄
株式会社イディオマコムニカ所属、ITエンジニア。大学で機械工学を専攻するも、IT業界に飛び込んで以来、ITエンジニア一筋。技術者として設計開発・運用保守だけでなく、製品開発、QA、保守の技術部長も経験。日英/英日の技術翻訳、特許翻訳も行う。Valente翻訳スクールにてITコースの講師を担当。IT技術で世の中の役に立てるよう自己研鑽の日々を送る。モットーは「生涯一エンジニア」。仕事上で好きなことは、他人のコードを読むこと、新しい言語や概念を理解すること。趣味は、海外ドラマ鑑賞、語学(仏語など)、登山、旅行、食べ歩き。http://idioma-comunica.jp/
目次
序文
本書について
謝辞
Part 1▶発想の転換とキーコンセプト
第1章 関数型で思考する
- 1.1 関数型プログラミングを学ぶと役に立つのか?
- 1.2 関数型プログラミングとは何か
- 1.2.1 関数型プログラミングは宣言型である
- 1.2.2 純粋関数と副作用問題
- 1.2.3 参照透過性と代替性
- 1.2.4 データの不変性を維持
- 1.3 関数型プログラミングの利点
- 1.3.1 タスクをシンプルな関数に分解する
- 1.3.2 円滑なチェーンを使ってデータ処理
- 1.3.3 非同期アプリケーションの複雑性に対処する
- 1.4 まとめ
第2章 関数型言語としてのJavaScript
- 2.1 なぜJavaScriptなのか
- 2.2 関数型プログラミングvs.オブジェクト指向プログラミング
- 2.2.1 JavaScriptオブジェクトの状態管理
- 2.2.2 オブジェクトを値として扱う
- 2.2.3 可動部分をディープフリーズ(再帰的にフリーズ)
- 2.2.4 レンズを使ってオブジェクトグラフを操作
- 2.3 関数
- 2.3.1 第一級オブジェクトとしての関数
- 2.3.2 高階関数
- 2.3.3 関数呼び出しの方法
- 2.3.4 関数メソッド
- 2.4 クロージャとスコープ
- 2.4.1 グローバルスコープの問題
- 2.4.2 JavaScriptの関数スコープ
- 2.4.3 擬似的なブロックスコープ
- 2.4.4 クロージャの実践的な利用方法
- 2.5 まとめ
Part 2 ▶関数型のデザインとコーディング
第3章 データ構造の数を減らし、操作の数を増やす
- 3.1 アプリケーションの制御フローを理解する
- 3.2 メソッドチェーン
- 3.3 関数チェーン
- 3.3.1 ラムダ式を理解する
- 3.3.2 データを_.mapを使って変換する
- 3.3.3 _.reduceを使って結果を集める
- 3.3.4 _.filterを使って不要な要素を除去する
- 3.4 コードを把握する
- 3.4.1 宣言型および遅延関数チェーン
- 3.4.2 SQLライクなデータ:関数としてのデータ
- 3.5 再帰的に考えることを学ぶ
- 3.5.1 再帰とは何か
- 3.5.2 再帰的に考えるということ
- 3.5.3 再帰的に定義されるデータ構造
- 3.6 まとめ
第4章 モジュール化によるコードの再利用
- 4.1 メソッドチェーンと関数パイプライン
- 4.1.1 メソッドをまとめてチェーンにする
- 4.1.2 関数をパイプライン状に配置する
- 4.2 互換性のある関数のための要件
- 4.2.1 型互換の関数
- 4.2.2 関数とアリティ:タプルの場合
- 4.3 カリー化された関数評価
- 4.3.1 関数ファクトリをエミュレートする
- 4.3.2 再利用可能な関数テンプレートを実装する
- 4.4 部分適用とパラメータ束縛
- 4.4.1 コア言語を拡張する
- 4.4.2 遅延関数に束縛する
- 4.5 関数パイプラインを合成する
- 4.5.1 HTMLウィジェットとの合成を理解する
- 4.5.2 関数合成:記述を評価から分離する
- 4.5.3 関数ライブラリによる合成
- 4.5.4 純粋なコードと不純なコードを取り扱う
- 4.5.5 ポイントフリープログラミングの紹介
- 4.6 関数コンビネータを使ってフロー制御を管理する
- 4.6.1 identity(Iコンビネータ)
- 4.6.2 tap(Kコンビネータ)
- 4.6.3 alternation(ORコンビネータ)
- 4.6.4 sequence(Sコンビネータ)
- 4.6.5 fork(join)コンビネータ
- 4.7 まとめ
第5章 複雑性を抑えるデザインパターン
- 5.1 命令型エラー処理の欠点
- 5.1.1 try-catchによるエラー処理
- 5.1.2 関数型プログラムで例外を投げない理由
- 5.1.3 nullチェックの問題
- 5.2 より優れたソリューション:ファンクター
- 5.2.1 安全ではない値のラッピング
- 5.2.2 ファンクターの詳細
- 5.3 モナドを使った関数型エラー処理
- 5.3.1 モナド:制御フローからデータフローへ
- 5.3.2 MaybeモナドとEitherモナドによるエラー処理
- 5.3.3 IOモナドを使用して外部リソースとやり取りする
- 5.4 モナドチェーンと合成
- 5.5 まとめ
Part 3▶関数型のスキルを磨く
第6章 関数型コードのテスト
- 6.1 ユニットテストへの関数型プログラミングの影響
- 6.2 命令型プログラムのテストにおける課題
- 6.2.1 単純なタスクを特定して分解することの困難さ
- 6.2.2 共有リソースへの依存は不一致な結果をもたらす
- 6.2.3 あらかじめ定義された実行の順序
- 6.3 関数型コードをテストする
- 6.3.1 関数をブラックボックスとして扱う
- 6.3.2 制御フローではなくビジネスロジックに注目する
- 6.3.3 モナドの分離を用いて純粋なコードを不純なコードから分離する
- 6.3.4 外部依存性をモックする
- 6.4 プロパティベースのテストを利用して仕様を把握する
- 6.5 コードカバレッジにより有効性を測定する
- 6.5.1 関数型コードのテストに関する有効性を測定する
- 6.5.2 関数型コードの複雑度を測定する
- 6.6 まとめ
第7章 関数型コードの最適化
- 7.1 関数実行の中身を調べる
- 7.1.1 カリー化と関数コンテキストスタック
- 7.1.2 再帰コードの問題点
- 7.2 遅延評価を使用して実行を遅らせる
- 7.2.1 alternation関数コンビネータ(OR)により不要な計算を避ける
- 7.2.2 ショートカットフュージョンを利用する
- 7.3 "必要に応じて呼び出す"戦略を実現する
- 7.3.1 メモ化を理解する
- 7.3.2 計算が集中する関数をメモ化する
- 7.3.3 カリー化とメモ化を利用する
- 7.3.4 メモ化を最大限に利用するために分解を行う
- 7.3.5 メモ化を再帰呼び出しに適用する
- 7.4 再帰と末尾呼び出し最適化(TCO)
- 7.4.1 非末尾呼び出しを末尾呼び出しに変換する
- 7.5 まとめ
第8章 非同期イベント/データのための関数型手法
- 8.1 非同期コードの課題8.1.1 関数間の時間的な依存関係
- 8.1.2 コールバックピラミッドに陥る
- 8.1.3 継続渡しスタイルを使う
- 8.2 Promiseによる第一級非同期処理
- 8.2.1 thenメソッドチェーン
- 8.2.2 同期処理と非同期処理の合成
- 8.3 遅延データ生成
- 8.3.1 ジェネレータと再帰
- 8.3.2 イテレータプロトコル
- 8.4 RxJSによる関数型プログラミングとリアクティブプログラミング
- 8.4.1 オブザーバブルなシークエンスとしてのデータ
- 8.4.2 関数型プログラミングとリアクティブプログラミング
- 8.4.3 RxJSとPromise
- 8.5 まとめ
付録A 本書で使用したJavaScriptライブラリ
- A.1 関数型JavaScriptライブラリ
- A.2 本書で使用したその他のライブラリ