如何使用不同的参数处理相同的代码路径?

时间:2010-12-07 18:13:30

标签: c# oop code-duplication

我遇到过一种情况,试图不必修改底层源(它不是那个级别的“我的”代码;否则,我很乐意修改它),我有两个几乎完全相同的代码路径,但我正在使用不同类型的数据。

忽略你可能很容易将一个转换为另一个,类似的示例将是一个“Circle”对象。

一方面,我有一个Point物体和一个半径。另一方面,我有一个Circle对象。这两个都可以描述相同的实际圆,但我不能将一个转换为另一个。

然后,在我的代码中,我有:

void Run(Circle circle)
{
    if(AllNegative(circle))
    {
        // ...
        // Do unrelated stuff
        // ...
        ColorCircle(circle);
        // ...
    }
}

void Run(Point pt, uint radius)
{
    if(AllNegative(pt, radius))
    {
        // ...
        // Do unrelated stuff
        // ...
        ColorCircle(pt, radius);
        // ...
    }
}

bool AllNegative(Circle circle) { return (circle.AllNegative); }
bool AllNegative(Point pt, uint radius) { return ((pt.X + radius) < 0) && ((pt.Y + radius) < 0); }

void ColorCircle(Circle circle) { /* ... */ }
void ColorCircle(Point pt, uint radius) { /* ... */ }

当然,我在Run中的代码多于此示例中的代码。

如何将Run合并到一个函数中以最大限度地减少代码重复?

4 个答案:

答案 0 :(得分:1)

泛型的一个例子:

public interface ICircle
{
    Point Point{get;}
    uint Radius{get;}
    ... add whatever you need
}

public class MyCircle: ICircle
{
   private Circle _circle;
   ... implement interface
}

public class MyCircle2: ICircle
{
   private Point _point;
   private uint _radius;
   ... implement interface
}

void Run<T>(T circle) where T: ICircle
{
    if(AllNegative(circle))
    {
        ColorCircle(circle);
    }
}

答案 1 :(得分:1)

在这种情况下,您可以采取两种方式:

  1. 您可以像现在一样保留它 - 重载方法。
  2. 将重复的代码移动到新方法。如果在unrelated部分中计算圆的直径(是否为真实),请创建方法calcDiameter(radius)
  3. 在这种情况下,重复代码没有任何错误,如果只有几行真的没有使新方法成为现实。

答案 2 :(得分:0)

至少,您可以使用单独的方法执行unrelated stuff并从每个Run调用它。

答案 3 :(得分:0)

您可以为它们创建一个公共接口,如下所示:

public interface IMyShape
{
    public bool IsNegative();
    public void Color();
}

然后你只需要一个接受IMyShape引用的方法:

void Run(IMyShape shape)
{
    if(shape.AllNegative())
    {
        // ...
        // Do unrelated stuff
        // ...
        shape.Color();
        // ...
    }
}