如何替换If-else阻止条件

时间:2015-09-19 10:14:52

标签: if-statement design-patterns anti-patterns

在我的代码中,我有一个if-else阻塞条件,如下所示:

public String method (Info info) {
    if (info.isSomeBooleanCondition) {
        return "someString";
    }
    else if (info.isSomeOtherCondition) {
        return "someOtherString";
    }
    else if (info.anotherCondition) {
        return "anotherStringAgain";
    }
    else if (lastCondition) {
        return "string ...";
    }
    else return "lastButNotLeastString";
}

每个条件分支都返回一个String。

由于if-else语句难以阅读,测试和维护,我该如何替换? 我在考虑使用Chain of Responsability Pattern,在这种情况下是否正确? 有没有其他优雅的方式可以做到这一点?

2 个答案:

答案 0 :(得分:0)

我只是将return s:

分解出来
return
    info.isSomeBooleanCondition ? "someString" :
    info.isSomeOtherCondition   ? "someOtherString" :
    info.anotherCondition       ? "anotherStringAgain" :
    lastCondition               ? "string ..." :
    "lastButNotLeastString"
;

答案 1 :(得分:0)

根据有关问题的有限信息和给出的代码,它看起来像是一种类型切换的情况。默认解决方案是使用继承:

class Info {
public abstract String method();
};

class BooleanCondition extends Info {
    public String method() {
         return "something";
};

class SomeOther extends Info {
    public String getString() {
         return "somethingElse";
};

在这种情况下有趣的模式是装饰器,策略和模板方法。责任链还有另一个重点。链中的每个元素都实现逻辑来处理一些命令。链接时,如果命令无法处理,则对象会转发该命令。这实现了一个松散耦合的结构来处理不需要集中调度的命令。

如果在条件上计算字符串是一个操作,并且从类的名称我猜它可能是表达式树,你应该看看访问者模式。