メソッド呼び出し

Railsの「Controller/Action」という階層付けは、まさしく今週議論してきたMapleのメソッド呼び分けだなーと。で、Mapleではid:hawkringさんが提唱されてる「Action/Method/Request_Method」で決定ですかね。

つまりActionクラスは以下のようなつくりになります(もうここまでくるとこのクラスをActionと呼んでいいのか?という気もしますが・・・)。

class Foo {
    function execute() {
    }
    function execute_bar() {
    }
    function execute_bar_post() {
    }
    function execute_zoo_get() {
    }
}

このActionは以下のような動作をすることになります。

  • POSTで「action=foo&method=bar」だと「execute_bar_post()」を実行
  • GETで「action=foo&method=bar」だと「execute_bar()」を実行
  • GETで「action=foo&method=zoo」だと「execute_zoo_get()」を実行
  • それ以外で「action=foo」だと「execute()」を実行

「action=foo&method=zoo」をPOSTで呼んだ場合、「execute()」が実行されるというのはわかりにくいってのはあるかな?とりあえず「execute_xxxx()」という形はhawkringさんが言われていたように外部から呼んでほしくないメソッド(setter/getterとか)をたたかれないようにブロックの意味でもこういう規約にした方がいいですね。

あと、フィルターは以下のようになりますかね。

[Convert:bar:POST]

[Convert:bar]

[Convert:zoo:GET]

[Convert::POST]

一番最後のは、methodはなんでもよくてPOSTだった場合ってことですね。もちろん個別で指定している「Convert:bar:POST」の方が強いので、「method=bar」の場合はそちらが適用される。

と、この修正をかけた場合、Railsと同じ副作用がでますね。それこそ1つのActionでどこまでまとめてやるんだという議論。そのようにしたければそれもできるということで準備するのはいいとは思うが、なんかアプリケーションを1つのActionで処理する人とか出そうでどうかな・・・と思ってみたり。おそらく基準となるのは、リクエストパラメータが共通であればActionをまとめるくらいですかね。インジェクションするリクエストパラメータがちがっているものをまとめてしまうと、個別にみると必要のない変数を定義することになるので、よくないですよね。

私はもともとActionはこまめに分けた方がいい(success返すだけのActionがあってもいいんじゃない?)と思う人なので、今のMapleでも不都合は感じてなかったが、やっぱこの拡張はした方がいいですかね?確かに拡張するとものすごく便利な局面もあるだろうなを感じるので、やった方がいいと思ってはいるのですが。

みなさんのご意見、お待ちしております。