如何避免此处的代码重复
本文关键字:代码 何避免 | 更新日期: 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);
}