【发布时间】:2010-12-07 18:13:29
【问题描述】:
我遇到过这样一种情况,即我试图不必修改底层源代码(在那个级别它不是真正的“我的”代码;否则,我很想修改它),我有两个几乎相同的代码路径,但我使用的是不同类型的数据。
忽略您可能很容易将一个转换为另一个,类似的示例将是一个“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 合并到一个函数中以尽量减少代码重复?
【问题讨论】:
-
为什么不能在点/半径和圆之间转换?是什么阻止了你?
-
@Jon Skeet:
Circle类是工厂类;我不能只实例化我自己的Circle对象。 -
并且没有工厂方法可以创建相关的圈子?你不能从圆中得到一个点和一个半径?
标签: c# oop code-duplication