我想知道是否有人可以为该功能提供设计模式或更好的实现解决方案:
public function refundAcceptedDisputes() {
$this->getRequestedEbayOrdersFromDB(); //get all disputes requested on ebay
foreach ($this->orders as $order) { /* $order is a Doctrine Entity */
try {
if ($this->isDisputeAccepted($order)) {
$order->setStatus('accepted');
$order->refund(); //refunds the order on ebay and internally in my system
$this->insertRecordInOrderHistoryTable($order,'refunded');
} else if ($this->isDisputeCancelled($order)) {
$order->setStatus('cancelled');
$this->insertRecordInOrderHistory($order,'cancelled');
$order->rollBackRefund(); //cancels the refund on ebay and internally in my system
} else if ($this->isDisputeOlderThan7Days($order)) {
$order->closeDispute(); //closes the dispute on ebay
$this->insertRecordInOrderHistoryTable($order,'refunded');
$order->refund(); //refunds the order on ebay and internally in my system
}
} catch (Exception $e) {
$order->setStatus('failed');
$order->setErrorMessage($e->getMessage());
$this->addLog();//log error
}
$order->setUpdatedAt(time());
$order->save();
}
}
功能用途:
- 我在 eBay 上销售游戏。
- 如果客户希望取消订单并拿回退款 (即退款)我必须先在 eBay 上提出“争议”。
- 一旦提出争议,我必须等待客户确认 他同意退款(很愚蠢,因为他是告诉我退款的人, 但这就是 eBay 上的运作方式)。
- 此功能会获取我提出的所有争议,并定期检查其状态,以了解客户是否已回复争议。
- 客户可以同意(然后我退款)或拒绝(然后我回滚)或可能在 7 天内不回复(我自行解决争议然后退款)。
问题
- 如您所见,代码构建在
if/else
结构上,这意味着新状态(例如客户关闭其帐户)意味着我需要添加else if
语句违反了开闭原则。 - 我感觉这个函数有不同的抽象层。
getRequestedEbayOrdersFromDB()
非常抽象,而其余代码则有很多细节。 - 某些函数是重复的
insertRecordInOrderHistoryTable()
,它只是向历史实体表添加一条新记录。
解决方案
我考虑过将多个 if/else
转换为工厂模式,但我只使用工厂来创建对象而不改变行为。
接下来我考虑使用策略模式,但未能构建一个好的解决方案。
任何帮助表示赞赏。 谢谢。
最佳答案
创建一个退款订单处理程序工厂怎么样?
我没有从所提供的代码中获得足够的信息,但我假设 order
中有一些内容可以作为处理程序类型的键,因此您可以在 中执行以下操作退款接受争议
:
(我是一个 C++ 人员,所以对伪代码感到抱歉)
refundOrderHandler = RefundOrderHandlerFactory.getHandler(order);
refundOrderHandler.doRefund(); // Name this method accordingly
然后你的工厂将有一个简单的 if/else 来获取处理程序的类型,如下所示:
RefundOrderHandlerFacotry::getHandler(order)) {
if(isDisputAccepted(order) {
return handlerA(order);
}
else if(isDisputCancelled(order)) {
return handlerB(order);
}
else if(isDisputOlderThan7Days(order)) {
return handlerC(order);
}
// Add new handlers here
}
确定处理程序类型的逻辑必须放置在工厂中,或者可供工厂访问。
然后,您必须为每种类型的 RefundHandler
创建一个类,以 RefundHandlerBase
作为基类,该类将具有抽象方法 doRefund()
请注意,与退款相关的所有逻辑都包含在相应的类中。要添加更多退款处理程序,您必须创建一个类来处理它,向工厂添加一个 else if ,并添加适当的逻辑来确定 RefundHandler 的类型。
关于php - 将设计模式应用于特定行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10277525/