maple を分かりやすくして欲しいらしい

自分で調べなさい。

どうやら Phrame スレッドでは、maple での Web アプリ作成を行う上で、その構造や考え方が重たいし分かりにくいと思われているようなので、いっちょ仕事として始めたプログラム歴一年のこのウンコが、付属サンプルからちょこっとだけ延長した例を元に少し書こうと思う。頼まれてもいないけどな。

サンプルではよくあるパターンとしてフォームの入力、確認、完了という遷移の例がある。じゃあその値をデータベースに格納するのは?単純に完了 action にてデータベースへ格納するようなクエリを発行する動作を execute に書くのもいいけど、maple ではこういう形を許容する。

まず maple module。
function setLogic(&$logic)
{
    $this->logic =& $logic;
}
function execute()
{
    $logic = &$this->Logic;
    if ($logic->store($dto)) {
        return 'success';
    }
}
$logic の処理。ロジッククラス。
function setDao(&$Dao)
{
    $this->dao =& $dao;
}
function store(&$dto)
{
    $dao = &$this->dao;
    $result = false;
    if ($dto->isNew()) {
        $result = $dao->insert($dto);
    } else {
        $result = $dao->update($dto);
    }
    return $result;
}
$dao の中身。DAO クラス。
function insert(&$dto)
{
    // $dto の値を insert するようなクエリ
}
function update(&$dto)
{
    // $dto の値を update するようなクエリ
}

dto って何?っていわれそーだ…。目的データの寄せ集めと、おまけのオプション (isNew() がそんな感じ。あと delete フラグ立てたりとか) がついてるようなオブジェクトと思って OK。

一通りのフローを見てみたいんだけど insert query 書くのメンドー、つーか DB 構造まだ決まってねーよとかいうのであれば別に return true; とかでその場を終わらせればよし。んで logic, dao とかは大根で injection すりゃ本番、テストの切り替えは思いのまま、客向けにあたかも動いているかのように見せるなんてことだって問題ないし、複数人プロジェクトで該当する担当者が仕事遅くてこっちのフロー全然チェックできねーよなんてことも避けれる。
アクションの骨はこれで完成で、その日は「もう動く形になったよ」と同僚に自慢してとっとと一足早く一杯飲みにでも行って、次の日にモーニングコーヒーでも飲みながら各セクションがすべき仕事フローのコードを起こす準備をしてればいいのだ。

実際のところ本当に maple が絡んでいる個所は一番初めの module のみ。確かに Logic, Dao も maple DI に格納するというアクションが発生してるけど、こちとらやることといえば set method 作って DI ファイルに名前を書くのみ。深く考えてコードを起こすことと比べたら知れたレベルでしょ。
加えて各クラスとの接続で、自ら include なり new なりしていないのもポイント。依存ある関係を自ら管理するのではなく、Dependency Injection(依存性注入)を行うコンテナに任せてしまうことで、より効率よい実装、テストができるようになる。

maple は重いなんて言って避けるのはもったいない。maple はあくまで仕事をわけて正しくキレイでフットワークの軽いコードを書こうというキッカケを提供しようとしてるのだ。

トラックバック(2)

このブログ記事を参照しているブログ一覧: maple を分かりやすくして欲しいらしい

このブログ記事に対するトラックバックURL: http://hatotech.org/mt-admin/mt-tb.cgi/422

» [PHP][Maple] 解説(kunitの日記)~のトラックバック

kumatchさんがMapleをつかった開発パターンを解説してくださってます。 http://hatotech.org/kumatch/archives/0... 続きを読む

» [maple]maple解説ページ(bobchinの日記)~のトラックバック

http://hatotech.org/kumatch/archives/000422.html#more kumatchさんによるmaple解説ページ。あり... 続きを読む

コメント(3)

tfujii :

 大変勉強になりました。大枠が、こちらが考えていたことと同じみたいで、安心できました。この記事をあと1週間前に読んでいれば・・・とほほTT

cicada :

初心者な質問で申し訳ありません。
このエントリを参考にさせていただいて、サンプルを作ってみたのですが、actionクラスに対してlogicをインジェクトすることは出来たのですがlogicに対してdaoをインジェクトすることができませんでした。
logic、daoはwebapp/components/以下に置き、maple.iniは以下のように書きました。
[Action]
userLoginLogic = "ref:userLoginLogic"
userDao = "ref:userDao"
どのようにしたらうまくいくのでしょうか。ご助言いただけるとありがたいです。

くまっち :

思いのほか長くなってしまったので別エントリにてお返事です。
http://hatotech.org/kumatch/archives/000428.html

コメントする

このブログ記事について

このページは、が2005年2月11日 01:44に書いたブログ記事です。

ひとつ前のブログ記事は「AntiVirus の呪いが」です。

次のブログ記事は「過去の遺産」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 4.01