我有几个共享公共逻辑的类。例如,class 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会有所不同。
我的问题是,我如何重构以从每个类中删除重复的内容?
哪种设计模式可以去掉重复的代码?
发布于 2016-07-26 04:29:03
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 }
}
发布于 2016-07-26 04:27:38
在这种情况下:“不要紧‘模式’...只要do it。”
很明显,您可以定义一个(protected ...)方法,该方法接受两个参数: URL和XML。只需将大部分逻辑拆分到该方法中,然后更改其他方法(public ...)方法来调用它。
还有(还有"IMHO"):“归根结底,‘设计模式’就是指导方针。”经验法则,如果你愿意的话。并不是你在现实生活中遇到的每一件事都会完全符合一个“模式”,你也不需要觉得“你必须找到一个”来证明你作为一个工程师决定要做的事情。
相反,应该非常务实地思考应用程序、工作组以及您预期将来需要进行的更改。尝试以这样一种方式设计方法,即当您的继任者面临不可避免的未来变化时,可能不必更改“百种方法”。(相反,多亏了你的远见卓识,他们只需要做一些改变。)在与你的经理和团队中的其他成员仔细讨论这件事后,使用你最好的判断。
https://stackoverflow.com/questions/38576561
复制相似问题