1

在给定的域中,可以有多种文件格式表示相似的对象或结构。例如,一个类型的对象Track(意味着一系列地理点)可以保存为 .GPX、.KML、GeoJSON、WKT、ShapeFile 等。

所以,我的班级Track应该从文件中读取和保存它的数据,这些文件可以是不同的格式。

问题是:

我的类应该实现从每种文件类型读取的方法(即“了解”它们),还是应该使用其他类,其中每个类都包含与每种文件类型的实现细节进行交互的逻辑?标准做法是什么?

第一个选项的编码如下:

trackCollection.Add(Track.loadFromGPX(gpx_fname))
trackCollection.Add(Track.loadfromKML(kml_fname))
# ...and so on with other filetypes

而第二种选择可能是:

trackCollection.Add(GpxReader.getTrack(gpx_fname))
trackCollection.Add(KmlReader.getTrack(kml_fname))

在我看来,涉及单一职责原则、信息隐藏和类之间的相互依赖的某些特征可能会使一种方法比另一种方法更好,但我没有足够的经验来确定哪一种方法(如果有的话)。

4

1 回答 1

2

考虑到每种文件类型可能需要使用完全不同的库和逻辑进行解析,我当然更喜欢第二种方法(单独的类)。

我只会使用“loadFromXXX”方法来支持具有不同数据类型的参数或共享大量代码的方法。例如,在 C++ 中,您可能有loadFromFile(std::ifstream& input)loadFromString(std::string& str). loadFromFile()最终可能会将文件解析为字符串并调用loadFromString,或者它可能会逐行解析文件并仅共享loadFromString.

无论如何,您列出的文件格式似乎几乎没有共同点,有些(例如 KML 与 GeoJSON)需要完全不同的解析器。因此,每种文件类型都应该有一个单独的“阅读器”或“解析器”类。否则你是臃肿类Track,它的凝聚力会很低。关注点分离还建议您将解析拆分为另一个类。

于 2014-04-26T02:08:30.983 回答