5

可能重复:
在程序中替换或替换 if..else if..else 树的最佳方法是什么?

如何避免多个 if 条件?例如:

Public void search(String a,b,c,d,e)
String aTerm;

现在传递参数的单个和多个组合中的哪个包含“aTerm”?例如,输出可能如下:

1 - aTerm appears in "a" only
2 - aTerm appears in "a,c", and "e"
3 - aTerm appears in "d" and "e"

对于每个单个或可能的组合,我想调用一个特定的函数。我写了很多 if 条件,但看起来很糟糕。例如:

If(aTerm. equalsIgnoreCase(a)){ call function a();}
If(aTerm. equalsIgnoreCase(b)){ call function b();}
If(aTerm. equalsIgnoreCase(b) and aTerm. equalsIgnoreCase(b)){ call function ab();}
…………………… and so on………………………….

有没有更清洁的方法呢?解决方案可以是 PHP 或 Java。

4

4 回答 4

1

构建一个字符串并通过字符串的名称调用该方法:

// Psuedo-code
str = "";
If( aTerm.equalsIgnoreCase(a)) str += "a";
If( aTerm.equalsIgnoreCase(b)) str += "b";
If( aTerm.equalsIgnoreCase(c)) str += "c";
If( aTerm.equalsIgnoreCase(d)) str += "d";
If( aTerm.equalsIgnoreCase(e)) str += "e";
call function named by str
于 2012-12-30T20:05:35.527 回答
1

多态可以代替 ifs/switch:

interface LogicWithMatcher {
    boolean match(String aTerm);
    void yourFunction();
}

class MatcherA implements LogicWithMatcher() {...}
class MatcherB implements LogicWithMatcher() {...}
class MatcherC implements LogicWithMatcher() {...}
class MatcherD implements LogicWithMatcher() {...}
class MatcherE implements LogicWithMatcher() {...}

如果您必须将一个函数与给定的输入匹配:

public LogicWithMatcher search(String yourString) {
    LogicWithMatcher[] logics = {new MatcherA(), new MatcherB ...}
    for (LogicWithMatcher logic : logics) {
        if (logic.match(yourString)) 
            return logic;
    return null;
}

String yourString = "....."
LogicWithMatcher logic = search(yourString);
if (logic != null) 
    logic.yourFunction();
else
    print("nothing matched");

或者,如果您给定的输入可能匹配多个函数:

public void runFunctionsFor(String yourString) {
    LogicWithMatcher[] logics = {new MatcherA(), new MatcherB ...}
    for (LogicWithMatcher logic : logics) {
        if (logic.match(yourString)) 
            logic.yourFunction();
}

String yourString = "....."
runFunctionsFor(yourString);
于 2012-12-30T20:09:01.907 回答
0

我可能会做这样的事情:

public class YourClass {
    static Runnable[] targets = new Runnable[32];

    public void search(String a, String b, String c, String d, String e) {
        int tgt = 0;
        if(a.indexOf(aTerm) >= 0) tgt |= 1;
        if(b.indexOf(aTerm) >= 0) tgt |= 2;
        if(c.indexOf(aTerm) >= 0) tgt |= 4;
        if(d.indexOf(aTerm) >= 0) tgt |= 8;
        if(e.indexOf(aTerm) >= 0) tgt |= 16;
        targets[tgt].run();
    }
}

然后,只需将要运行的各种函数包装在Runnables 中,并将它们存储在targets. 我很确定这比使用反射的效果要好得多。

于 2012-12-30T20:12:05.077 回答
0

有没有更清洁的方法呢?

我认为简短的回答是“不”。

有多种方法可以在 Java 中对此进行编码,以避免显式的 if/else 语句链,但最终结果通常比原始代码更复杂。在我看来,“干净”的代码应该意味着代码易于(更容易)阅读。

在您的示例中,您有一个固定的方法签名和一个固定的谓词结构。IMO,if/else 链是 Java 中的自然解决方案。

于 2012-12-30T20:33:48.517 回答