我的类应该为每种文件格式设置方法,还是应该将I / O委托给其他特定于文件格式的类?

时间:2014-04-26 01:00:57

标签: oop language-agnostic dependencies loose-coupling cohesion

在给定域中,可以存在表示类似对象或结构的多种文件格式。例如,类型为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))

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

1 个答案:

答案 0 :(得分:2)

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

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

在任何情况下,您列出的文件格式似乎都很少见,而某些(例如KML与GeoJSON)需要完全不同的解析器。因此,每种文件类型都应该有一个单独的“reader”或“parser”类。否则你会使班级Track膨胀,它的凝聚力会非常低。关注点分离也会建议您将解析拆分为另一个类。