関数プログラミング試行錯誤

| Comments

なんとかして関数型プログラミングをやりたいんですが、 慣れてないので苦戦中です。

とりあえず試行錯誤の記録を残しておきます。

目的

関数プログラミングをしたいモチベーションは、

  • なるべく小さなまとまりに分け、テストをしやすくする。
  • 処理の流れを宣言的に書いて見やすくする。
  • システムのスケールアウトに対応する。

です。

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を含めず、書き込みだけ含める仕様に変える。

そもそも書き込みだけ別オブジェクトにすべき。

Comments