用OO方法代替else



假设我有:

if (count <= instance.getFCount()) {
    //do something and return String
} else if (count <= instance.getFSCount()) {
    //do something and return String
} else if (count <= instance.getTCount()) {
    //do something and return String
} else if (count <= instance.getOCount()) {
    //do something and return String
}

我在想我怎么能把这个代码替换成更面向对象的东西。问题是,如果我有这样的语句:

if (count <= 0) {
    //do something and return String
} else if (count <= 1) {
    //do something and return String
} else if (count <= 2) {
    //do something and return String
} else if (count <= 3) {
    //do something and return String
}

我可以用一些工厂模式或基于枚举的方法来替换它,因为我的值0,1,2,3总是静态的。例如,我将创建一个映射来根据数字保存类,然后如果我的计数为0,我将知道我需要从映射为0的类创建一个实例,以此类推。

但现在我在想,如果我没有在if条件下的静态值,如果有任何方法可以做,因为例如返回到这个:instance.getOCount()可能根据配置而不同。

你能给我一些想法如何实现这一点吗?

当您有许多不同的if else语句时,您可以使用策略模式。这可以帮助您创建符合最佳实践的可管理代码。

我认为没有必要用设计模式代替这样一个简单的逻辑,这是不合理的。switch将是一个改进(假设count是一个整数),但为什么要创建一堆类?只有当每个人都有额外的、不同的行为时,它才合理。

如果使用NavigableMap(如TreeMap),键是阈值,值是Callable,则可以检索适当的Callable并调用它,这一切都在一行代码中完成。相关方法为NavigableMap#ceilingEntry

final NavigableMap<Integer, Callable<String>> strats = new TreeMap<>();
...
return strats.ceilingEntry(val).getValue().call(args);

我不认为使用模式是这里的解决方案…所有内容都将比原始代码更难阅读。但如果你确定,这是一个选择:让我们假设你的实例属于一个类User。创建接口

public interface IDynamicAction<T> {
boolean select(T t);
String action(T t);
}

列一个清单

List<IDynamicAction<User>> actions = new ArrayList<IDynamicAction<User>>();
actions.add(new IDynamicAction<User>() {
@Override
public boolean select(User instance) {
    return count <= instance.getFSCount();
}
@Override
public String action(User t) {
    System.out.println("count <= instance.getFSCount()");
    return "count <= instance.getFSCount()";
}
});

actions.add(new IDynamicAction<User>() {
@Override
public boolean select(User instance) {
    return count <= instance.getTCount();
}
@Override
public String action(User t) {
    System.out.println("count <= instance.getTCount()");
    return " count <= instance.getTCount()";
}
});
actions.add(new IDynamicAction<User>() {
@Override
public boolean select(User instance) {
    return count <= instance.getOCount();
}
@Override
public String action(User t) {
    System.out.println("count <= instance.getOCount()");
    return " count <= instance.getOCount()";
}
});

并使用

执行代码
for(IDynamicAction<User> action : actions){
if(action.select(instance)){
    String s = action.action(instance);
    System.out.println(s);
    break;
}

}

注意break,我假设在你的代码中只有一个动作可以执行如果你不需要返回值,你可以使用抽象类而不是接口,并使If (select) action();作为AbstractDynamicAction类的一部分,代码将会更好

Java7并没有真正帮助做这类事情。闭包会让这些东西更容易看……但恕我直言,你原来的多重IF是可行的。

最新更新