3

コマンドラインから複数の引数を渡す必要があるプロジェクトに取り組んでいます-

以下は私が持っているユースケースです-

  1. コマンドラインから、少なくとも4つのパラメーター、、、、noOfThreadsを渡すのでnoOfTasks、これらの4つstartRangetableName1渡す場合は、変数に格納する必要があります。テーブル名については、文字列リストに追加する必要があります。他のコードで使用できるようにします。

  2. 次に、上記のように4つではなく5つのパラメーターを渡すことができます。したがって、5つのパラメーターは、、、、、およびにnoOfThreadsなります。だからここに余分があります。したがって、これら5つのものを渡す場合は、変数に格納する必要があります。ここでは、2つのテーブルとして渡すので、これら2つのテーブルを文字列リストに格納します。noOfTasksstartRangetableName1tableName2tableName2tableName1tableName2

  3. 第三に、上記のように5つではなく6つのパラメーターを渡すことができます。したがって、 6つのパラメーターは、、、、、、およびnoOfThreadsになります。だからここに余分があります。したがって、これらの6つのものを渡す場合は、変数に格納する必要があります。ここでは、を3つのテーブルとして渡すので、これらの3つのテーブルを文字列リストに再度格納します。noOfTasksstartRangetableName1tableName2tableName3tableName3tableName1tableName2tableName3

したがって、上記のシナリオでは、以下のコードがあります。以下に説明するように、コードに多くの繰り返しがあるため、現在は非常に醜いように見えます。もっときれいにする方法はありますか?

以下は私のコードです-

private static List<String> databaseNames = new ArrayList<String>();
private static int noOfThreads;
private static int noOfTasks;
private static int startRange;
private static String tableName1;
private static String tableName2;
private static String tableName3;

public static void main(String[] args) {

if (args.length > 0 && args.length < 5) {

    noOfThreads = Integer.parseInt(args[0]);
    noOfTasks = Integer.parseInt(args[1]);
    startRange = Integer.parseInt(args[2]);
    tableName1 = args[3];
    databaseNames.add(tableName1);
} else if (args.length > 0 && args.length < 6) {
    noOfThreads = Integer.parseInt(args[0]);
    noOfTasks = Integer.parseInt(args[1]);
    startRange = Integer.parseInt(args[2]);
    tableName1 = args[3];
    tableName2 = args[4];
    databaseNames.add(tableName1);
    databaseNames.add(tableName2);
} else {
    noOfThreads = Integer.parseInt(args[0]);
    noOfTasks = Integer.parseInt(args[1]);
    startRange = Integer.parseInt(args[2]);
    tableName1 = args[3];
    tableName2 = args[4];
    tableName3 = args[5];
    databaseNames.add(tableName1);
    databaseNames.add(tableName2);
    databaseNames.add(tableName3);
}
}
4

2 に答える 2

2

あなたにはたくさんの冗長性があります、そしてあなたがそれを見るとき、単純化するための方法を使ったリファクタリングを考えてください。それは事実上、私がやろうとしていることです。また、tableNamesにString []フィールドを設定することを検討してください。String[] tableNamesこれにより、パラメーター数がわかれば、必要なサイズの配列として宣言できます。例えば:

public void fillParams(String[] args) {
    if (args.length < someMinimum) {
       // throw some exception
    }
    noOfThreads = Integer.parseInt(args[0]);
    noOfTasks = Integer.parseInt(args[1]);
    startRange = Integer.parseInt(args[2]);

    tableNames = new String[args.length - 3];
    for (int i = 0; i < tableNames.length; i++) {
       tableNames[i] = args[i + 3];
       databaseNames.add(tableNames[i]);
    }
}
于 2013-02-10T05:58:08.503 に答える
0

tableName1-tableName3を削除することをお勧めします。これらは冗長であり、いつでも次のようにテーブル名を取得できます。

tablename1 =  databaseNames.get(0);

これは私のバージョンです:

public static void main(String[] args) {
    if (args.length < 4) {
        System.err.println("Usage: ....");
        System.exit(1);
    }
    noOfThreads = Integer.parseInt(args[0]);
    noOfTasks = Integer.parseInt(args[1]);
    startRange = Integer.parseInt(args[2]);
    for(int i = 3; i < args.length; i++) {
        databaseNames.add(args[i]);
    }
}
于 2013-02-10T06:14:21.467 に答える