Learning Functional Programming (03)

2014-09-15 /

データベースとテスト

副作用があるととてもテストしにくい

という問題。

別にFPに限らないんだけど、みんなこの問題をどう解決しているのだろう。

HaskellでDBからデータを読んでいろいろとやる、っていうだけでも、

  1. 例外の考慮
  2. リソース開放の考慮
  3. データを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みたいな書き方もあるようだけど、それは変換子的なアレだろうから、まずは手を出さない)

結果。

なんかそれっぽくは書けた。

DB.hs

(ごめんなさいねコードが渾沌で)

型が整合して一応まともに動いていそうな気配。

これは嬉しい。

ただ相変わらず抽象化の方法がこれであっているのか謎すぎる。

誰かボスケテ。