0

让我们以 GPS 和地理 (GIS) 实体领域为例。

我们将有意义的地理实体(点、路径、区域)建模为任何所需编程语言中的类,这些类将是这些实体的概念性、“无实现”表示。

另一方面,有很多文件格式可以保存这些功能,它们或多或少具有相同的含义。在 GPS 领域中,最常见的文件格式是 GPX、KML、ShapeFile、WellKnownText 等。

那么,假设我想创建一个GpsFeatureCollection包含Points属性、属性等的类Paths。另外,我会实现像GpsReader, KmlReader, ShapeFileReader(以及它们各自Writer的 s)等类。

问题是:

这是 OOAD 中的最佳实践:

  1. 有一个GpsFeatureCollection实例化一个FileFormat(Reader/Writer)类?
  2. 有一个GpsFeatureCollection实现Read/WriteFromFormat方法而不是类?
  3. 让每个文件格式阅读器实例化一个空GpsFeatureCollection的,用从文件中读取的数据填充它,然后将填充的对象作为返回值传递?
  4. 有一个中介类来避免和之间的任何FileFormatClass依赖ObjectModelClass
  5. 以上都不是?
  6. “这得看情况...”

我真的对做“正确的事”很感兴趣。我的近期计划是使用 Python,但很可能这对其他语言也很重要。这在我目前的宠物项目中造成了一些“分析瘫痪”......

4

1 回答 1

1

这是我的看法,我将读取器和写入器实例传递给read()方法write(),这似乎实现了良好的解耦水平,并且提供了选择各种读取器和写入器的灵活性。

代码使用类似 Java 的语法

声明一个Reader接口,我们将假设多个实现,例如KMLReaderShapeFileReader

interface Reader {
   GpsFeatureCollection read();
}

声明一个Writer接口,我们将假设多个实现,例如KMLWriterShapeFileWriter

interface Writer {
   void write(GpsFeatureCollection c);
}

让我们将GpsFeatureCollection类声明为具有接受相应接口作为参数来执行工作的方法readwrite

class GpsFeatureCollection {

    ...

    public static GpsFeatureCollection read(Reader r) {
       return r.read();
    } 

    public static void write(Writer w) { 
        w.write(this);
    }

}

使用不同读取器和写入器的一些使用示例。

// Reading data
GpsFeaureCollection data = GpsFeatureCollection.read(new ShapeFileReader("/tmp/shapefile"));

// Writing data
data.write(new KMLWriter("/tmp/kmlfile"));
于 2013-07-14T13:09:39.423 回答