2011-08-02 10 views

答えて

0

私は、それが求められている場合、長いif/else文について根本的に間違っていることはありません。

あなたが目障りだと思っているなら、if/elseブロックの内容をそれ自身の機能として定義するだけではどうですか?

冗長性を排除することも考えられます。それらがすべて末尾にある場合は、

 $aMsg = new RespondLoginMsg(); 
    $this->sendMsg($aMsg); 

となります。ブロックごとに繰り返す必要はありません。

+0

いいえ、ご覧のとおり、RespondLoginMsgの代わりにRespondLogoutMsg ..... – Tattat

+0

Aha。それを逃した、申し訳ありません。 – craigmc

2

おそらくスイッチが読みやすくなりますか?そしてSENDMSGはそれのうちいずれかの方法を移動し、ちょうど私が表示されていない過度の間隔と改行を取り除く以外

$strMessageClass=get_class($aMsg); 
switch ($strMessageClass) { 
    case 'LoginMsg': 
     $this->callingSomeMethod(); 
     $aMsg = new RespondLoginMsg(); 
    case 'RespondLogoutMsg': 
     $this->callingAnotherMethod(); 
     $aMsg = RespondLogoutMsg(); 
    default: 
     // If you have any.. 
} 
$this->sendMsg($aMsg); 
0

..場合は/あなたはswtichに設定$ AMSGオブジェクトを使用することができ何が問題なの?アイテムがインスタンスかどうかを確認するには、いくつのクラスが必要ですか?このリストはかなり限られていると私には思えます。 3つまたは4つ以上のif/elseステートメントがない場合は、if/elseステートメントをそのまま使用してください。それ以外の場合は、スイッチまたはループを使用します。

達成しようとしていることを具体的にすることはできますか?

ここでは、コードのややクリーンなバージョンです。

public function receiveMsg(aMsg) { 
    if ($aMsg instanceof LoginMsg) { 
    $this->callingSomeMethod(); 
    $this->callingAnotherMethod(); 

    $aMsg = new RespondLoginMsg(); 
    $this->sendMsg($aMsg); 
    } 
    else if (aMsg instanceof LogoutMsg) { 
    $this->callingSomeMethod(); 

    $aMsg = new RespondLogoutMsg(); 
    $this->sendMsg($aMsg); 
    } 
    else if { /*****bababab***/ 

    } 
    /*****many else if here***/ 
} 
+0

私はソースコードをカットして、私は200までのメッセージを持っています....彼らは同様の方法で動作するので、私はちょうどいくつかをコピーし、ここに投稿します。 – Tattat

+1

最大200種類のメッセージがありますか?私はそのタイプについて話しているからです。それは200種類のクラスがあることを意味します。それは過剰です。おそらく、1つのメッセージクラスを作成し、そのクラスの各メッセージタイプに対して関数を作成するだけです。次に、タイプをチェックし、適切な関数を呼び出すループを作成するだけです。この関数は必要なすべてのサブコールを作成します。そうすれば、あなたはこの機能にそれを入れる必要はありません。コードをよりクリーンに保ち、再利用可能にします。 – pthurmond

関連する問題