我正在阅读 Robert C. Martin 在有关错误处理的第 7 部分中编写的干净代码,其中有一段代码我无法理解。
try {
MealExpenses expenses = expenseReportDAO.getMeals(employee.getID());
m_total += expenses.getTotal();
} catch(MealExpensesNotFound e) {
m_total += getMealPerDiem();
}
这是什么意思? 据说我们需要通过特殊情况模式重构它,如下所示:
public class PerDiemMealExpenses implements MealExpenses {
public int getTotal() {
// return the per diem default
}
}
你能帮我简单翻译一下吗? 提前谢谢你。
异常使方法的逻辑变得混乱且难以维护,并且还会导致错误。请查看您提供的代码:如果没有费用,它会抛出
MealExpensesNotFound
。采用这种方法,如果费用低于某个阈值,或者例如为负数,您可能需要处理其他异常。为了解决这个问题,Robert Martin 建议使用 Special Case 模式。
expenseReportDAO.getMeals
将始终返回 MealExpense
对象,而不是引发异常。您需要做的就是将特定情况的逻辑封装在单独的 PerDiemMealExpenses
类中。 PerDiemMealExpenses.getTotal()
在此示例中包含默认逻辑。按照这种方法,如果您需要处理另一种情况,您可以为此添加另一个类。
诀窍在于,现在选择正确行为的决定被封装在
expenseReportDAO.getMeals(employee.getID())
调用中。客户端的代码将保持不变,无需修改即可支持其他情况:
MealExpenses expenses = expenseReportDAO.getMeals(employee.getID());
m_total += expenses.getTotal();
如果餐费不支出,
PerDiemMealExpenses
将被退回,并具有自定义实现。