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