人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

●質問者: mekpsy
●カテゴリ:ウェブ制作
✍キーワード:CASE MVC OOP switch Zend Framework
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● shellcat
●35ポイント

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

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

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

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

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

◎質問者からの返答

あ、すみません。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) {

(以下略)

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

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

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

幸いです。


2 ● shellcat
●35ポイント

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

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

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

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

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

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

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


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

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

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

$select->fromSomeTable($type);

のような感じですね。


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

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

$select->$type();

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

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

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


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

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

◎質問者からの返答

ありがとうございます。

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ