0

次のようなコードがあります。

void processObjectRecursively(Object obj)
{
    Field[] fields = obj.getClass().getDeclaredFields();

    for(Field field : fields)
    {
        FieldType type = FieldUtils.getType(field); // FieldType is enum
        Object value = field.get(obj);

        switch(type)
        {
            case A:
            processObjectRecursively(value);
            continue;

            case LIST:
            processList((List<?>)value);
            continue;

            case B:
            processB(value);
            continue;

            case C:
            processC(value);
            continue;
        }
    }
}

void processList(List<?> list)
{
    for(Object obj : list)
    {
        processObjectRecursively(obj);
    }
}

void processB(Object obj)
{
    // do something
}

void processC(Object obj)
{
    // do something
}

今。私はこの長いスイッチケースが好きではありません。したがって、コマンドを作成し、タイプがキーで値が対応するコマンド オブジェクトである Map に入力することを考えています。これにより、メソッドは次のようになります。

void processObjectRecursively(Object obj)
{
    Field[] fields = obj.getClass().getDeclaredFields();

    for(Field field : fields)
    {
        FieldType type = FieldUtils.getType(field); // FieldType is enum
        Object value = field.get(obj);
        Command command = commandMap.get(type);
        command.execute(value, this); // 'this' needed for calling processObjectRecursively()
    }
}

しかし、そのためには、1 つのインターフェースとさらに 4 つのクラスを作成する必要があります。では、このアプローチは大丈夫ですか、それとも過度に設計されていますか? 同じ効果を達成するための他のより簡単なアプローチを提案できますか?

4

4 に答える 4

2

ここでは、コマンド パターンが適切に聞こえます。しかし、 を使用する代わりに、さまざまな値の型でこれを解決する可能性を探したいと思いますObject。したがって、次のようにワンライナーで簡単に書くことができます。

value.process()
于 2012-05-25T07:20:46.330 に答える
1

処理する新しいタイプがある場合はどうなりますか。最初のアプローチでは、ケースを追加します。スイッチの場合。コマンドパターンを使用する場合は、新しいコマンドとそのタイプ、および稼働中のコマンドを注入する必要があります。私はいつでも2番目のアプローチを使用します

また、なぜこれを渡す必要があるのですか? recurciveProcessing は、マップを使用してリクエストを処理するコマンドを取得するコマンドにすることができますか?

于 2012-05-25T07:10:55.077 に答える
1

switch case ステートメントを避ける方が常に良いことに同意します。したがって、コマンド マップを作成するだけで済みます。もう 1 つの簡単な方法は、enum 内に process メソッドを追加して、すべての enum 型がデータの処理方法を認識できるようにすることです。

于 2012-05-25T07:23:49.810 に答える
0

そのスイッチブロックには何の問題もありません。JVM には、パフォーマンスに影響を与えない優れた処理方法があります。

于 2012-05-25T07:07:28.500 に答える