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

重构代码以减少PHP中的冗余,php,refactoring,Php,Refactoring,我有几个类共享公共逻辑。例如,类AddEmployee负责将员工添加到api中AddLocation负责添加人员的位置。课程如下: class AddEmployee { public function Add() { $apiUrl = "https://api.abc.com/Employees";; $authParameters = array( 'oauth_consumer_key' => $this->C

我有几个类共享公共逻辑。例如,类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;

   }
}
class AddEmployee
{
公共功能添加()
{
$apiUrl=”https://api.abc.com/Employees";;
$authParameters=数组(
'oauth_consumer_key'=>this->consumer_key,
);
$xml.=ProcesssRequestAndGetResponse('POST'、$apirl、$authParameters、$queryParameters、$oauth_secret);
返回$response;
}
}
类地址位置
{
公共功能添加()
{
$apiUrl=”https://api.abc.com/Locations";;
$authParameters=数组(
'oauth_consumer_key'=>this->consumer_key,
);
$xml.=ProcesssRequestAndGetResponse('POST'、$apirl、$authParameters、$queryParameters、$oauth_secret);
返回$response;
}
}
在上述两个类中,只有xml部分不同,其他部分相同。将来将添加其他新类,其中只有xml不同

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

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

在这种情况下:“不必考虑‘模式’……只要做就行。”

很明显,您可以定义一个(受保护的…)方法,该方法包含两个参数:URL和XML。只需将大部分逻辑剥离到该方法中,然后更改其他(public…)方法来调用它

另外(和“IMHO”):“归根结底,‘设计模式’就是指导方针。”经验法则,如果你愿意的话。并不是你在现实生活中遇到的每件事都会完全符合“模式”,你也不需要感觉到“你必须找到一个”来证明你作为一名工程师决定做什么

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

在这种情况下:“不必考虑‘模式’……只要去做就行了。”

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 }
}
很明显,您可以定义一个(受保护的…)方法,该方法包含两个参数:URL和XML。只需将大部分逻辑剥离到该方法中,然后更改其他(public…)方法来调用它

另外(和“IMHO”):“归根结底,‘设计模式’就是指导方针。”经验法则,如果你愿意的话。并不是你在现实生活中遇到的每件事都会完全符合“模式”,你也不需要感觉到“你必须找到一个”来证明你作为一名工程师决定做什么

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

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 }
}