Как упростить эту логику/код?

Я хочу записать приложения, который принимает пользовательскую команду. Пользовательская команда используется в этом формате:

команда - параметр

Например, приложение может иметь "Копию", "Вставку", команду "Delete", я думаю, программа должна работать как это:

public static void main(String args[]){

   if(args[0].equalsIgnoreCase("COPY")){
     //handle the copy command

   } else if(args[0].equalsIgnoreCase("PASTE")){
     //handle the copy command


   }/**
    code skipped
     **/


}

Так, это работает, но я думаю, что это станет все более сложным, когда у меня будет больше команды в моей программе, также, это отличается в чтение. Какие-либо идеи просто логике?

5
задан Arnis Lapsa 10 September 2010 в 12:42
поделиться

5 ответов

Если вас беспокоит обработка параметров командной строки , то для этого предназначен Commons CLI .
Просмотрите CommandLineParser

, и если вас беспокоит сложность вашего if-else , вы можете использовать шаблон команд

public interface Command {
     void exec();
}

public class Copy implements Command {    
     void exec() {
          // your copy Code 
     }
}

public class Paste implements Command {    
     void exec() {
          // your Paste Code 
     }
}


public class Delete implements Command {    
     void exec() {
          // your Delete Code 
 }

- {{ 1}} затем

public static void main(String args[]){
Map commandMap<String,Command> = new HashMap<String,Command>();
commandMap.put("Copy", new Copy());
commandMap.put("Paste", new Paste());
commandMap.put("Delete", new Delete());

if ( commandMap.containsKey(args[0]) ){
commandMap.get(args[0]).exec();

}
}
7
ответ дан 18 December 2019 в 09:06
поделиться

Используйте библиотеку, чтобы избежать беспорядка при синтаксическом анализе аргументов командной строки из вашего кода, например args4j .

3
ответ дан 18 December 2019 в 09:06
поделиться

В зависимости от того, насколько прост синтаксис вашей командной строки, простое enum может быть вашим решением

public enum Command {
    COPY {
        @Override void execute() {
            System.out.println("Copying...");
        }
    },
    PASTE {
        @Override void execute() {
            System.out.println("Pasting...");
        }       
    },
    DELETE  {
        @Override void execute() {
            System.out.println("Deleting...");          
        }
    },
    ;

    abstract void execute();

    public static void main(String args[]) {
        Command c = Command.valueOf(args[0].toUpperCase());
        c.execute();
    }
}

Скомпилируйте и запустите это с помощью java Command paste, java Command bleh и т.д. Вы захотите передать остальные args в enum в вашем производственном коде. Кроме того, valueOf бросает IllegalArgumentException, если не найдена константа перечисления с указанным именем.


Однако если ваш синтаксис окажется более сложным, вы можете использовать библиотеки, специально разработанные для разбора командной строки, например, Apache Commons CLI.

7
ответ дан 18 December 2019 в 09:06
поделиться

Существует множество библиотек, которые могут справиться с этой ситуацией вместо того, чтобы записывать весь код.

0
ответ дан 18 December 2019 в 09:06
поделиться

Когда я вижу много кода if / then / else, я сразу думаю о полиморфизме как о возможном решении.

Командный интерфейс и карта были бы прекрасным способом решить эту проблему. Если бы я писал это на Java, это могло бы выглядеть так:

public interface Command<T, V>
{
    V execute(T parameter) throws Exception;
}

Если ваши операции многопоточные, вы можете просто повторно использовать интерфейс Runnable для команд, которые не возвращают значение, и Callable для тех, которые делают .

В любом случае, теперь ваша конструкция if / then / else является Map, где ключ - это имя, а значение - объект Command. Вы можете найти команду, указав ключ имени. Вы добавляете новую команду, записывая новую реализацию командного интерфейса и добавляя ее на карту. Инициализация карты - это то, что вы делаете при запуске. Вы даже можете экстернализовать его как конфигурацию, чтобы вам не пришлось изменять код для добавления новых (принцип открытости / закрытости).

1
ответ дан 18 December 2019 в 09:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: