[CakePHP] Set::merge()で、引数が多くなるのを防ぐ

[CakePHP] Set::merge()で、引数が多くなるのを防ぐ

読書の秋、ということで週末は割と本を読む時間(と、コーヒー飲んでカフェインの摂取)が充実しているtanakaです。今回も、CakePHPのアプリケーション開発でSetクラスを使った実践テクニックを紹介します。今回はSet::mergeを取り上げます。

引数が増えすぎて困るのを何とかしたい

アプリケーションの開発が進むにつれて、既にあるメソッドに入力を増やして機能を拡張する、というのはよくあることでしょう。入力を増やす典型的な方法は、引数を増やすことです。例えば引数を増やしていって次のようになったと仮定します。

<?php
class Post extends AppModel {
    function search($title='', $tag='', $category='', $comment='', $limit=5, $start=1) {

        // ... 検索実行
    }
}

(一般的には、検索条件をひとまとめの配列にしますのでやや強引な例ですが)さて、この場合、例えばタイトル検索で、10個の記事を取得したい場合は次のように呼び出します。

$this->Post->search($query['title'], '', '', '', 10);

引数を2つ指定したいだけなのに5つも指定しないといけません。また、引数が多すぎると、どの引数がどんな意味を持つのかよくわからなくなってしまいそうですね。

Set::merge()で引数が増えるのを押さえる

こういうときはSet::merge()を使うと引数をスッキリさせることができます。(すでに増えすぎた後だと難しいかも知れませんが…)

<?php
class Post extends AppModel {
    function search($params=array()) {
        $default = array(
            'title' => '',
            'tag' => '',
            'category' => '',
            'comment' => '',
            'limit' => 5,
            'start' => 1,
        );
        $params = Set::merge($default, $params);

        // ... 検索実行
    }
}

このように記述した場合、引数は配列$defaultと同じ形式で指定することになります。ただし$default で指定されている値でかまわない場合は省略できます。例えば、さきほどの、タイトル検索で10件取り出したい場合は

$this->Post->search(array(
    'title' => $query['title'],
    'limit' => 10,
));

という風になります。文字数は若干増えましたが、’tag'と'category', 'comment'の指定が省略できました。さて、この、「引数のデフォルトを用意しつつSet::mergeで上書き」する方法は、理屈がわかれば多用するかもしれません。一歩進んで、次のようにひとまとめに書いてもいいでしょう。

<?php
class Post extends AppModel {
    function search($params=array()) {
        $params = Set::merge(array(
            'title' => '',
            'tag' => '',
            'category' => '',
            'comment' => '',
            'limit' => 5,
            'start' => 1,
        ), $params);

        // ... 検索実行
    }
}

まとめ

メソッドの引数が増えすぎてうんざりしないためにSet::merge()を使うテクニックを紹介しました。このテクニックはModel開発からHelper作成までどこでも役に立ちます。引数をあまり増やしたくないかたのお役に立てれば幸いです。

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ