我遇到过一种情况,试图不必修改底层源(它不是那个级别的“我的”代码;否则,我很乐意修改它),我有两个几乎完全相同的代码路径,但我正在使用不同类型的数据。
忽略你可能很容易将一个转换为另一个,类似的示例将是一个“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
合并到一个函数中以最大限度地减少代码重复?
答案 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)
在这种情况下,您可以采取两种方式:
unrelated
部分中计算圆的直径(是否为真实),请创建方法calcDiameter(radius)
。在这种情况下,重复代码没有任何错误,如果只有几行真的没有使新方法成为现实。
答案 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();
// ...
}
}