2016-06-15 3 views
0

Таким образом, я создаю приложение, которое работает через консольные команды (подумайте о «базе данных нового db_name»). Какой самый элегантный способ справиться с такими вещами?Элегантный способ разбора консольных команд в java

Heres мой маленький прототип, в основном просто тонны переключателей. Я имею в виду это работает, но это становится своего рода грязным, когда я хочу, чтобы добавить такие вещи, как положить все параметры, если вы передаете неправильный или слишком мало, так что им интересно, если Theres лучший вариант:

public static void main(String[] args) { 
    while (running) { 
     Scanner in = new Scanner(System.in); 
     String cmd = in.nextLine(); 

     parseCmd(cmd); 
    } 
} 

private static void parseCmd(String s) { 
    String[] cmd = s.split(" "); 
    try { 
     switch (cmd[0]) { 
      case "exit": 
       running = false; 
       System.out.println("Shutting down..."); 
       break; 

      case "database": 
       switch (cmd[1]) { 
        case "new": 
         databases.add(new Database(cmd[2])); 
         break; 

        default: 
         System.out.println("Unknown parameter"); 
         break; 
       } 
       break; 

      default: 
       System.out.println("Unknown command"); 
       break; 
     } 
    } catch (Exception ArrayIndexOutOfBoundsException) { 
     System.out.println("Too few arguments passed"); 
    } 
} 
+0

Я вы использовали эту библиотеку apache https://commons.apache.org/proper/commons-cli/usage.html и отлично работали –

+1

Этот вопрос может быть лучше подходит для [Code Review Stack Exchange] (http: // codereview. stackexchange.com), поскольку он уже работает. Один из вариантов, который приходит на ум для вас, - использовать шаблон команды для обработки различных команд, поступающих с консоли. –

+0

для этих случаев Мне нравится использовать перечисления –

ответ

2

Я не знаю о наиболее элегантный способ, но я сделал что-то вроде этого пару раз и придумал это решение.

Создайте класс для «базы данных», который представляет команду, как только вы найдете строку «база данных», вы извлекаете экземпляр этого класса и передаете ему оставшиеся аргументы, чтобы он мог выполнять остальную часть синтаксического анализа.

class DataBaseCommand implements Command { 
    @Override 
    public void eval(String[] args) {...} 
} 

Вы можете сохранить статическую карту из этих команд, отображенных на их имена:

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

static { 
    commands.put("database", new DataBaseCommand()); 
} 
switch (cmd[0]) { 
    case "exit": 
     running = false; 
     System.out.println("Shutting down..."); 
     break; 
    default: 
     if(commands.contains(cmd[0])) { 
      commands.get(cmd[0]).eval(cmd); 
     } else { 
      System.out.println("Unknown command"); 
     } 
     break; 
} 
+0

Я думаю, что это лучшее решение, его не очень раздутое и до сих пор позволяет настроить, я думаю, что он идеально подходит для такого масштаба проекта, спасибо – nn3112337

0

Может быть, вы могли бы используйте библиотеку, которая выполняет много команд для вас, например joptsimple?

0

Я предложил бы использовать http://jcommander.org/ .Its простой и элегантный. В нем вы можете использовать встроенные аннотации например, создать класс, как это с помощью jcommander annotaions

@Parameters(commandNames = {"test", "Manages dates"}) 
public class CommandOption { 

    @Parameter(names = {"-e", "--exit"}, description = "bla bla") 
    public boolean exit = false; 


} 

then in main method 


     public static void main(String... args){ 

     CommandOption opt = new CommandOption(); 
      JCommander jc = new JCommander(opt); 

      jc.parse(args); 

    //and now use 
     System.out.println("value" +opt.exit) 
    } 

, а затем может пройти parmaeters, как java class -e истинной или, может быть, лучше, если вы можете создать банку и затем java -jar 'jar' -e true

Смежные вопросы