2013-03-16 96 views
-1

我在嵌套,如果我們的核心Java應用程序中的條件面臨巨大的問題 代碼摘要如下....如果條件 您可以有近20嵌套你能告訴我如何優化一段代碼?嵌套,如果條件

如果條件可能有嵌套條件,並且從Java應用程序的設計角度來看可能是一個巨大的問題,那麼避免嵌套的更好方法是什麼?

請在Java的Java版本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多了,就會切換工作then.20操作是一個巨大的很多。

回答

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()); 
} 

要小心該Operation.valueOf可能行NullPointerException如果操作爲空或IllegalArgumentException如果操作不是其中之一操作枚舉

1

改爲使用switch聲明。當你有很多決定時使用這個。

請注意,只有在想要在switch語句中使用String時,才能在JDK 7中發生此情況。在舊版本enum可能會有所幫助。

+0

很遺憾,我們不知道涉及的類型或OP使用的Java版本。這可能也可能不合適 - 在你的答案中值得明確的是這一點。 – 2013-03-16 09:39:45

+0

@ JonSkeet,使用的版本是java 1.6 – Deepak 2013-03-16 09:41:18

0

根據你的代碼,它應該總是滿足condition.equals(add)來執行下一行。根據網絡中的條件,它永遠不會滿足下一個條件。當它進入下一行代碼時。

要使用的字符串條件數檢查

您可以使用switch

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

邊注:打開可從Java7字符串。

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(); 
1

如果if語句不需要嵌套,則可以使用命令模式。

首先,在匹配器和命令之間建立一個映射。這些命令遵循一個通用的調用接口,如Runnable,Callable或如我的示例Command。該示例演示如何動態創建包裝並使用靜態或非靜態類。如果實際的命令在手之前是未知的,那麼這種模式很實用,因爲稍後可能添加和刪除命令。

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"); 
    } 
} 
+0

,你能給出一個工作的例子,以便我可以在我的系統中運行,或者你可以在www.ideone.com後面的java部分 – Deepak 2013-03-16 10:50:46

+0

@Deepak我認爲代碼適用於你給出的例子(你的方法沒有參數)。但是,我會嘗試做一個完整的例子,而不完全知道你需要什麼。 – 2013-03-16 11:54:12

+0

@ Roger.but在這裏我們不添加數字。你只需調用add(),sub()方法。 – Deepak 2013-03-16 15:25:23

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 pattern

1

您可以將add,sub,div, cos ...放入有序列表/數組中。然後使用for循環迭代列表。使用break運營商和reflection調用適當的方法。

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。如果沒有,你需要像Accessing Private Methods

注意:如果你正在製作一個計算器(對嗎?),也許Reverse Polish notation更好。