それWebL○gicで出来るよ?

ここの日記は、成果だけ書くようにして、あんまり思考の過程は書かないようにしようと思ってたんだけど……


主にStrutsで、アクションで処理した結果をテンプレートで表示するプログラムを毎回毎回書いていて段々嫌になって来た。最初はどの辺が嫌か、つまり何が分からないかも分からなかったんだけど、徐々に何が分からないかは分かりかけて来たので整理の意味も込めて少し書いてみた。

アクションを書くのが嫌

アクションを書くのが嫌だ。心の底から嫌だ。本当に面倒だ。更新処理や複雑なロジックを呼び出しているならまだしも、データベースの中のデータを表示する(例えば、SNSのマイページに参加しているコミュニティの一覧を表示するとか)だけの為にアクションを書くのって苦痛だ。


そもそも、「参加しているコミュニティの一覧」を取得するのってControllerの仕事だろうか?「コミュニティに参加する」とかならまだ分かるんだが。ControllerというよりむしろViewの仕事じゃないだろうか。


まあ一応、Cが「データの取得」でVが「データの表示」ということにしよう。にしても、例えばSNSのマイページに「フレンドの一覧」と「参加しているコミュニティの一覧」を表示するとして、その為のデータ取得処理を「マイページ表示」アクションに並べて書くのが納得いかない。「フレンドの一覧を取得」と「参加しているコミュニティの一覧を取得」って、両方がたまたま同じページに表示されるという以外に本質的に全く無関係な処理だ。処理間の依存関係も無いし並べる順番すら問わない処理が同じメソッド内にあるのにはどうも違和感がある。


取得結果をController(アクション)からView(テンプレート)に渡すのに、リクエストにsetAttribute()して渡すというのも気に入らない。名前の衝突とか考えると、ある意味リクエストってグローバル領域だよね、と思う。キーさえ分かれば「フレンドの一覧」表示エリアから「コミュニティの一覧」データにアクセス出来るのが気持ち悪い。


Viewの変更、例えば「参加しているコミュニティの一覧」をマイページに表示するのは止めて、別のページ(参加しているコミュニティ表示ページ)に表示したとする。そんな時にアクションを変更して、マイページ表示アクションからコミュニティ一覧取得処理を消して参加しているコミュニティ表示ページ表示アクションに移動するんだろうか。それってViewとControllerが独立してるって言えないんじゃないか。


テンプレートからサービスなりモデルなりのBeanにアクセスして表示時にデータを取得するようにすれば、テンプレートの変更だけでアクションの修正は要らなくなるだろう。でもその場合共通処理(認証とか?)や同一テーブルへのアクセスなどをまとめてチューニングしたりするのに少し困りそう。

じゃあどうすればいいのよ

こんな風なフレームワークにすれば少し気分よく開発できそうだ。

  • 処理間の依存関係を記述する
  • 処理のフローごとにデータを保持する為のコンテキストを生成する
    • 処理が分岐: コンテキストも分岐して、相互にデータにアクセスできないようにする
  • Viewから逆算して処理の流れを決定し、開始点から順に実行

図にするとこういう感じ

なんとなくどこかで見た図だなあ。2001年頃に。自分遅れてんなあ。