我有几个共享逻辑的类。例如,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会有所不同。
我的问题是如何重构从每个类中删除重复?
删除重复代码的设计模式是什么?
在这种情况下:“没关系'模式'......就这样做。”
很明显,你可以定义一个(protected ...)方法,它接受两个参数:URL和XML。只需将大部分逻辑分离到该方法中,然后更改其他(公共...)方法即可调用它。
此外(和“恕我直言”):“在一天结束时,'设计模式'应该是指导方针。”经验法则,如果你愿意的话。并非你在现实生活中遇到的一切都将完全符合“模式”,你也不需要感受到“你必须找到一个”来证明你作为工程师决定做的事情。
相反,要非常务实地思考应用程序,工作组以及您预期将来需要的更改。尝试设计方法,使你的继任者在面对不可避免的未来变化时,可能不必改变“百种方法”。 (相反,由于您的远见,他们只需要改变一些。)在与您的经理和您团队的其他成员仔细讨论此事后,请使用您的最佳判断。
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 }
}