我想知道是否有人可以为此功能提供设计模式或更好的实现解决方案:
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
结构上的,这意味着一个新的状态(例如客户关闭他的帐户)将意味着我需要添加一个违反Open Closed Principleelse if
的语句。 - 我感觉这个函数有不同的抽象层。
getRequestedEbayOrdersFromDB()
非常抽象,而其余的代码有很多细节。 - 重复某些功能
insertRecordInOrderHistoryTable()
,只是将新记录添加到历史实体表中。
解决方案
我考虑过将倍数转换if/else
为工厂模式,但我只使用工厂来创建对象而不改变行为。
接下来我考虑使用策略模式,但未能构建一个好的解决方案。
任何帮助表示赞赏。谢谢。