なんとかして関数型プログラミングをやりたいんですが、 慣れてないので苦戦中です。
とりあえず試行錯誤の記録を残しておきます。
目的
関数プログラミングをしたいモチベーションは、
- なるべく小さなまとまりに分け、テストをしやすくする。
- 処理の流れを宣言的に書いて見やすくする。
- システムのスケールアウトに対応する。
です。
http://qiita.com/kenokabe/items/a8477694a499ca869cde
言語と特徴
Scala
- サーバーサイド(WebAPIサーバー)の実装に使っている。
- DBサーバーへのアクセスを抽象化したい。
- valとdefの違い、implicit parameterの使いドコロが難しい
- 関数の結合とかしていきたい。
理想のイメージ
- DAO層はRDBでもCacheでも、非同期でも対応できるようにしたい。
- Logic部はテスタブル・粗結合な小さな関数を組み合わせたい。
- newとか書きたくない。状態を持ちたくない。
- ローカル変数もなるべく使わずメソッドチェーン的に書きたい。
Javascript
- WebAPIクライアントとして使っている。
- bacon.js lodash.jsを主に使う予定。
- 演算はサーバーに任せるのでもっぱらDOM操作系
- FRPに興味があるので試してみたい。
目指すカタチ
- イベント・DOMの管理は全てControllerで把握したい。
- FRPは興味あるけど、Angularでバインドしたデータの変更が追い切れなくなった経験があるので、データバインディング嫌い。
- そもそもModelっていう状態を持ちたくない。
- WebAPIをリッチに用意することで、クライアントはそもそもシンプルにしたい。
- 手続き型を卒業して全体の見通しを良くしたい。
困った例
bacon.jsのイベントストリームを使うと、パラメータが足りない。
事象
jQueryプラグインのオブジェクトに対してeventStreamを作っても、パラメータが一つしか取れない。
解決法
普通にイベントを貼り付けて、イベント発火時にイベントストリームを後から作ればいいや。
ScalaのDAO層のinterfaceをどうするか?
事象
DAO層はCacheサーバーの場合とRDBの場合とがあるが、session(RDBのtransaction・connection管理用)の使い回しとか返す型とかをどうしようか迷った。
解決策
そもそも、読み込みと書き込みで用途が違うことに気がついた。
KVS系の場合はそもそも書き込みしないので、読み込みはsessionを含めず、書き込みだけ含める仕様に変える。
そもそも書き込みだけ別オブジェクトにすべき。