如何简化这个逻辑/代码?

时间:2010-03-20 10:26:49

标签: java optimization

我想编写一个接受用户命令的应用程序。 user命令以这种格式使用:

  

command -parameter

例如,应用程序可以有“复制”,“粘贴”,“删除”命令 我认为该程序应该像这样工作:

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 个答案:

答案 0 :(得分:7)

根据命令行语法的简单程度,简单的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 pastejava Command bleh等编译并运行此功能。您需要将剩余的args传递给生产代码中的枚举。此外,如果找不到具有指定名称的枚举常量,valueOf将抛出IllegalArgumentException


但是,如果您的语法变得更加复杂,您可能希望使用专门用于命令行解析的库,例如: Apache Commons CLI

答案 1 :(得分:7)

如果您担心处理命令行参数,那么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 
 }

- 那么

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

}
}

答案 2 :(得分:3)

使用库来保持命令行参数解析的混乱,例如args4j

答案 3 :(得分:1)

当我看到很多if / then / else代码时,我立刻认为多态是一种可能的解决方案。

命令界面和地图将是解决此问题的好方法。如果我用Java编写它,它可能看起来像这样:

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

如果您的操作是多线程的,则可以简单地为不返回值的命令重用Runnable接口,并且Callable&lt; T&gt;对于那些。

在任何一种情况下,现在你的if / then / else构造都是一个Map,其中键是名称,值是Command对象。您通过提供名称密钥来查找命令。您可以通过编写Command接口的新实现并将其添加到Map来添加新命令。初始化Map是您在启动时执行的操作。您甚至可以将其外部化为配置,这样您就不必修改代码来添加新代码(开放/封闭原则)。

答案 4 :(得分:0)

有许多库可以处理这种情况,而不是写下所有代码。