2013-12-13 40 views
3

我有关于代码结构的问题。解析Java中的命令行参数的代码结构

我已经让我们说三种套餐A,B和C

现在,在程序包A类包含了包含main()函数的类。这些类 需要一些命令行参数才能运行。

在包B中,有些类包含一些需要在不同时间配置的公共变量。例如,在调用函数A之前,应该设置或重置变量,输出根据此变量而不同。

在包C中,使用包B中的类来执行一些任务。他们确实如前所述配置变量。不仅在创建对象时,而且在中间阶段。

程序包A也有类,它们依次使用程序包B和程序包C中的类。为了配置B和C类中的变量,包含main()函数的程序包A中的类,读取命令行参数和将正确的值传递给相应的类。

现在,鉴于这种情况,我想使用Apache Commons CLI解析器。

我无法理解我应该如何编写我的代码以优雅的方式进行构造。这种情况下的良好设计实践是什么?

最初我写了一个没有Apache的类来解析命令行参数。

因为我想要一个关于设计问题的建议,所以我会给出一段代码摘录而不是完整的代码。

public class ProcessArgs 
{ 
    private String optionA= "default"; 
    private String optionB= "default"; 
    private String optionC= "default"; 

    public void printHelp() 
    { 
     System.out.println ("FLAG : DESCRIPTION : DEFAULT VALUE"); 
     System.out.println ("-A <Option A> : Enable Option A : " + optionA); 
     System.out.println ("-B <Option B> : Enable Option B : " + optionB); 
     System.out.println ("-C <Option C> : Enable Option C : " + optionC); 
    } 

    public void printConfig() 
    { 
     System.out.println ("Option A " + optionA); 
     System.out.println ("Option B " + optionB); 
     System.out.println ("Option C " + optionC); 
    } 

    public void parseArgs (String[] args) 
    { 
     for (int i=0;i<args.length;i++) 
     { 
     if (args[i].equalsIgnoreCase ("-A")) 
      optionA = args[++i]; 
     else if (args[i].equalsIgnoreCase ("-B")) 
      optionB = args[++i]; 
     else if (args[i].equalsIgnoreCase ("-C")) 
      optionC = args[++i]; 
     else 
      throw new RuntimeException ("Wrong Argument : " + args[i] + " :: -h for Help."); 
    } 
    } 
} 

注意事项 -

  • 我已经有50多个命令行选项,他们都在同一个地方。
  • 每个班级只使用一组命令行选项。

我试图写一个接口,但不知何故,但我不成功。我不确定这是否是一种很好的方法。我需要一些设计指导。

这里是我写的代码 -

public interface ClassOptions 
{ 
    Options getClassOptions(); 
    void setClassOptions(Options options); 
} 

public class Aclass implements ClassOptions 
{ 
    private String optionA="defaultA"; 
    private String optionB="defaultB"; 

    public Options getClassOptions() 
    { 
     Options options = new Options();  

     options.addOption("A", true, "Enable Option A"); 
     options.addOption("B", true, "Enable Option B");   

     return options; 
    } 

    public void setClassOptions(Options options, String args[]) 
    { 
     CommandLineParser parser = new BasicParser(); 
     CommandLine cmd=null; 
     try 
     { 
      cmd = parser.parse(options, args); 
     } catch (ParseException e) 
     { 
      // TODO Auto-generated catch block 
      // e.printStackTrace(); 
      System.out.println("ignored option"); 
     } 

     if(cmd.hasOption("A")) 
      optionA = "enabled"; 

     if(cmd.hasOption("B")) 
      optionB = "enabled";  
    } 
} 

我觉得代码这样写的问题是 -

  • 有不同类型的如int,双,字符串,布尔参数。如何处理它们。
  • getClassOption()和setClassOption()例如都包含参数“A”,“B”。这段代码很容易在编写代码时发生错误,这是我想消除的。
  • 我认为这里的代码重复,可以封装在另一个类中。
  • 并非所有参数都是必需的,但可以忽略。

谢谢!

+1

请发表您的界面的尝试,如提出您的代码没有明显的问题。你可以考虑使用[Commons CLI](http://commons.apache.org/proper/commons-cli/)。 –

回答

2

我会向你推荐JCommander。

我认为这是Java的一个非常好的参数解析器。

您可以在注释中定义所有参数,并调用JCommander来解析它。 最重要的是,它(基于您的注释)可以打印出相应的帮助页面。 你不必关心任何事情。

我相信你会爱上它! :)

看看吧:http://jcommander.org/ 有很多的例子和这样的!

祝你好运! :)

2

的命令行参数简单的例子

class CMDLineArgument 
{ 
    public static void main(String args[]) 
    { 
    int length=args.length(); 
    String array[]=new String[length]; 
    for(int i=0;i<length;i++) 
    { 
     array[i]=args[i]; 
    } 
    for(int i=0;i<length;i++) 
    { 
     System.out.println(array[i]); 
    }