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

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

  

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

Например, приложение может иметь команду «Копировать», «Вставить», «Удалить» Я думаю, что программа должна работать так:

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 голосов | спросил Tattat 20 MarpmSat, 20 Mar 2010 13:26:49 +03002010-03-20T13:26:49+03:0001 2010, 13:26:49

5 ответов


0

Если вас беспокоит обработка параметров командной строки , тогда CLI Commons предназначен для этого.
Просмотрите 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 
 }

- тогда

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

}
}
ответил Rakesh Juyal 20 MarpmSat, 20 Mar 2010 13:49:13 +03002010-03-20T13:49:13+03:0001 2010, 13:49:13
0

В зависимости от того, насколько прост ваш синтаксис командной строки, простым 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 в перечисление в производственном коде. Кроме того, valueOf выдает IllegalArgumentException, если нет перечисления константа найдена с указанным именем.


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

ответил polygenelubricants 20 MarpmSat, 20 Mar 2010 13:39:43 +03002010-03-20T13:39:43+03:0001 2010, 13:39:43
0

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

ответил Thilo 20 MarpmSat, 20 Mar 2010 13:31:36 +03002010-03-20T13:31:36+03:0001 2010, 13:31:36
0

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

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

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

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

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

ответил duffymo 20 MarpmSat, 20 Mar 2010 14:31:19 +03002010-03-20T14:31:19+03:0002 2010, 14:31:19
0

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

ответил lbedogni 20 MarpmSat, 20 Mar 2010 13:42:16 +03002010-03-20T13:42:16+03:0001 2010, 13:42:16

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132