定义正常流表达式在 Robert C Martine 的干净代码书中使用,但我无法理解,有人可以解释得更清楚吗? [已关闭]

问题描述 投票: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
     }
    }

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

java design-patterns clean-architecture code-cleanup
1个回答
3
投票

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

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.