-1

コアJavaアプリケーションのネストされたif条件で大きな問題に直面しています。コードの要約は次のとおりです。条件がこのコードを最適化する方法を教えてくれる場合、20近くのネストされたコードを持つことができます。

java.iの条件がネストされたif条件を持つことができるこのネストされたif条件を回避するためのより良い方法は何ですか?これはJavaアプリケーションの設計の観点から大きな問題になる可能性があります。

JavaJavaバージョン1.6のソリューションを手伝ってください

String condition = getCondition();
if (condition.equals(add)) { // add operation
    add();
    if (condition.equals(sub)) {// sub operation
        sub();
        if (condition.equals(div)) { //div operation
            div();
            if (condition.equals(cos)) { // cos operation
                cos();
            }
        }
    }
}

編集:私はもっと数学的な操作をすることができます、たとえば20以上、それから仕事を切り替えます.20の操作は膨大な量です。

4

7 に答える 7

2

if else-if 条件を代わりに次のように使用する必要があります。

String condition = getCondition();      
if(condition.equals(add))
    add();   
else if(condition.equals(sub)) 
    sub();   
else if(condition.equals(div))   
    div();   
else if(condition.equals(cos))   
    cos();  
于 2013-03-16T09:39:28.180 に答える
1

、、、、…を順序付きリスト/配列に入れるaddことができます。次に、ループを使用してリストを繰り返します。演算子とリフレクションを使用して、適切なメソッドを呼び出します。subdivcosforbreak

final String[] OPERATION_LIST = { "add", "sub", "div", "cos" };
String condition = getCondition();
for (String op : OPERATION_LIST) {
    if (condition.equals(op))
        getClass().getMethod(op).invoke(this);
    else
        break;
}

上記のforループは、ネストされたifステートメントと同じです。欠点は、他の数学メソッドがでなければならないことpublicです。そうでない場合は、プライベートメソッドへのアクセスのようなものが必要です。

注:電卓を作成している場合(あなたですか?)、逆ポーランド記法の方が良いかもしれません。

于 2013-03-16T10:10:56.080 に答える
1

状態パターン:

public enum Operation {
ADD {
    int execute(int a, int b) {
        return a + b;
    }
},
SUB {
    int execute(int a, int b) {
        return a - b;
    }
},
MUL {
    @Override
    int execute(int a, int b) {
        return a * b;
    }
},
DIV {
    @Override
    int execute(int a, int b) {
        return a / b;
    }
};

abstract int execute(int a, int b);

public static void main(String[] args) {
    Operation oper = getOperation();
    oper.execute(3, 4);
}

private static Operation getOperation() {
    return Operation.MUL;
}

}

このような:

public static void main(String[] args) {
    String operation = user set it
    Operation oper = getOperation(operation);
    oper.execute(3, 4);
}

private static Operation getOperation(String operation) {
    return Operation.valueOf(operation.toUpperCase());
}

操作が null の場合は Operation.valueOf が NullPointerException をスローし、操作が Operation 列挙型のいずれでもない場合は IllegalArgumentException をスローする可能性があることに注意してください。

于 2013-03-16T09:44:31.053 に答える
1

switch代わりにステートメントを使用してください。決定事項が多い場合に使用します。

Stringこれは、 inswitchステートメントを使用する場合にのみ JDK 7 で発生する可能性があることに注意してください。古いバージョンenumでは役立つかもしれません。

于 2013-03-16T09:36:40.120 に答える
1

if ステートメントをネストする必要がない場合は、コマンド パターンを使用できます。

まず、マッチャーとコマンドの間のマッピングをセットアップします。コマンドは、Runnable、Callable、または私の例のコマンドのように、一般的な呼び出しインターフェイスに準拠しています。この例では、ラッパーを動的に作成し、静的または非静的クラスを使用する方法を示します。このパターンは、後でコマンドを追加および削除できるため、実際のコマンドが事前にわかっていない場合に実用的です。

public class CommandExample {

    private interface Command {
        public void execute();
    }

    private Map<String, Command> commands = new HashMap<>();

    private void setUp() {
        commands.put("add", new Command() {
            public void execute() {
                add();
            }
        });
        commands.put("sub", new Sub());
        commands.put("arg", new Argument("the argument"));
    }

    private void add() {
        System.out.println("Add called");
    }

    private static class Sub implements Command {
        @Override
        public void execute() {
            System.out.println("Sub called");
        }
    }

    private class Argument implements Command {

        private final String arg;

        public Argument(String arg) {
            this.arg = arg;
        }

        @Override
        public void execute() {
            System.out.println("Argument called with arg " + arg
                    + " and access to outer class " + CommandExample.this);
        }
    }

    private void execute(String... names) {
        for (String name : names) {
            Command command = commands.get(name);
            if (command != null) {
                command.execute();
            } else {
                System.err.println("Command '" + name
                        + "' is not known. Only know " + commands.keySet());
            }
        }
    }

    public static void main(String[] args) {
        CommandExample commandExample = new CommandExample();
        commandExample.setUp();
        commandExample.execute("add", "sub", "arg", "unknown");
    }
}
于 2013-03-16T09:50:08.660 に答える
1

これに列挙型を使用する方法の例を次に示します。最初に列挙型を作成します

enum MathOperations{
    ADD, SUB, DIV, COS;
}

次に、このように使用できます

MathOperations m = MathOperations.valueOf(getCondition().toUpperCase);
switch(m) {
    case ADD: add(); break;
    case SUB: sub(); break;
    //and so on...
}

もちろん、 がgetCondition()要素を返す場合にのみ機能しMathOperationsます。そうしないと、 が得られIllegalArgumentExceptionます。


Strategy パターンを使用することもできます。

于 2013-03-16T09:55:44.493 に答える
0

あなたのコードによれば、condition.equals(add)次の行を実行するために常に満たす必要があります。ネット行の条件によると、次の条件を決して満たすことはありません。

文字列条件の数で確認するには

使用できますswitch

 String condition = getCondition();    
  switch(condition ) {
        case add:
            add();
            break;
        case sub:
            sub();
            break;
        // etc...
    }

補足: から入手できる弦のスイッチをオンにしますJava7

于 2013-03-16T09:39:15.403 に答える