くりーむわーかー

プログラムとか。作ってて ・試しててハマった事など。誰かのお役に立てば幸いかと。 その他、いろいろエトセトラ。。。

トランザクション

MVCでトランザクションをどこに持たせるか

今更MVCの話。

結局MVCって役割の分離って事じゃないですか。

WebアプリでMVC(厳密に言うと原書のMVCではないけども)っぽく作る場合。

色んなサンプルを見てるとMVCのCにトランザクションのBeginとEndがあったりする。

システムのアーキテクチャ上、コントローラでトランザクション制御するっていうモノももちろんあると思うけど、

それしかないのもどうかなと思うのと、微妙な気がしてるので少し書いておく。

まず、Contorlerとは何をするべきなのかって事。

Webアプリだと、ココはやっぱり何のビジネスロジックを呼び出すかっていう部分と、

認証周りの処理、セッション周りの処理、あとはリクエストの内容を解析して、

ビジネスロジックに渡すイベントオブジェクト的なものを作る処理辺りだと思うのです。

で、良くあるトランザクションの処理で言われてるところが、

AっていうDBを更新する処理があって、その後にBっていう他のデータを更新する処理があって、

その2つの処理を関連付けて一つのトランザクションとして扱いたい

みたいなものがある。

その制御をするためにはモデルを呼ぶコントローラでやらなきゃ!

って感じなのかな~と。

そこに違和感を感じるわけです。

処理を関連付けるとか処理する順番に依存してるとかとか。

それに意味があるなら、それはビジネスロジックだよね?

という事でトランザクションの制御はコントローラではやらない方がいいと思うのです。

Contorlerに入れた時点で、HTTPのリクエスト渡さないと他から使えないじゃない?

モデル側でファサード的なクラスを用意しておけばいいように思うわけです。

MVCってModelViewContorlerに分ける「方向性」で組むと思うんですが、

分割の仕方は3つである必要はないと思うんですよ。

大事なのは役割の分割であって、3つという数に意味はないように思うのです。

なので、Controlerに持たせるのは何か微妙に思う。

あと、結構致命的だと思ってるのは、テスト書き辛くない?

Webアプリのコントローラって認証とセッションにほぼ結合してると思うので、

その辺の調整をテストコード側でやらないと呼ぶの無理じゃん?

テスト書きヅラ!!みたいな。

という事で、MVCを元に構成したWebアプリでトランザクション処理する時は

コントローラでやるべきではないと思うのでした。。。

R アソシエーション分析用のデータを作るあれこれ

すぐ忘れるのでひとまずメモ。

データ分析にアソシエーション分析(バスケット分析)っていうのがある。Rを使ってやるんですが、これをやるとき、元ネタデータの整形をどうするかいっつも忘れるので特筆。

基本的には↓感じのデータを使う想定。

1課	2課	3課	4課	5課	6課	7課	8課	9課
1	1	1	0	0	0	0	0	0
0	0	0	1	1	0	0	0	0
0	0	0	0	0	1	1	1	1

で、これをRのアソシエーション分析(arules)で使う場合、最終的に↓の感じに変換する。

1課,2課,3課
4課,5課
6課,7課,8課,9課

こんな感じのデータをトランザクションデータというらしい。

Rでこれをやる場合、トランザクションデータをそのまま読む場合は↓の感じ。

hoge.tran <- read.transactions("test.csv",sep=",",format="basket")

トランザクションデータの場合はこのままaruleに食わせられる。

hoge.ar <- apriori(hoge.tran)
inspect(hoge.ar)

↓のタイプのデータを読む場合は

1課	2課	3課	4課	5課	6課	7課	8課	9課
1	1	1	0	0	0	0	0	0
0	0	0	1	1	0	0	0	0
0	0	0	0	0	1	1	1	1

R上は↓の感じで読む

#CSVから読み込み
hoge <- read.table("test.csv",header=TRUE,sep=",",row.names=1)
#行列に変換
hoge.mat <- as(hoge,"matrix")
#トランザクションに変換
hoge.tran <- as (hoge.mat,"transactions")
#あとは一緒
hoge.ar <- apriori(hoge.tran)
inspect(hoge.ar)

データフレームからは直で変換できないっぽいので行列に一回変換する。

まー結局、Rに食わせる用のデータ形式を色々準備しないとね。基本的にはアンケートの選択肢とか、商品のマスタとかマスタを全部横に並べて、0か1のON・OFFデータを作るのが一番楽かな。

数値系のデータは値の範囲でコード化してON/OFFのデータを作らないとダメかしらね。

問合せ