Каков наилучший шаблон проектирования для регистрации данных «порций»? - PullRequest
0 голосов
/ 17 августа 2011

У меня есть библиотека, которая может сохранять / загружать на диск "chunks", которые являются структурами POD с постоянным размером и уникальным статическим полем CHUNK_ID.Таким образом, загрузка выглядит примерно так:

void Load(int docId, char* ptr, int type, size_t& size)...

Если вы хотите добавить новый блок, вы просто добавляете struct с новым CHUNK_ID и используете для этого функции Save Load.

То, что я хочу, это форсироватьвсе «чанки» должны иметь такие функции, как PrintHumanReadable, CompareThisTypeOfChunk и т. д. (в идеале программа не должна компилироваться без таких функций).Также я хочу отметить / зарегистрировать / перечислить все структурные элементы.

У меня есть несколько идей, но у всех есть проблемы.

  1. Создание базового класса с чисто виртуальными функциями PrintHumanReadable,CompareThisTypeOfChunk.Проблема: нарушает тип модуля и требует переписывания библиотеки.
  2. Реализация фабрики, которая создает структуру чанка из CHUNK_ID.Проблема: компилируется, когда я добавляю новый чанк без необходимых функций.

Не могли бы вы порекомендовать элегантное дизайнерское решение для моей проблемы?

Ответы [ 2 ]

2 голосов
/ 17 августа 2011

Реализация простого генератора кода. Вы можете использовать что-то вроде Mako или Cheetah (обе библиотеки Python). Создайте текстовый файл, содержащий все имена классов, затем попросите генератор построить метод фабрики и серию методов, которые на самом деле не используются, но которые ссылаются на нужные методы во всех классах. Это также упростит перечисление классов (опять же, используя сгенерированный код).

1 голос
/ 17 августа 2011

Правильный шаблон проектирования для этого называется «use Boost.Serialization ». Это действительно лучший инструмент для записи объектов в формат и последующего их чтения. Он может писать в текстовом, двоичном и даже XML-форматах (и других, если вы пишете правильный поток для них). Это может быть ненавязчивым, поэтому вам не нужно изменять объекты для их сериализации. И пр.

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

Если вы не можете / не будете использовать Boost.Serialization, то вы в значительной степени застряли с решением для выполнения. А поскольку решение - это время выполнения, а не время компиляции, во время компиляции невозможно гарантировать, что какой-либо конкретный идентификатор блока имеет необходимые функции.

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