OOAD - 文件格式读取器类与对象模型类:哪个应该取决于哪个?

时间:2013-07-12 01:22:53

标签: file-io language-agnostic dependencies ooad

作为一个例子,让我们考虑GPS和地理(GIS)实体的领域。

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

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

假设我想创建一个GpsFeatureCollection类,它包含Points属性,Paths属性,等等。另外,我会实现GpsReaderKmlReaderShapeFileReader(及其各自的Writer s)等类。

问题是:

这是OOAD的最佳做法:

  1. 是否有GpsFeatureCollection来实例化FileFormat(Reader/Writer)班级?
  2. 有一个GpsFeatureCollection来实现Read/WriteFromFormat方法而不是类吗?
  3. 让每个文件格式阅读器实例化一个空的GpsFeatureCollection,用从文件中读取的数据填充它,然后将填充的对象作为返回值传递?
  4. 有一个中介班,以避免FileFormatClassObjectModelClass之间存在任何依赖关系?
  5. 以上都不是?
  6. “嗯,这取决于......”
  7. 我真的很想做“正确的事”。我的直接计划是使用Python,但很可能这对其他语言也很重要。这导致我的宠物项目目前出现了一些“分析瘫痪”......

1 个答案:

答案 0 :(得分: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"));