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() {...}

1つの関数を特定の入力に一致させる必要がある場合:

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 に答える