0

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

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

一方面,我有一个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

4 回答 4

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);
    }
}
于 2010-12-07T18:21:37.437 回答
1

在这种情况下,您可以采取两种途径:

  1. 您可以像现在一样保留它 - 重载方法。
  2. 将重复的代码移至新方法。如果在您的unrelated部分中计算圆的直径(无论是否真实),请创建一个方法calcDiameter(radius)

在这种情况下,重复代码本身并没有什么错,如果只是几行代码并不能真正使新方法实用的话。

于 2010-12-07T18:21:41.593 回答
0

至少,您可以unrelated stuff在单独的方法中执行您的操作并从每个Run.

于 2010-12-07T18:20:58.773 回答
0

您可以为它们创建一个看起来像这样的通用接口:

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

那么您只需要一种接受 IMyShape 引用的方法:

void Run(IMyShape shape)
{
    if(shape.AllNegative())
    {
        // ...
        // Do unrelated stuff
        // ...
        shape.Color();
        // ...
    }
}
于 2010-12-07T18:56:05.317 回答