Learning Functional Programming (03)
2014-09-15 /
データベースとテスト
副作用があるととてもテストしにくい
という問題。
別にFPに限らないんだけど、みんなこの問題をどう解決しているのだろう。
HaskellでDBからデータを読んでいろいろとやる、っていうだけでも、
- 例外の考慮
- リソース開放の考慮
- データをSQLにバインド
など色々やらなくてはいけない。
テストは面倒だ。
....
なんか型の世界がよくわからなくなってきた。
Monadとの闘い
以前からPythonを使っていて、 この副作用の塊……テストする気なくす。
と思っていた。
なんとか副作用がまさしく発生するところと、Query操作の定義する箇所を分けられないかと考えていた。
トライしていたけどうまくいかなかった。
おそらくそれはMonadになるのだろうけれど……うすうすそう感じてはいた。
今回HaskellでDBアクセス部分を記述していた。
できるだけBoilerPlateを消去しようとした結果、やはりMonadと遭遇する。
おそるおそるQueryモナドの作成にチャレンジした次第。
newtype Query e = MkQuery { runQuery :: Connection -> IO e }
eは取得されるデータ型。
ConnectionはHDBCより渡されるDBコネクション。
IOモナドは多分なんだかんだで必要になるので織り込んでおく。 (m aみたいな書き方もあるようだけど、それは変換子的なアレだろうから、まずは手を出さない)
結果。
なんかそれっぽくは書けた。
(ごめんなさいねコードが渾沌で)
型が整合して一応まともに動いていそうな気配。
これは嬉しい。
ただ相変わらず抽象化の方法がこれであっているのか謎すぎる。
誰かボスケテ。