如何避免此处的代码重复

本文关键字:代码 何避免 | 更新日期: 2023-09-27 18:34:57

我在一个类中有两种方法风格,一种带有额外的参数

第一个:

public override void CalcV(IV iv)
{
     initializations
     otherOperations
     for (int i=0; i < NUM; ++i)
     {
         SomeOtherOperations
         double v = GetV(a,b,c);
         SomeOtherOperationsUsing_v
     }
     restOfOperations
}

第二个:

public override void CalcV(IV iv, int index)
{
     initializations
     otherOperations
     for (int i=0; i < NUM; ++i)
     {
         SomeOtherOperations
         double v = GetV(a,b,c, index);
         SomeOtherOperationsUsing_v
     }
     restOfOperations
}

如您所见,唯一的区别是第一个使用 3 个参数调用 GetV((,第二个调用具有 4 个参数的 GetV(( 重载。

如何最好地避免此处的代码重复?

谢谢!

如何避免此处的代码重复

假设您不知道合理的默认值,一个非常简单的方法是:

public override void CalcV(IV iv)
{
    CalcV(iv, null);
}
public override void CalcV(IV iv, int? index)
{
     ...
     double v = index.HasValue ? GetV(a,b,c,index.Value) : GetV(a,b,c);
     ...
}

如果使用的是 .Net 4.0,则可以将其设置为可选参数:

public override void CalcV(IV iv, int index = -1)
{
    ....
    double v = index > -1 ? GetV(a,b,c, index) : GetV(a,b,c);
    ....
}

猜测 GetV 的作用(您需要更改此设置以适应:

public override void CalcV(IV iv)
{
     CalcV(iv, 0);
}

public override void CalcV(IV iv, int index)
{
     initializations
     otherOperations
     for (int i=0; i < NUM; ++i)
     {
         SomeOtherOperations
         double v = GetV(a,b,c, index);
         SomeOtherOperationsUsing_v
     }
     restOfOperations
}
public override void CalcV(IV iv, int? index = null)
{
     initializations
     otherOperations
     for (int i=0; i < NUM; ++i)
     {
         SomeOtherOperations
         double v = index != null ? GetV(a,b,c, index) : GetV(a,b,c);
         SomeOtherOperationsUsing_v
     }
     restOfOperations
}

然后,您可以删除第一个覆盖,这将处理这两种情况。

我假设index是基于 0 的和正数:

public override void CalcV(IV iv, int index)
{
  initializations
  otherOperations
  for (int i=0; i < NUM; ++i)
  {
    SomeOtherOperations
    double v = index == -1 ? GetV(a, b, c) : GetV(a,b,c, index);
    SomeOtherOperationsUsing_v
  }
  restOfOperations
}

然后,调用索引为 -1 的函数,如果要使用具有三个参数的GetV,或者如果要使用四个参数调用GetV,则调用"正确"索引。

public override void CalcV(IV iv)
{
  return CalcV(iv, -1);
}