我有關於代碼結構的問題。解析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」。這段代碼很容易在編寫代碼時發生錯誤,這是我想消除的。
- 我認爲這裏的代碼重複,可以封裝在另一個類中。
- 並非所有參數都是必需的,但可以忽略。
謝謝!
請發表您的界面的嘗試,如提出您的代碼沒有明顯的問題。你可以考慮使用[Commons CLI](http://commons.apache.org/proper/commons-cli/)。 –