作为一个例子,让我们考虑GPS和地理(GIS)实体的领域。
我们会将有意义的地理实体(点,路径,区域)建模为任何所需编程语言中的类,这些类将是这些实体的概念性“无实现”表示。
另一方面,有很多文件格式可以保存这些功能,或多或少具有相同的含义。在GPS领域,最常见的文件格式是GPX,KML,ShapeFile,WellKnownText等。
假设我想创建一个GpsFeatureCollection
类,它包含Points
属性,Paths
属性,等等。另外,我会实现GpsReader
,KmlReader
,ShapeFileReader
(及其各自的Writer
s)等类。
问题是:
这是OOAD的最佳做法:
GpsFeatureCollection
来实例化FileFormat(Reader/Writer)
班级?GpsFeatureCollection
来实现Read/WriteFromFormat
方法而不是类吗?GpsFeatureCollection
,用从文件中读取的数据填充它,然后将填充的对象作为返回值传递?FileFormatClass
和ObjectModelClass
之间存在任何依赖关系?我真的很想做“正确的事”。我的直接计划是使用Python,但很可能这对其他语言也很重要。这导致我的宠物项目目前出现了一些“分析瘫痪”......
答案 0 :(得分:1)
这是我的看法,其中我将读者和作者实例传递给read()
和write()
方法,这似乎达到了良好的解耦水平,并且提供了选择各种读者和作者的灵活性。
代码使用类似Java的语法
声明一个Reader
接口,我们将假设多个实现KMLReader
,
ShapeFileReader
等等
interface Reader {
GpsFeatureCollection read();
}
声明Writer
接口,我们将假设多个实施,例如KMLWriter
,ShapeFileWriter
等
interface Writer {
void write(GpsFeatureCollection c);
}
让我们声明GpsFeatureCollection
类具有read
和write
方法,这些方法接受各自的接口作为执行作业的参数。
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"));