2015-03-12 5 views
0

Я в основном должен сделать программу, которая будет генерировать PDF. PDF будет иметь 3 разных типа страниц: лист передней обложки, общий лист и последний титульный лист. Заголовок содержит достаточное количество информации, но заголовок лицевой обложки и общий лист отличаются только на 1 элемент, однако, что один элемент требует от меня сдвинуть остальные в координатах. У меня есть фотография, чтобы показать, что я имею в виду.Дизайн иерархии классов для создания PDF

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

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

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

The general IDea

+1

Ваш вопрос вводит в заблуждение, поскольку вы рассуждаете на уровне абстракции, который фактически не касается формата PDF (он может соответствовать любому файлу в формате paged). –

+0

Куда это меня покидает? – user3577756

ответ

1

передний лист, общие листы и задний лист имеют в общем, что они ARE листов. Поэтому хороший кандидат для иерархии классов будет:

class sheet { .... }; 
class front_sheet : public sheet { ...}; 
class back_sheet : public sheet { ...}; 
class general_sheet : public sheet { ...}; 

В sheet, вы должны поместить все общие элементы, и, конечно, общее поведение (например, print(), save(), get_size() ...).

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

class sheet { 
public: 
    virtual void get_position (int item_no, int& x, int&y) { x=5; y=14*item_no; } 
    ... 
}; 

class back_sheet : public sheet { 
public: 
    void get_position (int item_no, int& x, int&y) { x=5; y = (item==5 ? 14:0); } 
    ... 
}; 

Как наследование действительно соответствует «есть-» отношения, вы будете иметь получить очень прочную конструкцию.

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

  • можно управлять элементами в контейнере (например, векторы): это проще организовать свой выход в петлях вместо копирования вставки подобных строк коды для каждого элемента
  • вы должны спросить если элементы могут иметь подэлементы (например, регион может содержать несколько подрегионов, например, макет печати с полем и поля в поле).В этом случае я рекомендовал бы использовать composite pattern

Edit; После того, как думали о содержании, это может быть стоит возвращаться снова к листам, и спросите себя, насколько сильно отличается их поведение на самом деле:

  • они не имеют различное поведение thorughout их жизненного цикла (другой способ получения данных для генерации PDF или для динамического использования макета? В этом случае иерархия классов будет в порядке.
  • или, получив динамическую структуру, такую ​​как предложенная выше, получается, что единственная разница заключается в том, как вы создаете/построить их? В этом случае было бы целесообразно оставить только один класс листа, но иметь три конструкционных «двигателя», используя либо prototype pattern, либо builder pattern , Это, однако, будет значительным сдвигом в архитектуре вашего приложения.
+0

Я рассматривал возможность использования композитных, и я вроде как сделал это в своем текущем проекте. Я обновлю, как только у меня будет возможность снова взглянуть на него завтра. – user3577756

+0

@ пользователь3577756 ok! Когда вы смотрите в этом направлении, я добавил редактирование с еще несколькими мыслями. – Christophe

+1

Извините за поздний ответ. Это то, что мне нужно было начать. – user3577756

 Смежные вопросы

  • Нет связанных вопросов^_^