Должен ли мой класс иметь метод для каждого формата файла или я должен делегировать ввод-вывод другим классам, относящимся к формату файла?

В данном домене может быть несколько форматов файлов, представляющих похожие объекты или структуры. Например, объект типа 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 ответ

Учитывая, что каждый тип файла может быть проанализирован с совершенно другой библиотекой и логикой, я бы предпочел второй метод (отдельные классы).

Я бы использовал метод "loadFromXXX" только для поддержки аргументов с разными типами данных или методами, которые будут совместно использовать большой объем кода. Например, в C++ вы можете иметь loadFromFile(std::ifstream& input) а также loadFromString(std::string& str), loadFromFile() может закончить разбор файла в строку и вызвать loadFromString или он может разбирать файл построчно и просто делиться некоторыми функциями разбора, используемыми в loadFromString,

В любом случае, похоже, что форматы файлов, которые вы перечислили, имеют очень мало общего, а некоторые (например, KML против GeoJSON) требуют совершенно других анализаторов. В результате для каждого типа файла должен быть отдельный класс "reader" или "parser". В противном случае вы вздутие живота класс Track и это будет иметь очень низкую сплоченность. Разделение проблем также может предложить разделить анализ на другой класс.

Другие вопросы по тегам