エンティティを使うメリット:その1

昨日のエントリーで、CakePHPでエンティティを使うプラグインを紹介しました。

CakePHPでエンティティを使えるプラグイン - CakeEntity - basuke の日記

データがエンティティ化されて一番うれしいのは、なんと言ってもビューでの記述が飛躍的に楽になることだと思います。それに付随して、その準備をさせられているコントローラもすっきり記述することができます。

モデルやコントローラでは一つ一つの処理が比較的まとまっています。まとまっているというのは、呼び出しと利用するシーンが近いということです。呼び出して取得して使うまでのコード上のコンテキストが同じということが多いでしょう。

コントローラのeditアクションを例に考えると、$this->dataに渡ってきた配列を$this->[モデル]->save()に渡して、結果次第でredirectする、という典型的な処理の場合、CakePHPのこれまでのパターンからしても見慣れたものです。ここに、あえてエンティティにするほどの複雑さはありません*1

一方、ビューへ渡るデータは存在期間も長く、一度処理が断絶しています。controllerにsetされた値が、裏でビューにセットされて、ビューのレンダリングが始まってようやく表舞台に戻ってきて、再びデータが変数の形で登場します。ファイルも違えばスコープも違います。先ほどの例と比べて、かなりの距離の差と言っていいでしょう。

ビューで単なるデータに戻ってしまった変数を扱うのには一工夫が必要で、その役目がヘルパーです。まぁ、それだけがヘルパーって訳ではないですが、巨大な配列の配列からフォームを作り出すFormHelperや、バラバラになってしまった情報をつなぎ合わせてリンクをつくるHtmlHelper->link()なんていうのは、データに戻ってしまったが故に必要な、まさにTheヘルパーと言えるでしょう。正しく使っていればヘルパーは悪いものではないのですが、煩雑なものはよくない亜流を生み出しがちです。その処理をビューでやる必要があるのか?というヘルパーをたまに見かけることがありませんか?無用にビジネスロジックの呼び出しをビューに公開してしまっていると言えます。

と、長々と書いてきましたが、エンティティを使うと状況は改善、ビューへのデータの受け渡しがスマートになります。エンティティはオブジェクトのインスタンスですからクラスに定義されているメソッドが利用できます。そのため、データとビジネスロジックは自然と一緒になっているので、よけいなヘルパーを読み込む必要はなくなります。

エンティティはモデルオブジェクトよりも小さい単位で、テーブルではなくレコードに相当する存在です。例えば一つの例としては、何かの処理が可能かドルか判断する処理をエンティティに持たせることができます。あるエンティティがログインユーザーによって編集できるかどうか、削除できるかどうかなどは、ACLを使わなくても簡単に記述することができます。

MVCな観点から考えると、エンティティクラスに定義される処理は、モデルレイヤーに属すると考えてよいでしょう。そんなモデルレイヤーのものをビューに持っていっていいのか?という疑問をもたれる方がいましたが、それは違います。モデルレイヤーのビジネスロジックをダイレクトに呼び出している訳ではないということです。情報はメソッドに隠蔽されているため、エンティティでメソッドを使うということは、むしろエンティティの属性と考えて問題ないでしょう。安全性も高くテストもしやすいはずです。

もちろん、ビューから$post->save()のようなコードを呼び出せてしまうという危険性ははらんでいますが、これはコードの運用の問題です。こういうことのないような対応については、別のエントリーで紹介したいと思います。

*1:最初はほんとにイヤでイヤでしょうがなかったですがw