在Switch-Case-Smell上重构或使用设计模式

时间:2015-11-30 10:04:19

标签: java design-patterns optimization junit refactoring

由于我目前正在处理设计模式和重构一些遗留代码以编写一些JUnit-Tests,因此我正在查看我的项目,我可以在其中应用它。

我在一个类中找到了一个方法,其中我有一个很长的switch-case语句。当然,这对于单元测试来说是一个可怕的场景,因为我需要为每个语句创建一个测试。

现在我考虑应用Strategypattern。但问题是,我有30个不同的案例。这意味着我必须创建30个类。这是建议,还是我应该考虑其他一些重构方法? Morover开关盒位于两个for循环内,因为它是一个Excel表。

以下是我方法的摘录:

switch (column) {
    case CASE1:
        excelUtil.setCell(row, col++, item.getSomething(), styles[0]);
        break;
    case CASE2:
        excelUtil.setCell(row, col++, order.getSomething(), styles[0]);
        break;
    case CASE3:
        excelUtil.setCell(row, col++, order.getSomethingElse(), styles[0]);
        break;
    case CASE4:
        if (!StringUtils.isEmpty(order.getSomething())) {
            try {
                //do something before setting cell
                excelUtil.setCell(row, col++, soldToName, styles[0]);
            }
            catch (final Exception e) {
                excelUtil.setCell(row, col++, "", styles[0]);
            }
        }
        else {
            excelUtil.setCell(row, col++, "", styles[0]);
        }
        break; //.. and so on

1 个答案:

答案 0 :(得分:1)

是的,在这种情况下,策略模式是正确的选择。确保状态跟踪逻辑(例如col++)不会泄漏到策略中。

使用策略后,可以将策略选择移动到字典:创建从column映射到策略的字典,并使用字典代替switch-case。这是有效的,因为策略都实现了相同的接口。