【问题标题】:Refactoring blocks of code that differ only by one function call重构只有一个函数调用不同的代码块
【发布时间】:2012-04-28 14:48:45
【问题描述】:

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

Math.Exp((double)tau)
Math.Sin((double)tau)
Math.Cos((double)tau)

如何转义几乎相同的代码片段并缩短后续片段中的代码?

 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));
                }
            }
}

【问题讨论】:

    标签: c# code-reuse


    【解决方案1】:

    您可以直接传入函数,而不是传入带有要使用的函数的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));
        }
    }
    

    用法:

    var result = CountHartley(arr, Math.Cos);
    

    【讨论】:

    • 加倍的强制转换可能会被删除(并且 N 也被声明为加倍)。
    • ref 也不需要,nutau 似乎总是相同的。所以代码确实可以重构一下。但我会保持原样,以便 OP 可以更轻松地发现与他/她自己的代码的差异。
    • 非常感谢,帮了大忙。
    【解决方案2】:

    将 Math.* 作为参数传递给 Func&lt;double, double&gt; function 参数怎么样?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-25
      • 1970-01-01
      • 2017-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多