Zend Frameworkを使っています。

このフレームワークに限ったことではないと思いますが、MVCのCの部分に多量のswitch caseが
出現しているのを、どうにかして減らしたいのです。

OOPのサイトを見ると、ポリモーフィズムで解決できそうなことが書いてありますが、フレームワーク
使用の場合、何かが違っているような気がして、どうすればいいのか分かりません。

フレームワーク上にさらにOOPを重ねる?やり方のイメージがわきません。何か参考になるものは
ないでしょうか。

回答の条件
  • 1人3回まで
  • 登録:2008/12/09 15:31:03
  • 終了:2008/12/15 18:42:32

回答(2件)

id:shellcat No.1

shellcat回答回数6ベストアンサー獲得回数02008/12/10 16:23:49

ポイント35pt

ZendFrameworkのController配下に目を通してみましたが、

仰るほどswitchが多いとは感じませんでした。

具体的にはどのあたりのことなのでしょう?

ちょっと全体的にご質問が抽象的ですので、

どのサイトを参考にしたのか等をお教え頂ければまた考えてみます。

id:mekpsy

あ、すみません。ZendFrameworkそのもののコードではなく、

うちの会社でZFを使用して作ったサイトのコードのことです。

各コントローラーで、switch case文を多用してcaseごとに

SQLを発行しています。

有名なリファクタリング本によれば、こういう場合はポリモーフィズム

を使うとコードがすっきりするとありまして。実際にMovie、Rental、

Customerといったクラスを使って説明があるのですが、フレームワークの

場合のポリモーフィズムの適用の仕方が浮かばないのです。

Zend_Controller_Actionを継承したコントローラークラスに、

if ($type = $this->getRequest()->getUserParam('type')) {

switch ($type) {

case 'c0':

$select->・・・;

break;

case 'c1':

$select->・・・

break;

case 'c2':

$select->・・・

break;

case 'c3':

$select->・・・

break;

}

if ($mode = $this->getRequest()->getUserParam('mode')) {

switch($mode) {

(以下略)

こんな風にリクエストパラメーターによる場合分けの嵐になって

いまして、何とかできないものかと考えております。

これでもちょっと具体性を欠くかもしれませんが、ヒントを頂ければ

幸いです。

2008/12/11 01:36:27
id:shellcat No.2

shellcat回答回数6ベストアンサー獲得回数02008/12/11 13:30:17

ポイント35pt

なるほど。了解しました。

これを拝見してぱっと思いついたのは、

ユーザ入力値「type」と「mode」による分岐を

Dispatchで行ってしまうことです。

独自のDispatcherを書く必要はありますが、

typeとmodeの組に対してひとつのActionメソッドが定義されれば、

ひとつひとつのActionを見やすく、すっきりさせることができます。


もう一つの方法は、この分岐をModelに追い出すやり方です。

読み出しメソッドに引数としてtypeを与え、その中で分岐することでも

コントローラーの見た目は良くなりますし、これがある種のポリモルフィズムでしょう。

$select->fromSomeTable($type);

のような感じですね。


再利用性を考えれば、可変メソッドを使用するのが最もスマートだと思います。

つまり、type値に応じたメソッド(c0, c1など)を$selectの属するクラスに実装し、

$select->$type();

としてしまえばいいのです。

後は存在しない値が入力されたときのために事前に値をチェックするか

Model側に__call()を仕込んでおくかすれば良いでしょう。


実際の実装が分からない以上「これだ!」ということにはならないでしょうが、

少しでもヒントになれば幸いです。

id:mekpsy

ありがとうございます。

私の理解が現時点では追いついていないですが、参考にさせていただきます。

ただ、$selectはZend Framework組み込みのZend_Db_Selectオブジェクトですので、

書いていただいた方法のそのものずばりは出来ない気がしています。

ともあれ、抽象的な質問にご回答ありがとうございました。

2008/12/15 18:41:16

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません