2011-08-02 79 views
0

這裏是代碼...我的if,else語句很長...如何區分它?任何建議?謝謝。如何使此代碼更好地組織

public function receiveMsg(aMsg){ 
    if($aMsg instanceof LoginMsg){ 
     $this->callingSomeMethod();   //should I separate this code into other class/ object? 
     $this->callingAnotherMethod(); //should I separate this code into other class/ object? 

     $aMsg = new RespondLoginMsg(); //should I separate this code into other class/ object? 
     $this->sendMsg($aMsg);   //should I separate this code into other class/ object? 

    }else if(aMsg instanceof LogoutMsg){ 
     $this->callingSomeMethod();  //should I separate this code into another class/ object? 

     $aMsg = new RespondLogoutMsg();  //should I separate this code into another class/ object? 
     $this->sendMsg($aMsg);    //should I separate this code into another class/ object? 


    }else if/*****bababab***/ 

    /*****many else if here (up to 200 msg+ , just upload 2 here.)***/ 


} 

回答

0

我沒有看到任何根本錯誤的長if/else語句,如果這就是所謂的。

如果你發現它是一個眼睛,爲什麼不直接定義每個if/else塊的內容作爲它自己的函數呢?

你也可以考慮消除重做。如果它們全都以

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

那麼就不需要在每個塊中重複它。

+0

不,你可以看到,第二個是RespondLogoutMsg而不是RespondLoginMsg ..... – Tattat

+0

啊哈。錯過了,對不起。 – craigmc

2

也許一個開關更容易閱讀?而SENDMSG可能被移出它無論哪種方式,只是使用您的馬桶蓋設置$ AMSG對象/如果..

$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

除了擺脫過度間距和換行的我沒有看到這裏的問題是什麼。你需要檢查一個項目是否是一個實例的多少個不同的類?在我看來,這裏的名單會相當有限。如果您沒有超過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 msg ....他們工作方式類似,所以,我只是複製一些,並在這裏發佈。 – Tattat

+1

你有多達200種不同類型的信息?因爲我在談論類型。這意味着你有200個不同的課程。那太過分了。您可能只需創建一個消息類併爲該類中的每個消息類型創建一個函數。然後,您可以創建一個循環來檢查類型並調用相應的函數。這個功能將會使所有需要的子調用。這樣你就不必把它放在這個函數中。保持代碼更清潔,更可重用。 – pthurmond