2011-08-02 2 views
0

Voici le code ... Mon if, else statement est très long ... Comment le séparer? Toute suggestion? Je vous remercie.Comment mieux organiser ce code

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.)***/ 


} 

Répondre

0

Je ne vois rien de fondamentalement faux au sujet d'une longue instruction if/else si c'est ce qui est demandé.

Si vous trouvez qu'il s'agit d'une horreur, pourquoi ne pas simplement définir le contenu de chaque bloc if/else comme sa propre fonction?

Vous pouvez également envisager d'éliminer les redondances. Si tous se terminent par

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

alors il n'est pas nécessaire de le répéter dans chaque bloc.

+0

pas, comme vous pouvez le voir, le second est RespondLogoutMsg au lieu de RespondLoginMsg ..... – Tattat

+0

Aha. Manqué ça, désolé. – craigmc

2

Peut-être qu'un commutateur est plus facile à lire? Et le sendMsg pourrait être déplacé hors de lui de toute façon et il suffit d'utiliser l'objet amsg $ que vous définissez dans le swtich/if ..

$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

Autre que de se débarrasser des ruptures d'espacement excessives et la ligne que je ne vois pas quel est le problème ici. Combien de classes différentes avez-vous besoin de vérifier si un élément est une instance de? Il me semble que la liste serait assez limitée ici. Si vous n'avez pas plus de 3 ou 4 instructions if/else, gardez simplement un if/else. Sinon, utilisez un interrupteur ou une boucle.

Pouvez-vous être plus précis quant à ce que vous essayez d'accomplir?

Voici une version légèrement plus propre de votre code.

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

J'ai coupé le code source, j'ai jusqu'à 200 msg .... ils fonctionnent de manière similaire, donc, je viens de copier quelques-uns et le poster ici. – Tattat

+1

Vous avez jusqu'à 200 différents types de messages? Parce que je parle des types. Et cela voudrait dire que vous avez 200 classes différentes pour cela. C'est excessif. Vous pouvez probablement juste créer une classe de message et créer une fonction pour chaque type de message dans la classe. Ensuite, vous pouvez simplement créer une boucle qui vérifie le type et appelle la fonction appropriée. Cette fonction fera alors toutes les sous-couches nécessaires. De cette façon, vous n'avez pas à le mettre dans cette fonction. Maintient votre code plus propre et plus réutilisable. – pthurmond

Questions connexes