Есть ли лучший дизайн шаблон / метод для использования? - PullRequest
4 голосов
/ 15 января 2010

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

Для этого я создал отдельный класс для каждой структуры XML, в результате чего появилось большое количество классов (~ 75). Каждый класс знал, как читать свою связанную таблицу и сериализовать себя в XML с помощью стороннего инструмента. В конце концов система работала очень хорошо (по времени и по бюджету), и ошибки вывода были чрезвычайно легко найти.

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

Ответы [ 3 ]

7 голосов
/ 15 января 2010

Вы описываете классическое применение шаблона Visitor . Вам необходимо выполнить две задачи для обхода вашей объектной модели: один раз вывести XML, а другой раз двоичные данные. Это хорошо объяснено в банде четырех книг .

Каждый элемент вашей модели должен принимать посетителя распознанного типа (обычно IVisitor), а затем он вызывает метод, обычно вызываемый AcceptVisitor для этого посетителя. Это метод, который переводит объект в XML, двоичные данные, формат для печати или любой другой. Затем он может также направить посетителя на дочерние объекты и так далее. Затем вы пишете XmlVisitor, который реализует IVisitor, и «посещаете» вашу структуру вместе с ним - в результате получается XML. Аналогично, вы можете «посетить» с помощью BinaryVisitor и получить двоичный вывод.

2 голосов
/ 15 января 2010

Создайте Генератор - если возможно - который автоматизирует генерацию классов.

Генератор, конечно же, может питаться языком спецификаций, который определяет, как данные хранятся в базе данных.

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

Еще лучше (в смысле эффективности разработки - не в смысле обучения / шаблонного обучения): используйте уже существующий генератор (открытый или коммерческий).

Edit: Есть несколько библиотек / фреймворков, которые должны выполнять именно такую ​​работу. Вы пользуетесь библиотекой, как я уже читал, но она кажется слишком многим. Существуют уровни / структуры постоянства для записи данных ОО из / в базу данных. Данные XML - это не что иное, как объектно-ориентированное представление. Возможно, вам нужно написать слой для достижения полной цели, но использование стороннего продукта может быть полезным (во многих случаях).

1 голос
/ 15 января 2010

Другая идея, которая также может подходить:

Когда производительность не является проблемой, могут также использоваться общие контейнеры данных. Универсальный контейнер данных может принимать спецификацию одного узла (например, узла XML, объекта или даже записи таблицы) и просто хранить такой контейнер.

Таким образом, ~ 75 классов могут быть заменены одним или несколькими. Такие услуги, как сериализация, также могут предоставляться в общем виде.

Таким образом, разные экземпляры могут играть роль, которую до сих пор играют разные классы.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...