【问题标题】:OOAD - File-Format-Reader class vs Object-Model class: which should depend on which?OOAD - 文件格式读取器类与对象模型类:哪个应该取决于哪个?
【发布时间】:2013-07-12 01:22:53
【问题描述】:

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

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

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

然后,假设我想创建一个 GpsFeatureCollection 类,该类将包含 Points 属性、Paths 属性等。另外,我会实现GpsReaderKmlReaderShapeFileReader(以及它们各自的Writers)等类。

问题是:

OOAD 的最佳实践是:

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

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

【问题讨论】:

    标签: file-io language-agnostic dependencies ooad


    【解决方案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"));
    

    【讨论】:

    • 这是纯金!非常感谢你。作为唯一的建议,我将命名接口 IReader 和 IWriter(但不是 IGpsFeatureCollectionReader 等:P)。再次感谢!
    • 很高兴您喜欢它。 Java 人不使用前缀“I”作为接口,但我不介意是否有人使用它,只要它一直被使用。
    • 附带说明(现在我吃过午饭,我的大脑又开始工作了),另一种可能的设计是有一个GpxFormat 类,带有readwrite公共接口使用的方法。然后,同一个类可以实现许多样板/规范特定的代码,这些代码很可能会被 IO 方法重用,而FileFormat 类将只是作为参数传递给任一方法的文件处理程序。跨度>
    猜你喜欢
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    相关资源
    最近更新 更多