使用具有重叠类的多个库时的最佳实践

时间:2009-02-19 23:47:11

标签: oop

考虑任务:

  1. 使用库A
  2. 从KML文件中读取多边形
  3. 使用库B
  4. 将其与另一个多边形相交
  5. 使用库C
  6. 计算其面积

    每个库都有自己的Polygon类,它们都是等价的。使用所有这些类时,哪种方法最佳?在我第一次写这个问题时,我已经实现了一个将PolygonA实例转换为PolygonB实例的方法,反之亦然。但我想知道这是否是唯一的方法。

    澄清所有图书馆都是第三方

4 个答案:

答案 0 :(得分:1)

我要么选择一个多边形类,只使用该类或构建我自己的Polygon类来存储它们。

无论如何,请确保您的命名空间被恰当地命名,以便您可以区分这两者。

为什么不合并重复的功能?

答案 1 :(得分:1)

我们想到的一个选项是使用复制构造函数定义自己的多边形类,复制构造函数接受其上的其他类型和方法,以便从其数据中创建其他类型的实例。

public class MyPolygon
{
    public MyPolygon(LibAPolygon polygon) { /* copy data */ }
    public LibAPolygon CopyToLibAPolygon() { ... }
    // repeat for each library
}

与你拥有的方法相比,它并没有提供太多优势。但是,我更喜欢它,因为它标准化了多边形的一个定义,然后根据需要转换为其他定义。或者,只需选择一个现有的实现作为基础,然后编写方法在它和其他两个之间进行。

答案 2 :(得分:1)

理想的解决方案很大程度上取决于您的需求,但这是一个建议。

编写自己的Polygon类,在内部将多边形存储为PolygonA / PolygonB / PolygonC之一。您的Polygon类将实现getArea()和getIntersection(polygon2)方法,这些方法将内部多边形转换为适当的类型并调出到正确的库。

这会抽象出您自己的Polygon接口背后的库和多边形表示,这只需要实现您实际需要的API部分。这将允许您隐藏实现细节,例如您实现的翻译数量(仅4 - PolygonA-> PolygonB-> PolygonC-> PolygonA?或全部6?)以及如何存储多边形(选择其中一个库类型?使用您自己的表示形式?将其存储在多个表示中以避免转换开销?)

答案 3 :(得分:1)

如果相关库没有提供任何适配器接口,则编写转换通常是唯一的方法。您自己制作的任何适配器最终都必须转换为库的本机表示,以对几何体执行任何算法。

另一种选择是创建一个包装类来缓存每个不同的A / B / C表示,这样您只需要为每个几何体转换一次给定的库。然后你的所有代码只处理包装类,只是将适当的表示传递给任何相关的算法。翻译可以在实际需要之前及时执行。

如果你正在使用typedef和/或nampespaces的语言,为每个库的多边形类型创建自己的typedef可以让你的生活更轻松。例如,如果每个库只有一个名为“Polygon”的多边形类型,但它被放置在特定的命名空间中,然后:

typedef A::Polygon APolygon;
typedef B::Polygon BPolygon;
typedef C::Polygon CPolygon;

如果库实际上存在命名冲突,那么这是一个真正的问题。