用OO方法替换if else

时间:2013-02-26 13:48:06

标签: java oop if-statement

让我说我有:

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,我会知道我需要从类中创建一个实例,该实例映射为零,依此类推。

但是现在我在想如果我在if条件中没有静态值,有什么办法可以做,因为例如返回的内容:instance.getOCount()可能会有所不同,具体取决于配置。

你能否告诉我如何实现这个目标?

4 个答案:

答案 0 :(得分:11)

如果您有许多不同的if else语句,则可以使用Strategy Pattern。这有助于您创建符合最佳实践的可管理代码。

答案 1 :(得分:5)

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

答案 2 :(得分:3)

如果您使用NavigableMap,例如TreeMap,关键是您的阈值和值为Callable s,那么您将能够检索到相应的{{1}所有在一个班轮中调用它。相关方法是Callable

NavigableMap#ceilingEntry

答案 3 :(得分:1)

我认为使用模式不是解决方案......一切都比原始代码更难阅读。但如果你确定,这是一个选择: 假设您的实例属于类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;
}

}

注意休息,我假设你的代码中只有一个动作可以执行 如果您不需要返回值,则可以使用抽象类而不是接口来进行if(select)action(); AbstractDynamicAction类的一部分代码将更好

Java7并没有真正帮助做那种事情。关闭会让眼睛看起来更容易......但是恕我直言,你的原始多重IF是可行的方式。