Определение формата файла. Независимо от формата сценарий загрузки должен оставаться неизменным. Каждый формат уникален, поэтому невозможно создать единый подход для чтения всех возможных форматов представления данных. Следовательно, каждый формат необходимо реализовывать отдельно. Это крайне усложняет не только всю систему, но и возможность добавления новых форматов. Фактически в системе должны присутствовать несколько загрузчиков, каждый из которых предназначен для загрузки определенного формата в соответствии с его структурой данных.
Так как форматов очень много, то система должна сама определять к какому именно формату относится тот или иной файл. Пользователь в свою очередь будет должен только выбрать загружаемый файл. После чего начинает работу соответствующий загрузчик. Для определения формата в каждом загрузчике должен быть реализован метод проверки некоторого файла на принадлежность данному формату.
Возможны случаи, когда один и тот же файл может быть корректно прочитан несколькими загрузчиками. Иногда даже совпадает расширение файлов у различных форматов. В этом случае, нельзя однозначно сказать к какому формату относится файл, и каким загрузчиком следует воспользоваться. Если формат определен не однозначно, то пользователю предоставляется список возможных для загрузки форматов.
Также должна быть возможность выбора нескольких файлов для последующей их загрузки. При этом пользователю будет представлен список выбранных файлов для загрузки. Для каждого файла будет отображаться название формата и однозначность его определения.
Однозначность может быть представлена тремя способами:
Формат однозначно определен – подходит только один загрузчик;
Абстрактный уровень. Так как сценарий загрузки будет постоянным для всех форматов, и все загрузчики должны иметь некоторые обязательные составляющие (например, проверка файла на принадлежность формату), то можно спроектировать основную часть загрузки на абстрактном уровне.
В первую очередь абстрактно можно описать класс DataFile – класс файла данных, использующийся непосредственно для чтения файла и сохранения данных в некоторой внутренней структуре. Внутренняя структура данных должна отображать структуру в соответствующем формате.
Так как каждый экземпляр наследника класса DataFile должен быть прикреплен к некоторому файлу, то его инициализация должна происходить с привязкой к загружаемому файлу. Невозможно существование в системе экземпляра наследника класса DataFile, незнающего с каким файлом ему работать, так как это потенциально может вызывать ошибки.
Также необходим некоторый метод чтения данных, который будет запускать механизм заполнения внутренней структуры DataFile данными из файла. При чтении файла возможны незначительные ошибки, информация о которых впоследствии может быть предоставлена пользователю. Для такого случая DataFile должен позволять хранить список ошибок.
Помимо DataFileдолжен еще присутствовать абстрактный класс загрузчика – FileLoader. Все загрузчики будут реализованы путем создания классов наследников FileLoader. У всех загрузчиком будет метод DetectFormat, который и будет проверять принадлежность файла к формату соответствующего загрузчика. Так как в данном методе проверяется конкретный файл, то путь к нему должен посылаться в этот метод. Самым важным в классе FileLoader будет метод LoadData, так как он будет запускать загрузку данных из файла в приложение сжатия, и преобразовывать данные в тот вид, в котором они уже могут быть использованы далее.
Так как загрузка некоторых форматов может происходить пошагово, то каждый такой шаг будет отображен, как диалог. Работа с этими диалогами будет очень похожей, поэтому их тоже можно описать на более абстрактном уровне.
Пользователь должен иметь возможность выбора загружаемой информации, так как не все может быть нужно для интерпретации.