Rubyベストプラクティス 第5章 関数型プログラミングのテクニック その1
今日は第5章の前半です。
- 「Matz は機会均等を重んじる盗人であり」翻訳が難しそう
- Ruby は関数型言語じゃないしいくつか重要な特徴が抜けているけど、関数型プログラミングのテクニックを参考にしたプラクティスがあるよ、という話
- 遅延評価
- lambda で包む
- アクセッサで必要になった時に計算するのも遅延評価といえる
- ついでに Memo 化(キャッシュ)も
- というのをやってくれる lazy.rb
- promise でプロキシオブジェクト(Promise)を返す
- こういうのって Class#=== での判定とかがうまく動かない(ので case 文でクラスを分岐するのがうまくいかなくなる)のであんまり使いたくないんですよね……
- 副作用のない(少ない)コードを書く
- しかしパフォーマンスとの兼ね合いになるので注意が必要(再帰が最適化されない、オブジェクトをたくさん作ると遅いなど)
- モジュール関数を使っていわゆるモジュール管理する
- メモ化
- well-defined な関数(引数に対して値が一意に決まる)は返り値をキャッシュしておくことで繰り返し呼び出された時に再計算が不要になる
- Hash.new にブロック(デフォルト値を計算する)を渡す方法はメモ化に適している
- Memoizable モジュールで自動化できる
中途半端ですが、今年の朝の読書タイムは今日で終わりかもしれません。明日できたら第5章を終えられそうですが、明日は読めるかどうかわかりません。