重构仅由一个函数调用不同的代码块

Ser*_*iev 2 c# code-reuse

我有类似的公式来计算哈特利变换.唯一的区别是输入函数 - sin,cos,exp在以下代码行中:

Math.Exp((double)tau)
Math.Sin((double)tau)
Math.Cos((double)tau)
Run Code Online (Sandbox Code Playgroud)

如何在以下片段中逃避几乎相同的代码片段并缩短我的代码?

 private void CountHartley(ref double [] arr, string function)
        {
            int N = arr.Length;
            if (function == "exp")
            {
                for (int nu = 0, tau = 0; ((nu < N) && (tau < N)); nu++, tau++)
                {
                    arr[nu] = 1 / (double)N *
                                 Math.Exp((double)tau) *
                                 (Math.Sin(2 * Math.PI * nu * tau / (double) N) +
                                 Math.Cos(2 * Math.PI * nu * tau / (double) N));
                }
            }
            else if (function == "sin")
            {
                for (int nu = 0, tau = 0; ((nu < N) && (tau < N)); nu++, tau++)
                {
                    arr[nu] = 1 / (double)N *
                                 Math.Sin((double)tau) *
                                 (Math.Sin(2 * Math.PI * nu * tau / (double)N) +
                                 Math.Cos(2 * Math.PI * nu * tau / (double)N));
                }
            }
            else
            {
                for (int nu = 0, tau = 0; ((nu < N) && (tau < N)); nu++, tau++)
                {
                    arr[nu] = 1 / (double)N *
                                 Math.Cos((double)tau) *
                                 (Math.Sin(2 * Math.PI * nu * tau / (double)N) +
                                 Math.Cos(2 * Math.PI * nu * tau / (double)N));
                }
            }
}
Run Code Online (Sandbox Code Playgroud)

dtb*_*dtb 6

string您可以直接传递函数,而不是使用要使用的函数.

您可以使用Func <T,TResult> Delegate,如下所示:

private void CountHartley(ref double [] arr, Func<double, double> function)
{
    int N = arr.Length;
    for (int nu = 0, tau = 0; ((nu < N) && (tau < N)); nu++, tau++)
    {
        arr[nu] = 1 / (double)N *
                     function((double)tau) *
                     (Math.Sin(2 * Math.PI * nu * tau / (double) N) +
                     Math.Cos(2 * Math.PI * nu * tau / (double) N));
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

var result = CountHartley(arr, Math.Cos);
Run Code Online (Sandbox Code Playgroud)

  • `ref`也不需要,'nu`和`tau`似乎总是一样的.所以代码确实可以重构一下.但我会保持原样,所以OP可以更容易地发现他/她自己的代码的差异. (2认同)