如何避免使用太多选项的大开关语句

时间:2015-04-09 12:49:24

标签: php

在一个类中,我有一个方法,主要包含一个巨大的switch语句(约250行!!!),根据输入调用不同的方法。 是的它有效,但它很简单,我觉得应该有一个更优雅的解决方案。

看起来与此类似:

   private function choosePartnerMethod($oST, $sPartner)
    {
        $oPartnerReport = null;
        switch ($sPartner) {
            case 'aertpa':
                $oPartnerReport = $oST->aertpa();
                break;
            case 'adrtsh':
                $oPartnerReport = $oST->adrtsh();
                break;
            case 'adwev':
                $oPartnerReport = $oST->adwev();
                break;
            case 'agft':
                $oPartnerReport = $oST->agft();
                break;
            case 'alan':
            case 'alanrs':
                $oPartnerReport = $oST->alan();
                break;
            case 'andfe':
                $oPartnerReport = $oST->anfe();
                break;
            case 'bsera':
            case 'bsrhes':
            case 'bshwet':
                $oPartnerReport = $oST->bsera();
                break;
                .... many many more...
            default:
                break;
        }//end switch
        return $oPartnerReport;
    }

如果总有一种情况与一种方法相匹配,我可以动态地称它们为:

    $oPartnerReport = $oST->$sPartner();

但正如您所看到的,有些情况下不止一种方法匹配。

有人知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

我正在思考类似的事情:

$partnersCollection = array(
   'aertpa' => array('aertpa'),
   'bsera'  => array('bsera', 'bsrhes', 'bshwet'),
   // ....... method => partners
);

foreach ($partnersCollection as $methodToBeCalled => $partners) {
  if (in_array($sPartner, $partners)) {
    return $oST->$methodToBeCalled();
  }
}

答案 1 :(得分:1)

您可能会做这样的事情:

class PartnerMethod{

    private $partners = array(
                            'aertpa' => 'aertpa',
                            'adrtsh' => 'adrtsh',
                        );

    public function choosePartnerMethod($oST, $sPartner){
        if(in_array($sPartner, $this->partners)){
            return $oST->{$this->partners[$sPartner]}();
        }
    }

}