在干净的代码书中定义正常流程是什么意思?

问题描述 投票:0回答:1

我正在阅读 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
 }
}

你能帮我简单翻译一下吗? 提前谢谢你。

code-cleanup
1个回答
1
投票

异常使方法的逻辑变得混乱且难以维护,并且还会导致错误。请查看您提供的代码:如果没有费用,它会抛出

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
将被退回,并具有自定义实现。

这种方法将允许您轻松修改您的软件并符合 OCPSRP

© www.soinside.com 2019 - 2024. All rights reserved.