1

完了しなければならない重い計算アルゴリズムがあります。できるだけ効率的にするために、引数の数に基づいて 5 つのメソッドに分割しました。これにより、私は可能な限り節約することができます。とはいえ、ユーザーにそれを認識させたくありません。

public AnalysisResult[] PerformAnalysis(double[] Inputs, double[] Outputs, int[][] Coefficients)
{
    AnalysisResult[] AR = new AnalysisResult[Coefficients.Length];

    for (int i = 0; i < Coefficients.Length; i++)
        AR[i] = GetResults(Inputs, Outputs, /* Based on length of Coefficients[i]*/ );

    return AR;
}

private AnalysisResult GetResults(double[] Inputs, double[] Outputs, int A)
{
    // Do stuff
}

private AnalysisResult GetResults(double[] Inputs, double[] Outputs, int A, int B)
{
    // Do stuff
}

private AnalysisResult GetResults(double[] Inputs, double[] Outputs, int A, int B, int C)
{
    // Do stuff
}

private AnalysisResult GetResults(double[] Inputs, double[] Outputs, int A, int B, int C, int D)
{
    // Do stuff
}

private AnalysisResult GetResults(double[] Inputs, double[] Outputs, int A, int B, int C, int D, int E)
{
    // Do stuff
}

ご覧のとおり、ユーザーがアルゴリズムを呼び出すために使用できる public メソッドを 1 つだけにしたいと考えています。に渡される配列の長さに基づいて、どのプライベート メソッドを呼び出すかを簡単に判断する方法があるかどうか疑問に思っていPerformAnalysisます。

助言がありますか?

ここまでの私のアプローチは、配列の長さに基づく switch ステートメントでしたが、もっと良いアプローチがあると思います。

public AnalysisResult[] PerformAnalysis(double[] Inputs, double[] Outputs, int[][] Coefficients)
{
    AnalysisResult[] AR = new AnalysisResult[Coefficients.Length];

    for (int i = 0; i < Coefficients.Length; i++)
        switch (Coefficients[i].Length)
        {
            case 1:
                AR[i] = GetResults(Inputs, Outputs, Coefficients[i][0]);
                break;
            case 2:
                AR[i] = GetResults(Inputs, Outputs, Coefficients[i][0], Coefficients[i][1]);
                break;

            // Etc
        }                

    return AR;
}
4

2 に答える 2

4

そもそも、ループで複数回使用しているという事実は、Coefficients[i]私にとっては苦痛のように感じます。私が行う最初のリファクタリングは次のようになります。

// Names changed to fit .NET conventions
public AnalysisResult[] PerformAnalysis(int[][] coefficients)
{
    return Array.ConvertAll(coefficients, GetResult);
}

private AnalysisResult GetResult(int[] input)
{
    switch (input.Length)
    {
        case 1: return GetResult(input[0]);
        case 2: return GetResult(input[0], input[1]);
        case 3: return GetResult(input[0], input[1], input[2]);
        case 4: return GetResult(input[0], input[1], input[2], input[3]);
        case 5: return GetResult(input[0], input[1], input[2], input[3], input[4]);
        default:
            throw new ArgumentException("Invalid number of inputs: " + input.Length);
    }
}

それは、問題の前提である、さまざまなケースに対して別々のメソッドを本当に保持したいという前提です。

于 2013-08-06T10:43:22.057 に答える