重构代码以减少PHP中的冗余

时间:2016-07-25 20:09:08

标签: php refactoring

我有几个共享逻辑的类。例如,类 AddEmployee 负责将员工添加到api。 AddLocation 负责添加人员的位置。课程如下:

class AddEmployee
{
   public function Add()
   {
      $apiUrl = "https://api.abc.com/Employees";;

        $authParameters = array(
            'oauth_consumer_key' => $this->CONSUMER_KEY,

        );

        $xml .= <<<EOM
                <SuperFund>
                <ABN>$obj->abn</ABN>
                <Type>REGULATED</Type>
                </SuperFund>
                EOM;

        $queryParameters = array(
            'xml' => $xml
        );

        $response = $this->ProcesssRequestAndGetResponse('POST',$apiUrl,$authParameters,$queryParameters,$oauth_secret);

        return $response;

   }
}


class AddLocation
{
   public function Add()
   {
      $apiUrl = "https://api.abc.com/Locations";;

        $authParameters = array(
            'oauth_consumer_key' => $this->CONSUMER_KEY,

        );

        $xml .= <<<EOM
                <Location>
                <Address1>$obj->abn</Address1>
                <City>Dhaka</Citry>
                </Location>
                EOM;

        $queryParameters = array(
            'xml' => $xml
        );

        $response = $this->ProcesssRequestAndGetResponse('POST',$apiUrl,$authParameters,$queryParameters,$oauth_secret);

        return $response;

   }
}

在上述两个类中,只有xml部分不同而其他部分相同。将来会添加其他新类,只有xml会有所不同。

我的问题是如何重构从每个类中删除重复?

删除重复代码的设计模式是什么?

2 个答案:

答案 0 :(得分:2)

在这种情况下:“nevermind'pattern'...只是它。”

很明显,你可以定义一个(protected ...)方法,该方法有两个参数:URL和XML。只需将大部分逻辑分拆到该方法中,然后更改其他(public ...)方法即可调用它。

另外(和“恕我直言”):“在一天结束时,'设计模式'应该是指南。”经验法则,如果你愿意的话。并非你在现实生活中遇到的所有东西都完全符合“模式”,你也不需要感觉“你必须找到一个”来证明你作为工程师, 决定这样做。

相反,请非常务实地考虑应用程序,工作组以及您预期将来需要的更改。尝试设计方法,使你的继任者在面对不可避免的未来变化时,可能不必改变“百种方法”。 (相反,由于你的远见,他们只需要改变一些。)在与你的经理和你团队的其他成员仔细讨论此事后,使用你的最佳判断。

答案 1 :(得分:2)

class AddThing {
    public function Add() {//all your stuff, except it calls getXml()}
    public abstract function getXml();
}

class AddEmployee extends AddThing {
    public function getXml() { // get the employee XML }
}

class AddLocation extends AddThing {
    public function getXml() { // get the location XML }
}
相关问题