我想知道是否有更好的办法来处理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语句,以便在以后任何新条件出现时,它将很容易处理它。
答案 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相关的方法来编写此方法,但没有一种方法比这更快或更容易修改。