Шаблон проектирования для анализа данных двоичного файла и хранения в базе данных - PullRequest
6 голосов
/ 15 августа 2008

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

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

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

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

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

Ответы [ 4 ]

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

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

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

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

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

4 голосов
/ 24 августа 2008

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

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

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

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

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

1 голос
/ 26 сентября 2008

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

1 голос
/ 15 августа 2008

Возможно, вам нужен шаблон стратегии. Стратегия - алгоритм разбора файла.

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

...