Laravel4、依存注入とコンテナ(6)

Tags : Laravel4  

直接はコンテナとは関係ない話を最後にひとつ。

Laravelのコアは、Facadeクラスを拡張しています。目的は主に2つあり、読み書きしやすい静的メソッドによるコーディングを提供しつつ、その実はテストしやすい通常のメソッドであるという仕組みを提供するのが一つ目です。もうひとつは、shouldReciveメソッドで簡単にコアをモックに置き換えられるようにすることです。

例えば、次のようなクラスを考えます。

<?php

class Doc
{

    public function mimic()
    {
        return Cache::get( 'bow', '...' );
    }

}

このクラスDocは直接コアクラスを使用しています。すると、ここでも「テストできない」となるのが、普通のフレームワークです。通常は、外部からコアを渡すことになるのでしょう。

<?php

class Doc
{

    public function __construct( Cache $cache )
    {
        $this->cache = $cache;
    }

    public function mimic()
    {
        return $this->catch->get( 'bow', '...' );
    }

}

これで問題ありません。しかし、Laravelの特徴の一つが「読み書き」しやすさです。どちらかと言われれば、やはり前のほうが読みやすいです。

さらに、もっとコアクラスを使い、さらに必要な通常の自前クラスをコンストラクターで受け取ると、さすがにパラメーターも多くなり、ごちゃごちゃしてしまいます。

そこで、静的メソッドでコーディングしても、テスト時にそのコアクラスをモックにしてくれる仕組みをFacadeクラスに含めているのです。

<?php

class DocTest extends TestCase
{

    public function testGet()
    {

        Cache::shouldReceive( 'get')
        ->once()
        ->withAnyArgs() // Cacheクラスのテストを行う必要はない
        ->andReturn( 'わんわん' );

        // Mockを渡す必要なし
        $doc = new Doc( );

        $this->assertEquals( 'わんわん', $doc->mimic() );
    }

}

こんなふうに簡単に、コアをモックに置き換え、ユニットテストができます。

この2つの工夫について、様々な批判がLaravelを使っていない人々から起きているのは事実です。要は、パターンに従っていない、コアがスタティックに見える、良くわからない人がこれを普通だと思い込むなどなど。

まあ、原則主義をモットーとする人達からすれば、受け入れられない部分も多いのでしょう。ただ、よくわからない人達がこれを普通と考えてしまう危険性まで言われると、これはもう批判する目的のための批判でしかありません。

なぜなら、Laravelのドキュメントに静的メソッドのこともFacadeクラスのことも書いてあるわけです。どんな言語、どんなフレームワークと言えど「特徴」を持っているわけで、それを「当たり前だと思う」危険はいつでも、どんなものにも存在しているわけですからね。(例えば、PHPは配列操作を多用します。連想配列をどんどん使うのが、PHPらしいコーディングと言われます。PHPでしかプログラミングの経験が無ければ、それを当たり前と思ってしまうことでしょう。しかし、複数言語経験者の方は言語の「特徴」の一つだと考え非難しないでしょう。PHPの配列操作多用プログラミングスタイルは、初心者がそれを当たり前だと誤解してしまう欠点であるは思いませんよね。複数言語を経験するなら、「誰でも通る道」であると考えるでしょう。それと、同じことです。)

もし、勘違いされる可能性で否定してしまえば、あらゆる創意工夫は悪になり、発展はありません。例え、今は多くの人達から支持されているデザインパターンでさえも、やがて廃れます。いままで、ソフトウェアの世界で繰り返されてきたようにです。

そして、私達Laravelユーザーとしては、この特徴を楽しんで使用すればよいだけです。

ここで起きていることは、PHPを使わない方が、PHPをバカにする発言と似ています。(辛辣ですよね。)どのフレームワークも使わず、生のPHPで開発する人が、フレームワーク使用を否定する発言と同じです。(実行スピード第一主義の時代遅れな考えです。)言われた側のユーザーは「使わないなら、黙っておいて欲しい」と思うでしょう。多分、Laravelを否定している人達も、かつてそんな思いをしたはずです。そして、今度は攻撃側に回ったというわけです。

それは全く実りのある行為ではありません。フレームワーク戦争の種をばらまいているだけです。使わないなら、口を閉じておく。使うのであれば、気に入らないところは貢献する。受け入れられなければフォークして、新しいもの作る。素晴らしきオープンソースの世界にようこそ。内輪で議論したいのであれば、外にもれない場所で行いましょう。ネットは公共の場所ですから、批判はやがて、ユーザーの耳に入ります。

これをお読みの皆さんがLaravelユーザーであれば、Laravel4独自の部分であり、それを自覚し、便利に使用すればいいだけです。Laravel開発者のTaylorさんは、使用者目線で開発してくれているのですからね。

皆さんは、自分に合ったスタイルで活用くださいね。

Laravelでのテストについて、もっと知りたい方は、Laravel Testing Decodedをどうぞ。Laravelの構造や、Laravelで大きなプログラムを作成したい方は、Laravel: 見習いから職人へをどうぞ。