在java中处理n个if-else的更好方法

时间:2017-02-24 11:36:20

标签: java if-statement optimization conditional-statements

我想知道是否有更好的办法来处理n号。 of Java中的if / else-if块。

我有一种情况需要根据n no打印不同的值。 of if / else-if / conditions阻止像

if(p==1 && q==r)
  System.out.println("Condition 1");
else if(r==p && q==9)
  System.out.println("Condition 2");
else if(z==1 && s==r)
  System.out.println("Condition 3");
else if(p==1 || x==r && y==7)
  System.out.println("Condition 4");
else if(q==z && y==r || p==4)
  System.out.println("Condition 5");
else if(x==z && r==5 || z==30)
  System.out.println("Condition 6");
else if(s==1 || q==x)
  System.out.println("Condition 7");
else if(r==14 || q==r++ || z==y)
  System.out.println("Condition 8");
else if(q==18 && s==r || p==90)
  System.out.println("Condition 9");
else if(y==19 || q==89)
  System.out.println("Condition 10");
...

是否有任何其他方法来处理它而不是放置多个if / else if语句,以便在以后任何新条件出现时,它将很容易处理它。

3 个答案:

答案 0 :(得分:1)

真正的答案是:不要这样做。

在良好的OO设计中,您可以用非常不同的方式解决这个问题;例如,通过使用多态。您实际上希望避免拥有许多不同的信息来源,然后就此做出决定。

在你的情况下;我会考虑FSM和state pattern

我的意思是:您的代码正在显示某种"方法"解决问题。只要您按原样保留这种方法,您就谈论如何找到在“最不丑”的情况下表达解决方案的方法。办法。

相反,你应该退后一步,研究一下可以表达的方法,非常漂亮"方式。

因此:没有"简单"直接回答你的问题。您必须退后一步,仔细查看您想要实现的要求;然后设计一个更好的,更多的OO"解决方案。

这里最小的事情:你可以从声明如下的枚举开始:

public enum Condition {
  A, B, C, ...

然后你会有一些隐藏所有这些陈述的工厂方法;像:

Condition currentCondition = determineCondition(p, q, r, z);
switch(currentCondition) {
  case A:

含义:你至少要集中注意力#34;那些知识可以避免代码重复。但是又一次;这就像在一辆旧的,生锈的汽车上涂上一些新颜色。它暂时有用,但并没有真正改善。

关于你的评论:是的,这个开关只是略微改变了#34;更好的"而不是elses。但是正如你所说:你不能创造太多机会,所以至少你想拥有确定状态的一个代码。

但最后:我认为你正在接近这个错误的水平。您可能正在处理某种复杂的业务逻辑;你希望在这样的低级别上解决这个问题。但是,你在这样的水平上做的 nothing 将导致一个强大的,长期可维护的解决方案。可能真正的解决方案是退后一步,研究使用某种workflow engine

答案 1 :(得分:1)

你可以创建一个接受所有变量的Condition(接口或超类):

public interface Condition {
    boolean isConditionMet(int p, int q, int r, int s, int x, int y, int z);
    void performAction();
}

对于每个条件,您可以覆盖/实现布尔方法isConditionMet()。

public class C1 implements Condition {
    public boolean isConditionMet(int p, int q, int r, int s, int x, int y, int z) {
        return p == 1 && q == r;
    }
    public void performAction() {
        System.out.println("Condition 1");
    }
}

然后你可以将所有条件都放在一个集合中,对于你所拥有的每个条件,你可以问:

if (condition.isConditionMet())
    condition.performAction();

现在每个条件对象本身负责何时应该行动, 它应该做什么。关注点的完美分离。

答案 2 :(得分:1)

Downvote诱饵

当你说“如果出现任何新情况”时,你是否意味着你愿意在新条件出现时修改代码,或者代码是否必须适应而不进行修改?如果是前者,我认为你已经做到了最好的方式。 (虽然,我会在顶部添加if (false){},所以所有实际情况看起来都一样,可以很容易地重新排列它们。)如果是后者,那么需要一个表格驱动的方法。如果每个案例都有一个print语句,则性能不是问题。如果你关心表现,那么先把最常见的案例放在首位。

如果您更关心性能,请使用if语句树而不是梯形图。所以,例如,有这样的事情,所以你不会反复提出同样的子问题:

if (p == 1){
    .. all the cases where p is 1
} else {
    .. all the other cases
}

可能还有其他与OO相关的方法来编写此方法,但没有一种方法比这更快或更容易修改。