勉強日記

チラ裏

JavaScript関数型プログラミング Ch.2 関数型言語としてのJavaScript

book.impress.co.jp

なぜJavaScriptなのか

関数型プログラミングvsオブジェクト指向プログラミング

  • ScalaやF#など...ハイブリッド言語
  • JSも似てる
  • OO-JS: プロトタイプベースの継承を行う
FP OOP
合成の単位 関数 オブジェクト・クラス
プログラミングスタイル 宣言型 命令型
データと振る舞い 純粋で独立した関数との緩い結合 クラス内でメソッドと強い結合
状態管理 不変 インスタンスメソッドで変更
フロー制御 関数と再帰 ループと条件分岐
スレッド安全性 並列プログラミング可能 困難
カプセル化 すべてが不変なので不要 データの整合性(invariant)を保つために必要
抽象化の中心 関数 オブジェクト

状態管理

  • 規律ベース
    • 言語仕様としては何でもできちゃう

オブジェクトを値として使う

  • 「値」...不変(immutable)なデータのことをいっている
  • const: エセimmutable
    • メンバはmutable
  • 本気でimmutableを実現したいなら...
    • 値オブジェクトパターン(Value Object)
      • クロージャでオブジェクトを返す
      • オブジェクトはgetterメソッド等のみをもつ
      • オブジェクトの内部表現はクロージャのスコープに
    • Object.freeze()

深いフリーズ

  • Object.freeze()はown propertyでなくても不変にしてくれる
  • が、浅いフリーズ
    • メンバをconstにするだけ
    • frozen.child.grandchild はmutable
  • 深いフリーズを実現するには、再帰する

レンズ

  • 関数参照、とも
  • 状態をもつデータ型の属性を不変的にアクセスし操作できる関数
  • Ramdaライブラリに搭載されている
    • const lens = R.lensProp('prop'); R.view(lens, obj)
      • getterと大して変わらない。obj.propが得られる
    • var obj2 = R.set(lens, 'hoge', obj)
      • obj2を新しく生成し、obj2.prop = 'hoge'が設定される。obj.propは不変
      • 不変セッター
  • copy-on-write (書き込み時コピー)のエレガントな実装法
  • 効能
    • mutableなオブジェクトのデータを保護するラッパ
    • メンバアクセスのロジックをオブジェクトから分離
      • 関数型の根本原理と相性が良い
    • this依存を取り除き、どのようなオブジェクトの内容でも参照し操作できる
      • thisは副作用の温床
      • 後半はよくわからない

関数

クロージャとスコープ

まとめ

比較的しょうもないので略