2012年10月27日土曜日

DCIを調べてみて、MVCについて思ったこと

Data, Context, and Interaction (DCI)というのが流行っているらしい、と聞いて調べてみた。なにか「とてつもなく面白そう」なので、何か書いて見る。

全然理解はできていないので、あくまで連想したことです。

MVCは1リクエストに対して1リスポンス

自分の理解では、ウェブ・アプリケーションでのMVCとはリクエストに対してリスポンスを返すためのデザインパターンであること。

MVCについては、MOVEやらCが太るとか言われてますが、基本的にはhttpの仕組み上、この考え方は理にかなっていると思う。

ただ、人間が操作する場合を考えると、MVCだと何かが足りない気がする。

非常に単純なケースとして、新規データの登録を考えてみる。
 1)フォームを表示(form)、
 2)入力されたデータの確認画面(confirm)、
 3)データベースに登録(insert)、
という流れで処理が行われていると思う。
実際には、もうちょっと複雑なことが多い気がする。

さて、MVCだと、上の処理を3回に分けて記述する。
一つ一つの処理は理解しやすいのだけど、流れとして見た場合に処理のつながりが追いかけにくい。と思う。

Interactionをコードにする

DCIだと、どうなるのだろう?
こういった処理(インターアクション)をコードとして記述しましょう。
という事らしい。

早速擬似コーディング。
こんなかんじかな。

function add_entity( $action, $ctrl, $view )
{
    $role = $ctrl->getRole( 'entity' 
);
    if( $action == 'form' ) {
        return $view->showForm( $role );
    }
    $ok = $ctrl->verifyInput( $role );
    if( !$ok ) {
        return $view->showForm( $role );
    }
    if( $action == 'confirm' ) {

        $view->setToken( $ctrl->getToken() );
        return $view->showConfirm( $role );
    }
    if( $action == 'insert' && $ctrl->tokenOk() ) {
        $role->insert();
        $role->vanish();
    }
    return $view->showDone( $role );
}

$ctrlや$viewが何かというのは考えないで。

実際に操作する対象は「entity」。
それをRoleで包んでいる。この例だと、単にActiveRecord化してる。


さて、$actionは「form」「confirm」「insert」と進んでゆく。
$view->showForm()からは「confirm」をアクションとして、
$view->showConfirm()からは「insert」をアクションとして、
呼び出す。

そして、すべてのアクションで同じ処理(add_entity)が走る

どうだろう?
これだと何が起きているのか、分かりやすいと思う。
まぁ、ちゃんと動くのが前提ですが。

0 件のコメント: