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

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

Мне кажется, что некоторые характеристики, включающие принцип единой ответственности, сокрытие информации и взаимозависимость между классами, могут сделать один подход лучше другого, но у меня недостаточно опыта, чтобы понять, какой из них, если вообще есть.


person heltonbiker    schedule 26.04.2014    source источник


Ответы (1)


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

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

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

person Daniel    schedule 26.04.2014