2013-12-13 68 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]); 
    }