これは、Clean Code の慣行により準拠するようにリファクタリングする必要があるかどうか疑問に思っていたコードの一部です。
これは、顧客による一部の注文の返金を担当するクラスです。
class RefundServiceInvoker {
private $_orders;
public function refundOrder() {
$this->getOrdersFromDB(); //This function gets all orders from DB and sets $_orders
foreach ($this->_orders as $order) {
try {
$order->refund(); //Some lines may throw an exception when refunded due to some business logic (ex. the order was already shipped)
$this->updateOrderStatus('refunded')
} catch (Exception $e) {
$this->logError($e);
$this->sendMailToAdmin();
}
}
}
}
もちろん、このコードは元のコードよりも大幅に単純化されています。
私の主な問題は$order->refund();
、例外がスローされた場合にキャッチされてDBに記録され、メールが送信されることです。しかし、$this->logError($e);
それ自体が例外をスローした場合はどうなるでしょうか? または、メール サーバーがダウンして例外がスローされた場合はどうなるでしょうか。
DB 自体がダウンし$this->getOrdersFromDB();
て例外がスローされた場合はどうでしょうか。
私の最初の解決策は、すべてを1つの大きなものにラップすることでしたtry{}catch{}
:
public function refundOrder() {
try {
$this->getOrdersFromDB(); //This function gets all orders from DB and sets $_orders
foreach ($this->_orders as $order) {
$order->refund(); //Some lines may throw an exception when refunded due to some business logic (ex. the order was already shipped)
$this->updateOrderStatus('refunded')
} catch (Exception $e) {
$this->logError($e);
$this->sendMailToAdmin();
}
}
}
しかし、それは1つの注文が失敗するとすべてが失敗することを意味します!! 関数全体に 2try{}catch{}
つ、注文ごとにもう 1 つ置く必要がありますか? ただし、この場合も、catch 内の関数がキャッチされない例外をスローする可能性があります。
ノート:
このアプリケーションは、Zend フレームワーク 1.11.11 を使用して構築されています。
前もって感謝します。