2008-08-14 1 views
6

Кто-нибудь рекомендует шаблон проектирования для взятия файла двоичных данных, разбора его частей на объекты и хранения результирующих данных в базе данных?Шаблон проектирования для разбора двоичных данных файла и хранения в базе данных

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

Обычным структура данных будет включать в себя:

(заголовок) (DataElement1) (DataElement1SubData1) (DataElement1SubData2) (DataElement2) (DataElement2SubData1) (DataElement2SubData2) (EOF)

Я думаю, хороший дизайн будет включать в себя способ изменения определения синтаксического анализа на основе типа файла или некоторых определенных метаданных, включенных в заголовок. Таким образом, Factory Pattern будет частью общего дизайна для части Parser.

ответ

21
  1. Просто напишите ваш файл парсер, используя любые методы приходят на ум
  2. Написать множество тестов для того, чтобы убедиться, что все крайние случаи покрыты

После того, как вы сделали это, вы действительно будете иметь разумное представление о проблеме/решении.

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

Этап 3: Рефлятор беспощадно. Ваша цель должна состоять в том, чтобы удалить примерно половину вашего кода.

Вы обнаружите, что ваш код в конце будет либо напоминать существующий шаблон дизайна, либо вы создали новый. Тогда вы сможете ответить на этот вопрос :-)

1

Шаблон стратегии, возможно, вы хотите посмотреть. Стратегия - алгоритм анализа файлов.

Затем вам нужна отдельная стратегия для вставки базы данных.

4

Я полностью согласен с Орион Эдвардс, и, как правило, я подхожу к проблеме; но в последнее время я начинаю видеть некоторые образцы (!) безумия.

Для более сложных задач, я обычно использую что-то вроде interpreter (или strategy), который использует некоторые builder (или factory) для создания каждой части данных.

Для потоковой передачи данных весь анализатор будет выглядеть примерно как adapter, адаптируясь от объекта потока к потоку объектов (который обычно представляет собой просто очередь).

Для вашего примера, вероятно, будет один строитель для полной структуры данных (от головы до EOF), который внутренне использует сборщики для внутренних элементов данных (подаваемых интерпретатором). Как только EOF встречается, объект будет излучаться.

Однако объекты, созданные в инструкции switch в некоторых заводских функциях, вероятно, являются самым простым способом для многих меньших задач.Кроме того, мне нравится сохранять мои объекты данных неизменными, так как вы никогда не знаете, когда кто-то сталкивает параллелизм с вашим горлом :)

1

Используйте Lex и YACC. Если вы не посвящаете следующие десять лет исключительно этому предмету, они будут производить лучший и быстрый код каждый раз.